作为爬虫工作者,日常工作中常常遇到采集的页面限制我们的访问,尤其在频繁刷新或者访问一个页面时会引起网站的一些列反爬措施。网站的反爬措施有很多,今天我们就来谈谈 Session 和 cookie 的在python爬虫中的相关知识。
关于cookie的基本知识之前分享了很多,关于Session这里可以好好的解释下,Session 就一个接口(HttpSession)即就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。因为每个客户端都有自己的一个 Session 会话。在Session 会话中,我们经常用来保存用户登录之后的信息。这些用户登陆状态可以利用Cookie中的Session ID来标识。
cookie和Session一般会在网站的反爬中应用中比较常见。比如在访问某些网站的时候,是需要先进行登录才能进行下一步操作的。而在爬虫中模拟真实用户进行登陆有一下一些方式:
1、 爬虫代码里通过request.post里的参数data中,有自己的登录的账号信息。
2、访问页面的时候,从header是中找到cookie并复制,写到python脚本里的headers中,但是在使用过程中cookie的时效性也是需要考虑的。
3、通过session方法,是比较推荐的一种方式,比如python使用Keep-Alive保持相同代理IP进行采集,并进行状态判断,失败后重新发起。
代码语言:javascript复制#! -- encoding:utf-8 -- import requests import requests.adapters import time # 导入time模块,用于等待
#要访问的目标页面
targetUrlList = [ “https://httpbin.org/ip”, “https://httpbin.org/headers”, “https://httpbin.org/user-agent”, ]
#代理服务器(产品官网 www.16yun.cn)
proxyHost = “t.16yun.cn” proxyPort = “31111”
#代理验证信息
proxyUser = “16yun” proxyPass = “16ip” proxyMeta = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
#设置 http和https访问都是用HTTP代理
proxies = { “http”: proxyMeta, “https”: proxyMeta, }
#设置代理和重试策略
adapter = requests.adapters.HTTPAdapter( proxy=proxies, max_retries=3 )
#访问三次网站,使用相同的Session(keep-alive),均能够保持相同的外网IP
with requests.session() as s: # 设置cookie # cookie_dict = {“JSESSION”:“123456789”} # cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True) # s.cookies = cookies
# 为session设置代理和重试策略
s.mount("http://", adapter)
s.mount("https://", adapter)
for i in range(3):
for j, url in enumerate(targetUrlList):
r = s.get(url)
# 判断状态码是否为200,如果不是,等待1秒后重试
while r.status_code != 200: # 添加循环条件
print(f"第{i 1}次访问第{j 1}个网站的状态码为{r.status_code},等待1秒后重试")
time.sleep(1) # 等待1秒
r = s.get(url) # 重新发起请求
print(f"第{i 1}次访问第{j 1}个网站的结果:")
print(r.text)