requests保持会话
前提说明
爬虫的最主要的坑莫过于反爬,用户认证把一大批爬虫拒之门外,而如何模拟用户登录、保持会话其实很简单,通过requests模块就可以实现。以下为项目经验摘录。
实验的目标网址通过分配sissionID给浏览器来保持会话状态。
具体实现及说明
引入模块
import requests
建立会话
rs = requests.Session()
修改headers信息
如修改请求头的User-Agent:rs.headers.update({'User-Agent': 'string'})
增加cookies
分配给我们的sessionID其实就是一个cookie值,我们可以存放在redis,每次使用前先判断sessionID是否还有效,避免每次都重新登录。
实例化一个RequestsCookieJar对象,rs.cookies其实就是这个对象cj = requests.cookies.RequestsCookieJar()
向RequestsCookieJar对象写入cookie键值对cj.set(key, value, domain='xxx.com', path='/path')
替换cookie对象rs.cookies = cj
模拟登录
登录就是激活会话状态的过程,及后端标记此sessionID为已登录状态,然后下次cookie中带这个sessionID就是已经登录的啦。激活成功后,访问域名下的所有子页面都是已登录状态,请求时会自动带上cookie值。
假设登录接口为login_path,为post请求,登录用的数据保存在对象login_data中,此时可以rs.post(login_path, data=login_data)
requests和测试框架selenium的对比
| requests | selenium :-: | :-: | :-: 执行速度 | 快 | 慢 学习周期(相对) | 短 | 长 结果可预见 | 弱 | 强 额外依赖 | 无 | 各浏览器厂商发布的驱动 应用范围(个人理解,具体还应结合实际需求) | 认证简单的网站,如仅通过sessionID认证 | 认证复杂的网站