运行坏境
python3.xhtml
选择目标——百度
当咱们在使用右键查看网页源码时,出来的倒是一大堆JavaScript代码,并无图片的连接等信息python
由于它是一个动态页面嘛。它的网页原始数据实际上是没有这个图片的,经过运行JavaScript,把这个图片数据把它插入到网页的html标签里面json
那这样形成的结果是,咱们在开发者工具中虽然能看到这个html标签,但实际上,当咱们在看网页的原始数据的时候,实际上是没有这个标签的,它只在运行时加载和渲染python3.x
进行抓包就行了,咱们点击Network–XHR,而后咱们在往下滑动滚动条时,会一直出现一个名为:acjson?tn=resultjson&ipn=…的请求,点击它再点Preview,咱们看到这是一条json数据,点开data,咱们看到这里面有30条数据,每一条都对应着一张图片。app
以下:工具
因而咱们就清楚了,百度图片一开始只加载30张图片,当咱们往下滑动滚动条时,页面会动态加载json数据,每条json数据里面包含了30条信息,信息里面又包含了图片的URL,JavaScript会将这些url解析并显示出来。这样,每次滚动到底就又多出30张图片。url
那么,这些一直出现的json数据有什么规律呢?spa
咱们点击Headers,而后对比这些json数据的头部信息。code
经过对比,咱们发现headers下的Query String Parameters中的字段大多保持不变,只有pn字段保持以30为步长递增htm
比较
总结
import requestsimport osdef 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 urlsdef 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:指定保存的路径