运行坏境
python3.x
选择目标——百度
当我们在使用右键查看网页源码时,出来的却是一大堆JavaScript代码,并没有图片的链接等信息
因为它是一个动态页面嘛。它的网页原始数据其实是没有这个图片的,通过运行JavaScript,把这个图片数据把它插入到网页的html标签里面
那这样造成的结果是,我们在开发者工具中虽然能看到这个html标签,但实际上,当我们在看网页的原始数据的时候,其实是没有这个标签的,它只在运行时加载和渲染
进行抓包就好了,我们点击Network–XHR,然后我们在往下滑动滚动条时,会一直出现一个名为:acjson?tn=resultjson&ipn=…的请求,点击它再点Preview,我们看到这是一条json数据,点开data,我们看到这里面有30条数据,每一条都对应着一张图片。
如下:
于是我们就清楚了,百度图片一开始只加载30张图片,当我们往下滑动滚动条时,页面会动态加载json数据,每条json数据里面包含了30条信息,信息里面又包含了图片的URL,JavaScript会将这些url解析并显示出来。这样,每次滚动到底就又多出30张图片。
那么,这些一直出现的json数据有什么规律呢?
我们点击Headers,然后对比这些json数据的头部信息。
通过对比,我们发现headers下的Query String Parameters中的字段大多保持不变,只有pn字段保持以30为步长递增
比较
总结
import requests
import os
def getManyPages(keyword,pages):
params=[]
for i in range(30,30*pages+30,30):
params.append({
\'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,
\'word\': keyword,
\'s\': \'\',
\'se\': \'\',
\'tab\': \'\',
\'width\': \'\',
\'height\': \'\',
\'face\': 0,
\'istype\': 2,
\'qc\': \'\',
\'nc\': 1,
\'fr\': \'\',
\'pn\': i,
\'rn\': 30,
\'gsm\': \'1e\',
\'1488942260214\': \'\'
})
url = \'https://image.baidu.com/search/acjson\'
urls = []
for i in params:
urls.append(requests.get(url,params=i).json().get(\'data\'))
return urls
def getImg(dataList, localPath):
if not os.path.exists(localPath): # 新建文件夹
os.mkdir(localPath)
x = 0
for list in dataList:
for i in list:
if i.get(\'thumbURL\') != None:
print(\'正在下载:%s\' % i.get(\'thumbURL\'))
ir = requests.get(i.get(\'thumbURL\'))
open(localPath + \'%d.jpg\' % x, \'wb\').write(ir.content)
x += 1
else:
print(\'图片链接不存在\')
if __name__ == \'__main__\':
dataList = getManyPages(\'风景\',10) # 参数1:关键字,参数2:要下载的页数
getImg(dataList,\'*********\') # 参数2:指定保存的路径