来自 《Python项目案例开发从入门到实战》(清华大学出版社 郑秋生 夏敏捷主编)中爬虫应用——抓取百度图片

本文爬取了搜狗图片库中的图片,相对于爬取特定网页中的图片,爬取图片库中的图片相对复杂一些,复杂的原因主要在于图片的动态加载上。

图片库中的图片太多,所以访问网页的时候不是一次性把图片全部加载出来,而是根据鼠标滚轮的行为进行动态加载。这会导致和之前的抓取特定网页中的图片有所区别,主要就是没办法通过之前查看网页源代码的方法直接得到存放图片的链接,而是需要在 Network 中的 XHR 下的 Headers 和 Preview 找到图片存放网址的规律。

不用着急,后续会慢慢详解。首先,我先贴出代码:

 1 import requests
 2 import urllib
 3 import json
 4 import os
 5 import shutil  # 用来删除文件夹
 6 
 7 
 8 def getSogouImag(category, length, path):
 9     # 判断文件夹是否存在,存在则删除
10     if os.path.exists(path):
11         shutil.rmtree(path)
12     # 创建文件夹
13     os.mkdir(path)
14     # 得到要爬取的图片数量
15     n = length
16     # 返回要爬取的类别
17     cate = category
18     # 根据搜索的网页得到存储图片的网页是这个代码的难点,下面会详细讲解
19     url = 'https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=' + cate + '&tag=%E5%85%A8%E9%83%A8&start=0&len=' + str(n)
20     # 访问网页
21     imgs = requests.get(url)
22     # 获取网页内容
23     imgs_text = imgs.text
24     # 字符串转换成json格式
25     imgs_json = json.loads(imgs_text)
26     # 得到图片信息列表
27     imgs_items = imgs_json['all_items']
28     m = 0
29     # 存储每个想要保存的图片链接,为了后续
30     for i in imgs_items:
31         # thumbUrl存储的图片是大小为480*360的图片网页
32         img_url = i['thumbUrl']
33         print('*********' + str(m) + '.png********' + 'Downloading...')
34         print('下载的url: ', img_url)
35         # 下载图片并且保存
36         urllib.request.urlretrieve(img_url, path+str(m) + '.jpg')
37         m = m + 1
38     print('Download complete !')
39 
40 
41 getSogouImag('壁纸', 5, './img/')
42 
43 pass

这里,得到存放图片的url是重点和难点,以下详细讲述怎么得到url过程。

(1)首先还是打开网页源代码(chrome可以点击鼠标右键,按下 Inspect),这时如果你使用前三章(爬虫系列一和系列二)抓取指定网页中的图片方法如正则表达式或者用CSS标签筛选的方法都只会返回一张搜狗的图标图片,其他显示的我们想要下载的图片是看不到。

(2)我们要找到我们想要下载的图片,就必须点击 Network, 选择 XHR,然后就会看到在 Name 栏出现了getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA 的内容, 你用鼠标越往下加载图片,这个getAllRecomPicByTag的内容就会出现越多,你点击它,可以看到出现的就是存放图片地址的 API 。

这里,你可以点击Preview,观察这个 json 数组,一层层的打开all_items 就可以看到里面存放的就是图片的地址,想明白了这就是我们可以找到图片链接的地方,那么就可以确定我们想要找的图片链接就在 Headers 中。

 python 图片爬虫抓取图片系列三——爬取搜狗图片库中的图片

 

(3)点击 Headers 就可以找到它们所对应的 url 链接。python 图片爬虫抓取图片系列三——爬取搜狗图片库中的图片

 这个Request URL 链接类似如下样子:

https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA%B8&tag=%E5%85%A8%E9%83%A8&start=0&len=15&width=1920&height=1080

我们猜想这个应该就是搜狗图片存放图片链接的 url,因此我们来解析一下。首先看 category 和 tag 后面那一串应该是字符的编码,查了下 %E5%A3%81%E7%BA%B8 是“壁纸” 的编码,而 %E5%85%A8%E9%83% 是 “全部” 的编码,所以说,上面的链接和如下的链接是等效的:

https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=壁纸&tag=全部&start=0&len=15&width=1920&height=1080

网页打开如下图所示:

python 图片爬虫抓取图片系列三——爬取搜狗图片库中的图片

 

此外,start 是开始下标,len 是长度,即图片的数量,所以通过这些信息我们可以给 url 传入参数,使之搜索的更加灵活,如下所示:

url = 'https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=' + cate + '&tag=%E5%85%A8%E9%83%A8&start=0&len=' + str(n)

其中,cate 和 n 都是可以自定义的变量,分别表示要搜索的类别和爬取的图片数量。

以上就是使用 python 动态抓取图片库中图片的详解,希望能帮助大家理解。