网页爬虫抓取百度图片(Python项目案例开发从入门到实战》(清华大学出版社郑秋生))
优采云 发布时间: 2021-10-29 15:18网页爬虫抓取百度图片(Python项目案例开发从入门到实战》(清华大学出版社郑秋生))
来自《Python项目案例开发从入门到实战》(清华大学出版社郑秋生、夏敏毅主编)爬虫应用-抓取百度图片
本文爬取了搜狗图片库中的图片。与抓取特定网页中的图片相比,抓取图片库中的图片相对复杂一些。复杂的主要原因在于图片的动态加载。
图片库中的图片太多,所以在访问网页时,并不是一次性加载所有图片,而是根据鼠标滚轮的行为动态加载。这将导致与之前抓取特定网页中的图片不同。主要原因是没有办法通过之前查看网页源代码的方法直接获取到存储图片的链接。相反,它需要在网络中 XHR 下的标题和预览中找到。图片存储网址的规律。
别着急,我们稍后会详细解释。首先,我先贴出代码:
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 column 用鼠标加载图片越多,这个getAllRecomPicByTag的内容就会出现越多,点击它,可以看到存储图片地址的API出现了。
在这里,您可以单击预览并观察此 json 数组。一层一层打开all_items,可以看到里面存放了图片的地址。如果您明白这是我们可以找到图片链接的地方,那么我们就可以确定我们想要的图片链接您找到的图片链接在 Headers 中。
(3)点击Headers可以找到对应的url链接。
请求 URL 链接如下所示:
%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%是“全部”编码,所以上面的链接和下面的链接是相等的:
壁纸&tag=all&start=0&len=15&width=1920&height=1080
网页打开如下图所示:
另外,start是起始下标,len是长度,也就是图片张数,所以我们可以通过这个信息给url传入参数,让搜索更加灵活,如下图:
url ='' + cate +'&tag=%E5%85%A8%E9%83%A8&start=0&len=' + str(n)
其中,cate和n是可以自定义的变量,分别代表要搜索的类别和要爬取的图片数量。
以上就是使用python动态抓取图片库中图片的详细讲解,希望可以帮助大家理解。