今天给大家分享一篇利用python爬取美女图片的文章

环境准备

开发环境:Windows 7

开发工具:Pycharm

python版本:python3.7

第三方库:requests,Beautifulsoup

网站源码分析

首先在chrome浏览器中打开帅啊网里面的美女类别下的网址:http://www.shuaia.net/meinv/,打开后会看到各种类型的美女,随便选择一个类别点进去后是一个包含了多张美女图片的详情页面,那么我们最终要爬取的就是美女详情下面的所有的美女图片。

那么当我们随便点击一个美女类别时,会跳转到另外一个详情页面,做过web开发的朋友应该都知道,这种一般都是通过超链接来实现的,在html代码里对应的也就是a标签。接下来我们就需要找到这些a标签,然后模拟浏览器请求这些链接并获取链接详情页面中的美女图片。

再回到网站的美女列表页,随便选择一个类别然后右键单击检查,这时浏览器会打开一个html源码的窗口,并且自动定位到你所选类别的html代码,通过分析我们会发现每个类别都会由一个a标签包裹,并且每个标签都有个共同的属性,就是每个标签都有一个的class类且值都为“item-img”,这样我们就可以通过定位到class=“item-img”的a标签来找到所有类别的链接地址了。

同理,我们进入到美女的详情页面,通过同样的方式会发现每张图片都有由一个img标签组成,只要我们找到所有的img标签即可,但是后面真正操作起来会发现如果只是通过img标签来过滤的话,一些我们不需要的图片也会被爬取下来,这时我们就需要去分析我们要下载的图片有哪些共同的特性,然后用这些共同的特性再进行过滤,把不需要的图片过滤掉。如果从img本身找不到不同的地方,那么可以尝试着从img标签的上一层或再上一层标签进行分析,直到能够找到不同为止。

关键代码及思路解析

  1. 首先我们通过第三方requests库去请求美女列表的地址:http://www.shuaia.net/meinv/,然后将请求回来的源码发送给BeautifulSoup,通过buautifulsoup的findall方法找到所有的class=“item-img”的a标签并保存的一个变量中
    req = requests.get("http://www.shuaia.net/meinv/")
    bs = BeautifulSoup(req.text,'lxml')
    target_urls = bs.find_all('a',class_'item-img') 
    

     

  2.  循环遍历并请求爬下来的url地址,这时也就是跳转到详情页的那步。通过分析会发现每张图片都是一个img标签,那么刚刚上面说过如果只通过img标签去过滤的话可能或抓取出一些我们并不想要的图片,所以这里取得是img标签的父父级p标签,因为它们都有一个共同的属性:class=“ql-align-center”,而其它不需要的图片没有这个属性,这样我们就可以只过滤出我们想要的图片了。

    for url in target_a:
        req1 = requests.get(url.get('href'))
        bs1 = BeautifulSoup(req1.text,'lxml')
        img_urls = bs1.find_all('p',class_='ql-align-center')
  3. 继续遍历每个图片地址,下载图片并保存到本地文件夹中。

    for img_url in img_urls:
        resp = requests.get(img_url.a.img.get('src'))
        name = random.randint(1,100000)
        with open('images/meinv_%s' % str(name),'wb') as f:
            f.write(resp.content)

     

 完整代码

import requests
import os
import random
from bs4 import BeautifulSoup

def get_shuaia_meinv():
    
    #创建images文件夹
    if 'images' not in os.listdir():
        os.mkdir('images')

    #请求头设置,绕过网站的反爬机制
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'
    headers={'User_Agent': user_agent }
    
    #爬取1-3页的所有美女
    for index in range(1,4):
        if index == 1:
            mn_url = "http://www.shuaia.net/meinv/"
        else:
            mn_url = "http://www.shuaia.net/meinv/index_%d" % index
        
        # STEP 1 获取列表页面中的所有连接
        req = requests.get(url = mn_url,headers = headers)
        req.encoding = 'utf-8'#设置编码格式
        bs = BeautifulSoup(req.text,'lxml')
        target_urls = bs.find_all('div',class_='item-img')
        
        # STEP 2 获取详情页面中所有图片的地址
        for img_url in target_urls:
            req1 = requests.get(url = img_url.get('href'),headers = headers)
            bs1 = BeautifulSoup(req1.text,'lxml')
            img_urls = bs1.find_all('p',class_='ql-align-center')

            # STEP 3 保存图片到本地
            for url in img_urls:
                try:
                    resp = requests.get(url.a.img.get('src'),headers = headers)
                    name = random.randint(1,100000)#生成一个1到100000的随机数
                    with open('images/meinv_%s' % str(name),'wb') as f:
                        f.write(resp.content)
                        print("正在下载美女:%s" % url.a.img.get('src'))
                except Exception as e:
                    print("下载出错了。。。。")

if __name__ == '__main__':
    get_shuaia_meinv()

到此就实现了简单的图片爬虫了。

如果有任何疑问或任何错误,欢迎评论留言。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐