反扒机制(懒加载及cookie)

时间:2020-04-12
本文章向大家介绍反扒机制(懒加载及cookie),主要包括反扒机制(懒加载及cookie)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

反扒机制:图片的懒加载

  • 站长素材高清图片下载
  • 反扒机制:图片懒加载,广泛应用于一些图片网站中
    • 只有当图片真正显示在浏览器可视化范围内才会将img标签的伪属性变成真正的属性,如果是requests发请求,requests请求是没有可视化范围的,因此我们一定要解析的是img伪属性的属性值(图片地址,例如站长素材就是可视化src,伪属性是src2,所以只要爬取src2属性即可)
  • 学过的反爬机制:
    • robots
    • UA伪装
    • 动态加载数据的捕获
    • 图片懒加载

cookie:

  • 是存储在客户端的一组键值对。

  • web中cookie的典型应用:

    ​ -----免密登录

  • cookies和爬虫之间的关联

    • 有时,对一张页面进行请求的时候,如果请求过程中不携带cookie的话,那么我们无法请求到正确的页面数据。因此cookie是爬虫常见的一种典型反扒机制。
  • 需求:爬取雪球网中的咨询信息。https://xueqiu.com/

  • 分析:

    • 1.判定爬取的咨询数据是否为动态加载的
      • 相关的更多咨询数据是动态加载的,滚轮滑动到底部的时候会动态加载出更多咨询数据。
    • 2.定位到ajax请求的数据包,提取出请求的url,响应数据为json形式的咨询数据
import requests
headers = {
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
#这是雪球网发ajax获取数据的网址
url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=20369434&count=15&category=-1'
page_text = requests.get(url=url,headers=headers).json()
page_text

结果:{'error_description': '遇到错误,请刷新页面或者重新登录帐号后再试',
 'error_uri': '/v4/statuses/public_timeline_by_category.json',
 'error_data': None,
 'error_code': '400016'}
  • 问题:我们没有请求到我们想要的数据

  • 原因:我们没有严格意义上模拟浏览器发请求。

    • 处理:可以将浏览器发请求携带的请求头,全部粘贴在headers字典中,将headers作用到requests的请求操作中即可。
  • cookie的处理方式

    • 方式1:手动处理

      • 将抓包工具中的cookie粘贴在headers中
      • 弊端:如果cookies过了有效时长则该方法失效
    • 方式2:自动处理

      • 基于Session对象实现自动处理
      • 如何获取一个session对象,requests.Session()返回一个session对象
      • session对象的作用:
        • 该对象可以像requests一样调用get和post请求。只不过如果在使用session发请求的过程中产生了cookie,则cookie会被自动存储到该session对象中,那么就意味这那么就意味着下次再次使用session对象发起请求,则该次请求就是携带cookie进行的请求发送。
      • 在爬虫中使用session的时候,session对象至少被使用2次!
        • 第一次是使用session是为了将cookie捕获自动存储在session对象中,对首页发起请求
        • 第二次就是携带cookie进行的请求发送。
      #创建好session对象
      session = requests.Session()
      #第一次使用session捕获且存储cookie,猜测对雪球网的首页发起的请求可能会产生cookie
      main_url = "https://xueqiu.com"
      session.get(main_url,headers=headers) #捕获且存储cookie
      url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=20369434&count=15&category=-1'
      page_text = session.get(url=url,headers=headers).json() #携带cookie发起的请求
      

原文地址:https://www.cnblogs.com/zzsy/p/12687591.html