1.使用模块

bs4
requests

2.实现思路

首先通过requests库的get方法获取对应url地址的Response对象,然后得到content(字节类型信息),解码,并编码为utf-8,再通过bs转换为lxml类型,分析具体的样式,定位到目标图片所在标签,得到图片的src和标题,最后下载妹子图片并保存到本地

3.主要接口

1.获取妹子图片下载地址和标题

这里主要有两点要考虑:
1.网页的编码问题
2.怎么定位到妹子图片

对于第1点,如果网站编码格式为utf-8,则不需要考虑,如果不是,则需要解码。比如我爬取的https://pic.netbian.com/4kmeinv/这个地址,格式为GBK编码。怎么查看对应网站的编码呢,点击F12,然后输入document.charset即可看到,如下图所示。
python爬虫抓取妹子图片_爬虫
对于第2点,同样先F12进入开发者模式,然后点击红框标记的图标,放到妹子图片上,即可看到对应的样式,分析发现所有妹子的图片都在li标签里面,并且遵循li a img 的规律,所以这时候可以通过bs4的select函数定位到img标签,获取的是一个list,然后得到里面的src和alt,分别对应下载资源和标题。将鼠标悬停在src,即可看到实际的下载地址,一般是网站主域名+图片src

python爬虫抓取妹子图片_爬虫_02
代码实现:

def imagespider(url):
    global headers
    try:
        urls = []
        r = requests.get(url, headers=headers)
        #由于某些网站编码不一定是utf-8,需要译码
        r.content.decode('GBK')
        r.encoding = 'utf-8'
        soup = BeautifulSoup(r.content, 'lxml')
        lis = soup.select("li a img")
        for li in lis:
            try:
                img = li['src']
                name = li['alt']
                url1 = 'https://' + 'pic.netbian.com/' + img
                if url1 not in urls:
                    download(url1, name)

            except Exception as err:
                print(err)
    except:
        return ''

2.根据地址和标题,下载图片,并保存到本地
利用requests,根据图片资源,得到content,然后写入磁盘即可
实现代码:

def download(url1, name ):
    global count
    count = count + 1
    r = requests.get(url1, timeout=100)
    data = r.content
    with open("F:/crawling/girl/" + str(count) + '.' + str(name) + '.jpg', 'wb') as f:
        f.write(data)
    print('已打印第{}张图片'.format(count))

3.主函数
首先通过headers模拟浏览器访问,headers怎么获取?
打开任何一个网页,比如百度,F12,然后刷新一下,随便点击左边一个请求,即可找到User-Agent键值对,就是我们需要的headers。
python爬虫抓取妹子图片_爬虫_03
然后分析美女图片每一页的url变化,发现只有一个数字在变,所以我们可以通过一个循环,获取所有页面的url。
实现代码:

if __name__ == '__main__':
    t_start = time.time()
    #获取用户代理,模仿浏览器访问
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'}
    count = 0
    for i in range(1, 9):
        url = 'https://' + 'pic.netbian.com/4kmeinv/index_' + str(i) + '.html'
        imagespider(url)
    t_end = time.time()
    print('the normal way take %s s' % (t_end - t_start))

4.最终效果

python爬虫抓取妹子图片_python_04