前言
由于工作需要,需要从网上获取大量图片。百度图片就是一个动态网页,需要使用动态爬取功能进行爬图片。
涉及到的库
import requests
import json
import os
实现过程
- 下载链接分析 首先,打开百度,搜索一个内容
然后,打开抓包工具,选择XHR选项,按Ctrl+R,然后你会发现,随着你鼠标的滑动,右侧会出现一个又一个的数据包。
这里简单说一下什么是抓包工具:
- 什么是抓包?
即抓取我们本地电脑与远端服务器通信时候所传递的数据包 - Chrome浏览器讲解:
Chrome 开发者工具是一套内置于Google Chrome中的Web开发和调试工具,可用来对网站进行迭代、调试和分析 - 如何打开Chrome开发者工具?
在Chrome界面按F12 or在页面元素上右键点击,选择“检查” - 开发者工具的结构
1、Elements(元素面板):使用“元素”面板可以通过自由操纵DOM和CSS来重演您网站的布局和设计。 2、Console(控制台面板):在开发期间,可以使用控制台面板记录诊断信息,或者使用它作为 shell,在页面上与JavaScript交互 3、Sources(源代码面板):在源代码面板中设置断点来调试 JavaScript ,或者通过Workspaces(工作区)连接本地文件来使用开发者工具的实时编辑器 4、Network(网络面板):从发起网页页面请求Request后得到的各个请求资源信息(包括状态、资源类型、大小、所用时间等),并可以根据这个进行网络性能优化 5、Performance(性能面板):使用时间轴面板,可以通过记录和查看网站生命周期内发生的各种事件来提高页面运行时的性能 6、Memory(内存面板):分析web应用或者页面的执行时间以及内存使用情况 7、Application(应用面板):记录网站加载的所有资源信息,包括存储数据(Local Storage、Session 8、Storage、-IndexedDB、Web SQL、Cookies)、缓存数据、字体、图片、脚本、样式表等 9、Security(安全面板):使用安全面板调试混合内容问题,证书问题等等 10、Audits(审核面板):对当前网页进行网络利用情况、网页性能方面的诊断,并给出一些优化建议。比如列出所有没有用到的CSS文件等
抓取到的数据包如下: 然后,选一个包,查看它的headers,如图:
截取之后,保存下来,作为一个URL 剩余的其他参数也可以保存下来使用,如图:
结果展示:
- 代码分析
# -*- coding: UTF-8 -*-"""
import requests
import json
def configs():
"""
参数
:return:
"""
# 保存地址
path = 'E:\data'
# url链接
url = 'https://image.baidu.com/search/acjson?'
# 导入一个请求头
header = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
# 其他参数
param = {
'tn': 'resultjson_com',
'logid': '7630384231337614829',
'ipn': 'rj',
'ct': '201326592',
'is': '',
'fp': 'result',
'fr': '',
'word': '打包袋',
'queryWord': '打包袋',
'cl': '2',
'lm': '-1',
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': '',
'z': '',
'ic': '',
'hd': '',
'latest': '',
'copyright': '',
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': '',
'istype': '',
'qc': '',
'nc': '1',
'expermode': '',
'nojc': '',
'isAsync': '',
'pn': '30',
'rn': '30',
'gsm': '1e'
}
return path, url, header, param
def download_pic(page):
"""
下载图片
:param page:
:return:
"""
page = int(page) + 1
n = 0
pn = 1 # pn代表从第几张图片开始获取,百度图片下滑时默认一次性显示30张
path, url, header, param = configs()
for m in range(1, page):
# 定义一个空列表,用于存放图片的URL
image_url = list()
# 将编码形式转换为utf-8
response = requests.get(url=url, headers=header, params=param)
response.encoding = 'utf-8'
response = response.text # 把字符串转换成json数据
data_s = json.loads(response)
a = data_s["data"] # 提取data里的数据
for i in range(len(a) - 1): # 去掉最后一个空数据
data = a[i].get("thumbURL", "not exist") # 防止报错key error
image_url.append(data)
for image_src in image_url:
# 提取图片内容数据
image_data = requests.get(url=image_src, headers=header).content
image_name = '{}'.format(n + 1) + '.jpg' # 图片名
image_path = path + '/' + image_name # 图片保存路径
with open(image_path, 'wb') as f: # 保存数据
f.write(image_data)
print(image_name, '下载成功啦!!!')
f.close()
n += 1
pn += 29
if __name__ == '__main__':
keyword = input('请输入你想下载的内容:')
page = input('请输入你想爬取的页数:')
download_pic(page)
|