反爬策略:Cookie
Cookie
-
存储在客户端的一组键值对
-
web中cookie的典型应用:
- 免密登录
cookie和爬虫之间的关联
有时候,对一张页面进行请求的时候,如果请求过程中不携带cookie的话,那么无法请求到对应的数据。因此cookie是爬虫一个非常典型且常见的反爬机制
需求:爬取雪球网的咨询信息
https://xueqiu.com/
分析:
- 判断爬取的数据是否为动态加载相关的更多咨询是动态加载的
- 滚轮滑动到底部的时候会动态加载出更多的咨询数据
- 定位到ajax请求的数据包,提取出请求的url,响应数据为json格式的数据
问题:没有请求到数据
原因:没有严格意义上模拟浏览器发请求
处理:可以将浏览器发请求携带的请求头,全部粘贴在headers字典中,将headers作用到requests请求中即可
Cookie的处理方式
-
方式一:手动处理
-
将抓包工具的cookie粘贴到headers中
-
弊端:cookie如果过了有效时长则该方式时效
-
-
方式二:自动处理
-
基于Session对象实现自动处理
-
如何获取一个session对象:requests.Session()返回一个对象
-
session对象的作用:
- 该对象可以向requests一样调用get和post发起指定的请求只不过,如果在使用session发请求的过程中如果产生了cookie,则该cookie会被自动存储到该对象中,那么就意味着下次再次使用session对象发起请求,则该对象请就是携带cookie进行的请求发送
-
在爬虫使用session的时候,session对象至少会被使用几次?
- 两次。第一次使用session是为了将cookie捕获并且存储到session对象中,下次的时候就是携带cookie进行请求的
import os import pymongo import requests from lxml import etree headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.3538.77 Safari/537.36' } # 1、创建Session对象 session = requests.Session() # 2、第一次使用session捕获并且存储cookie,猜测对雪球网的首页发起请求可能会产生cookie main_url = 'https://xueqiu.com/' # 为了捕获cookie session.get(url=main_url, headers=headers) # 3、二次携带cookie请求 url = 'https://xueqiu.com/statuses/hot/listV2.json?since_id=-1&max_id=246621&size=15' response = session.get(url=url, headers=headers).json() print(response)
-