Ajax爬取实战头条街拍美图

转载自:静觅 » [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()
原文地址:https://www.cnblogs.com/waws1314/p/12502404.html