zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    Linux之基础系统优化
    Linux之shell命令
    Django解决跨域问题
    Django中使用geetest验证
    python2与python3的区别
    一个长得很丑的登录和注册
    Django组件-forms组件
    Django组件-中间件
    cookie、session与用户认证组件
    jquery练习
  • 原文地址:https://www.cnblogs.com/waws1314/p/12502404.html
Copyright © 2011-2022 走看看