如何运用Python爬取百度图片?
实验环境:Python 3.x
第三方库:Resquest 2.14.2
一、首先打开百度,输入关键字搜索所需照片(这里以电子秤为例)
往下拉能看到图片是随着网页向下的滑动而加载出来的,这是动态加载页面。这就麻烦了,如果查看页面的源代码,是不会发现图片的url的,这可怎么办呢?不怕,首先要弄明白动态加载的原理,动态加载就是通过运行javascript将图片数据插入到网页的HTML标签里面,所以我们在源代码里看不到图片信息。但是网页中能加载出来图片说明网页请求有数据包,只要找到存放有数据信息的文件就能找到图片的url。
二、接下来查看数据包,找到图片的url
现在举个例子,搜索电子秤的百度图片,点开网页开发者工具,点击网络,往下滑动图片页面就会发现加载出多张图片和多出 acjson?tn=resultjson&ipn=… 请求的文件,再点击文件预览就会看到一条json数据,点开就会发现30多条数据,再次点开就会发现,每条数据都包含了一张图片的详细信息。
这时候细心的你一定会发现每个文件内只有30条数据,那怎么才能得到1000+条数据呢?那我们就来找不同,如上图有四个 acjson?tn=resultjson&ipn=… 文件,如果仔细想一想,每请求一次得到30条数据,而且每次请求的数据是不同的,所以肯定请求的url也是不同的,将这4个文件的url放在一起如下:
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8615903434039220370&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%94%B5%E5%AD%90%E7%A7%A4&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=&word=%E7%94%B5%E5%AD%90%E7%A7%A4&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=1e&1614774604107=
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8615903434039220370&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%94%B5%E5%AD%90%E7%A7%A4&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=&word=%E7%94%B5%E5%AD%90%E7%A7%A4&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn=60&rn=30&gsm=3c&1614774604251=
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8615903434039220370&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%94%B5%E5%AD%90%E7%A7%A4&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=&word=%E7%94%B5%E5%AD%90%E7%A7%A4&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn=90&rn=30&gsm=5a&1614774716612=
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8615903434039220370&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%94%B5%E5%AD%90%E7%A7%A4&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=&word=%E7%94%B5%E5%AD%90%E7%A7%A4&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn=120&rn=30&gsm=78&1614774716744=
不难发现,除了pn和gsm的前两个字母外其他的都相同。pn是以30为步幅递增的,而gsm的前两个字母是pn的16进制数的两位。
三、实验代码
导入库
import requests
import time
模拟浏览器
# 请求头,伪装成浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
}
keyword = '电子秤' # 关键字
max_page = 34
i=1 # 记录图片数
创建一个文件夹并和代码文件放在同一目录下,爬取并下载图片
for page in range(1,max_page+1):
page = page*30
# 网址
url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord='\
+keyword+'&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word='\
+keyword+'&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=wallpaper&pn='\
+str(page)+'&rn=30&gsm=1e&1596899786625='
# 请求响应
response = requests.get(url=url,headers=headers)
# 得到相应的json数据
json = response.json()
if json.get('data'):
for item in json.get('data')[:30]:
# 图片地址
img_url = item.get('thumbURL')
# 获取图片
image = requests.get(url=img_url)
# 下载图片
with open('./电子秤图片/%d.jpg' %i,'wb') as f:
f.write(image.content) # 图片二进制数据
time.sleep(1) # 等待1s
print('第%d张%s图片下载完成...'%(i,keyword))
i+=1
print('End!')
四、爬取结果
成功爬取1000+张图片到指定文件夹
资料参考
简书:隐墨留白
链接:https://www.jianshu.com/p/e7031f06307c