百度图片爬虫教程

版权声明:人工智能/机器学习/深度学习交流QQ群:811460433 , 微信公众号:程序员深度学习 https://blog.csdn.net/sinat_24143931/article/details/86571668
人工智能/机器学习/深度学习交流QQ群:964753462
也可以扫一扫下面二维码加入微信群,如果二维码失效,可以添加博主个人微信,拉你进群
微信公众号:分享人工智能最新技术、职业发展以及个人成长

本文介绍如何爬百度图片:

  • 输入想要抓取的图片的关键字, 如”苹果”, 然后输出百度图片搜索苹果的所有图片
  • 采用翻页模式进行爬取

1. 分析网页结构

http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1497491098685_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&ctd=1497491098685^00_1519X735&word=keyword

在浏览器中访问上述网址,得到如下页面:
在这里插入图片描述
可以看到, 图片是以翻页的形式展现的. 其次, 搜索词”keyword”即为网址最后的word的值. 所以, 如果你想搜什么, 就把”word=”后面的keyword改成对应的词即可, 如”苹果”
在这里插入图片描述
然后看看这个网址是不是和我们之前设想的一样(即keyword=苍老师).
复制过来一看

http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1548037639896_R&pv=&ic=0&nc=1&z=&hd=&latest=&copyright=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&ctd=1548037639898^00_1677X728&word=苹果

感觉不对劲, 我要的是”苹果”, “%E8%8B%B9%E6%9E%9C”是什么鬼?!
在这里插入图片描述
原来, 还需要一顿操作:

>>> import urllib.parse
>>> keyword="苹果"
>>> keyword=urllib.parse.quote(keyword)
>>> keyword
'%E8%8B%B9%E6%9E%9C'

现在, 就可以拼接网页了: …(一大堆) + keyword=“你想搜索的关键词”

2. 获取当前页的所有图片的链接

右键查看网页源代码之后, 发现:
在这里插入图片描述
图片的网址都是这样的格式: “objURL”:“网址”, 那就好办了, 直接用正则表达式就能解决

import re
pattern_pic = '"objURL":"(.*?)",'
# 这里的html就是网页的源代码的内容, 此处不介绍, 稍后给出
pic_list = re.findall(pattern_pic, html, re.S)  # 存储当前页的所有苹果的图片的url的列表

3. 获取当前页的下一页的链接

下一页的链接同理根据正则得出:

pattern_fanye = '<a href="(.*)" class="n">下一页</a>'
fanye_url = re.findall(pattern_fanye, html)[0]  # 下一页的链接

4. 获取所有页的图片的链接

上面已经根据当前页的url得到了当前页的所有图片的链接, 以及下一页的url.
如此, 循环下去, 即可得到每一页的所有图片的链接.

all_pic_list = []  # 存储所有翻页的所有图片的链接的列表
while 1:
    all_pic_list.extend(pic_list)
    if 循环完所有翻页:
        break

5. 下载图片

已知了图片链接, 直接下载即可

for i, pic_url in enumerate(all_pic_list):
    pic = requests.get(pic_url)
    string = str(i + 1) + '.jpg'
    with open(string, 'wb') as f:
        f.write(pic.content)

6. 完整代码

# -*- coding: utf-8 -*-
"""根据搜索词下载百度图片"""
import re
import sys
import urllib
import urllib.parse

import requests


def get_onepage_urls(onepageurl):
    """获取单个翻页的所有图片的urls+当前翻页的下一翻页的url"""
    if not onepageurl:
        print('已到最后一页, 结束')
        return [], ''
    try:
        html = requests.get(onepageurl)
        html.encoding = 'utf-8'
        html = html.text
    except Exception as e:
        print(e)
        pic_urls = []
        fanye_url = ''
        return pic_urls, fanye_url
    pic_urls = re.findall('"objURL":"(.*?)",', html, re.S)
    fanye_urls = re.findall(re.compile(r'<a href="(.*)" class="n">下一页</a>'), html, flags=0)
    fanye_url = 'http://image.baidu.com' + fanye_urls[0] if fanye_urls else ''
    return pic_urls, fanye_url


def down_pic(pic_urls):
    """给出图片链接列表, 下载所有图片"""
    for i, pic_url in enumerate(pic_urls):
        try:
            pic = requests.get(pic_url, timeout=15)
            string = str(i + 1) + '.jpg'
            with open(string, 'wb') as f:
                f.write(pic.content)
                print('成功下载第%s张图片: %s' % (str(i + 1), str(pic_url)))
        except Exception as e:
            print('下载第%s张图片时失败: %s' % (str(i + 1), str(pic_url)))
            print(e)
            continue
if __name__ == '__main__':
    keyword = '苹果'  # 关键词, 改为你想输入的词即可, 相当于在百度图片里搜索一样
    url_init_first = r'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1497491098685_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&ctd=1497491098685%5E00_1519X735&word='
    url_init = url_init_first + urllib.parse.quote(keyword, safe='/')
    all_pic_urls = []
    onepage_urls, fanye_url = get_onepage_urls(url_init)
    all_pic_urls.extend(onepage_urls)

    fanye_count = 0  # 累计翻页数
    while 1:
        onepage_urls, fanye_url = get_onepage_urls(fanye_url)
        fanye_count += 1
        # print('第页' % str(fanye_count))
        if fanye_url == '' and onepage_urls == []:
            break
        all_pic_urls.extend(onepage_urls)

    down_pic(list(set(all_pic_urls)))

7. 最后

欢迎大家扫一扫下面二维码加入微信交流群,如果二维码失效,可以添加博主个人微信,拉你进群

猜你喜欢

转载自blog.csdn.net/sinat_24143931/article/details/86571668