我的博客仅仅是为了记录学习python的学习过程和成长,不对任何文章的技术负责(^_^)
需求:爬取百度图片
项目分析:百度中的图片属于动态加载的,不能用request获取网页源码进行匹配。经过尝试,我发现于其用selenium去模拟爬取,还有一个更简单的方法
看,动态加载的,难搞,但是有一个更好的办法,
看,我找到了json数据,可以直接对其进行请求,不需要使用selenium了,计划通
实现
首先导包
import requests
import json
设置一下headers和params
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
param = {
'tn': 'resultjson_com',
'logid': '11450117138517082972',
'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': '',
'expermode': '',
'nojc': '',
'isAsync': '',
'pn': '90',
'rn': '30',
'gsm': '5a',
'1673751010721': '',
}
数据请求和解析函数
def parse(url):
response = requests.get(url=url, headers=headers, params=param).json()
img_list = response['data']
for img in img_list:
try:
img_name = img['fromPageTitle']
print(img_name)
img_url = img['replaceUrl'][0]['ObjUrl']
print(img_url)
except:
pass
为了对多个网页进行解析,我们需要创建一个url列表
看这两张图片的对比,只有pn产生了变化,很明显我们可以猜测它的全称是page_num,s所以我们只需要对它进行操作就可以得到不同的数据
url_list = []
for i in range(90, 301, 30):
url = 'https://image.baidu.com/search/acjson?tn=resultjson_com' \
'&logid=11450117138517082972&ipn=rj&ct=201326592&is=&fp=result' \
'&fr=&word=%E9%80%9F%E6%B6%82&queryWord=%E9%80%9F%E6%B6%82' \
'&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=' \
'&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&expermode=&nojc=&isAsync=' \
'&pn={}&rn=30&gsm=5a&1673751010721='.format(i)
url_list.append(url)
最后,调用函数就可以了
if __name__ == '__main__':
for url in url_list:
parse(url=url)