转载自:静觅 » [Python3网络爬虫开发实战] 6.4-分析Ajax爬取今日头条街拍美图
上面文章中几个重点的地方,记录下:
- 技巧类
在查看网页的时候,选择检查--network,然后我们清空所有的请求信息,刷新页面,这时候的第一个请求就是这个页面的骨架,基本的代码都在里面,但是数据可能是Ajax请求之后,在通过js渲染进去的,这个时候将我们想要的页面上的数据进行复制在network的Preview选项卡查看Response Body,进行搜索,若结果存在,我们直接请求该网页,就能获取到想要的信息,要是没有,数据就是通过后请求,在渲染的模式进行加载的,这里需要我们分析请求数据的链接,首先将all的搜索模式切换成xhr,在刷新请求,这里截取到的都是ajax请求,在其中看是否有需要的数据,如存在,分析请求方式,获取json数据即可。
这次的街拍的需求,虽然是分析出了ajax的请求,但是请求头中存在着加密的东西,可能需要读取源码中的js部分才能破解,所以下面的部分没有写自己的代码
- 代码类
- 图片的处理,文件夹的构造,文件名字的选取
1 import os 2 # hashlib--MD5的作用一是给图片起名字,二是可以取出重复图片 3 from hashlib import md5 4 5 6 def save_image(item): 7 # 构建文件夹用于存储图片 8 if not os.path.exists(item.get('title')): 9 os.mkdir(item.get('title')) 10 try: 11 response = requests.get(item.get('image')) 12 if response.status_code == 200: 13 # 构造图片的存储路径 14 file_path = '{0}/{1}.{2}'.format(item.get('title'), md5(response.content).hexdigest(), 'jpg') 15 if not os.path.exists(file_path): 16 # content请求回来的数据就是二进制的,所以wb直接写入文件即可 17 with open(file_path, 'wb') as f: 18 f.write(response.content) 19 else: 20 print('Already Downloaded', file_path) 21 except requests.ConnectionError: 22 print('Failed to Save Image')
-
- 多进程进程池的使用
1 from multiprocessing.pool import Pool 2 3 4 def main(offset): 5 json = get_page(offset) 6 for item in get_images(json): 7 print(item) 8 save_image(item) 9 10 # 固定的变量我们尽量使用大写变量进行存储,实现参数化编程 11 GROUP_START = 1 12 GROUP_END = 20 13 14 if __name__ == '__main__': 15 # 开启线程池 16 pool = Pool() 17 groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)]) 18 19 # 池类中最重要的就是map方法,将数据list映射到方法中 20 pool.map(main, groups) 21 pool.close() 22 pool.join()
- 多进程进程池的使用