判断数据是否通过异步方式获取
如果是显示是图片的网站,把网页一直往下拉,一直加载数据显示新的图片
例如本例,百度的图片搜索
import requests
import json
import random
import string
import os
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0'}
# 从Consple采集要搜索的关键字
word=input("请输入搜索关键字:")
print(word)
# 随机生成8位的目录名
dir_name=''.join(random.sample(string.ascii_letters+string.digits,8))
print('图像文件将保存在',dir_name,'目录中')
# 在当前目录创建子目录
os.mkdir(dir_name)
# 最大下载的图像数,这个数字应该是30的整数倍,如果不是3的整数倍,那么最终下载的图像数应该是30的整数倍的整数中得第一个比max_value大的值,
# 如max_value的值是100,那么会下载120个图像文件,如果max_value的值是130,那么会下载150个图像文件
max_value=40
# 当前图像索引
current_value=0
# 用于控制图像的文件名
image_index=1
while current_value < max_value:
# 开始搜索图像
result=requests.get('https://image.baidu.com/search/acjson?tn=resultjson_com&'
'logid=10384114884588393528&ipn=rj&ct=201326592&is=&fp=res'
'ult&fr=ala&word={}&queryWord={}&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&1670329199144='.format(word,word,current_value),headers=headers)
json_str=result.content
json_doc=str(json_str,'utf-8')
# 将返回结果转换为json对象,这里要先获取二进制形式,然后再使用utf-8转码,不要直接使用result.text属性,否则会乱码
imageResult=json.loads(json_doc)
# 获取data属性的值
data=imageResult['data']
# 迭代获取当前页所有图像的URL
for record in data:
url=record.get('middleURL')
# 考虑data数组最后一个元素是空对象的情况
if url !=None:
print('正在下载图片:',url)
# 下载二进制图片
r=requests.get(url)
# 生成图像文件名
filename=dir_name+'/'+str(image_index).zfill(10)+'.jpg'
# 保存图像文件
with open(filename,'wb') as f:
f.write(r.content)
image_index+=1
current_value+=30
print('图像下载完成')