来自 《Python项目案例开发从入门到实战》(清华大学出版社 郑秋生 夏敏捷主编)中爬虫应用——抓取百度图片python
本文爬取了搜狗图片库中的图片,相对于爬取特定网页中的图片,爬取图片库中的图片相对复杂一些,复杂的缘由主要在于图片的动态加载上。正则表达式
图片库中的图片太多,因此访问网页的时候不是一次性把图片所有加载出来,而是根据鼠标滚轮的行为进行动态加载。这会致使和以前的抓取特定网页中的图片有所区别,主要就是没办法经过以前查看网页源代码的方法直接获得存放图片的连接,而是须要在 Network 中的 XHR 下的 Headers 和 Preview 找到图片存放网址的规律。chrome
不用着急,后续会慢慢详解。首先,我先贴出代码:json
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标签筛选的方法都只会返回一张搜狗的图标图片,其余显示的咱们想要下载的图片是看不到。jsp
(2)咱们要找到咱们想要下载的图片,就必须点击 Network, 选择 XHR,而后就会看到在 Name 栏出现了getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA 的内容, 你用鼠标越往下加载图片,这个getAllRecomPicByTag的内容就会出现越多,你点击它,能够看到出现的就是存放图片地址的 API 。编码
这里,你能够点击Preview,观察这个 json 数组,一层层的打开all_items 就能够看到里面存放的就是图片的地址,想明白了这就是咱们能够找到图片连接的地方,那么就能够肯定咱们想要找的图片连接就在 Headers 中。url
(3)点击 Headers 就能够找到它们所对应的 url 连接。spa
这个Request URL 连接相似以下样子:code
咱们猜测这个应该就是搜狗图片存放图片连接的 url,所以咱们来解析一下。首先看 category 和 tag 后面那一串应该是字符的编码,查了下 %E5%A3%81%E7%BA%B8 是“壁纸” 的编码,而 %E5%85%A8%E9%83% 是 “所有” 的编码,因此说,上面的连接和以下的连接是等效的:
网页打开以下图所示:
此外,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 动态抓取图片库中图片的详解,但愿能帮助你们理解。