爬虫05_基于cookie反爬机制的网站的数据爬取

16 篇文章 0 订阅
12 篇文章 1 订阅

这个案例需要学会滚轮往下拖的时候动态加载的数据如何爬取,区别于豆瓣电影爬取

cookie概述:

  • cookie就是存储在客户端的一组键值对
  • cookieweb中主要应用有免密登录
  • cookie和爬虫之间的关联,有时候我们对一张页面进行请求的时候,如果请求的过程中不携带cookie的话,那么我们是无法请求到正确的页面数据,这是一种非常常见的反爬机制,因此遇到这种情况我们必须,所有的请求必须携带cookie

案例:爬取雪球网中的咨询信息

  • 需求:爬取雪球网,推荐栏目下所有文章的标题和内容,练习地址
  • 分析:
    • 1)判断爬取的咨询数据是不是为动态加载的数据,相关更多的咨询是动态加载的,当滚轮滑动到底部时会动态加载更多的数据
    • 2)定位到ajax请求的数据包,提取出url,响应的数据为json格式的咨询数据
      图1 部分信息可以搜到
      图2 有的信息无法搜到
      图3 定位到ajax请求的数据包
    • 3)get请求不要封装dataget请求要看params参数,而post请求必须携带data
      图4 get请求不需要封装data
    • 4)实例代码,遇到了cookie反爬机制,阻止了我们拿到想要的json数据,分析原因在于我们没有严格意义上模拟浏览器发请求,遇到这类情况,我们可以将浏览器发请求携带的头部全部粘贴到headers字典中,然后将headers作用到requests操作中即可,但是通常情况下优先试试将cookie数据加载到请求头
import requests

headers = {
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}

url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=20370842&count=15&category=-1'

page_text = requests.get(url=url, headers=headers).json()
page_text

图5 没有添加cookie值的运行结果

cookie的两种处理方式:

  1. 手动处理,即将抓包工具中的cookie信息全部粘贴到headers中,由于cookie有有效时长且会动态变化,如果过了有效时长或者动态变化了,这种方式就不适用了
  2. 自动处理,基于session对象实现自动处理,使用构造函数requests.Session()返回一个session对象

session对象的作用,该对象可以像requests一样向服务器发送getpost…请求,只不过在使用session对象在发送请求过程中产生了cookie,则该session对象会自动保存cookie值。那么这就意味着我们下次再使用该session对象发送请求,则这个请求就会自动携带cookie

项目代码:

import requests

headers = {
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}
session = requests.Session() #创建一个session对象
#捕获cookie,大部分网站是第一次对网站进行访问时就会产生cookie
base_url = 'https://xueqiu.com/'
session.get(url=base_url, headers=headers)


url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=20370842&count=15&category=-1'

page_text = session.get(url=url, headers=headers).json() #第二次使用session,携带cookie发起请求
page_text

总结:

  • 爬虫中遇到动态加载数据,滑动加载数据时,首先要将抓包工具切换到XHR栏目下,定位到动态ajax请求的数据包,进而定位到url
  • 爬虫中遇到基于cookie反爬的反爬机制时,需要构建session对象,基于该对象来发送请求
  • 爬虫中一旦使用session对象时,session对象至少被使用两次,第一次,使用session对象发请求是为了捕获cookie并且将其存储到session对象中;第二次,使用session对象发请求是为了携带cookie信息发起请求,进而破解网页cookie反爬机制。即第一次拿cookie,第二次带着cookie拿数据
session = requests.Session() #构建一个session对象
...
...
response = session.get(url=url, headers=headers) #然后基于session而不是requests发请求,第一次请求是为了捕获和存储cookie
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值