当我们在爬取某些页面的时候,服务器往往会需要cookie,而想要得到cookie 就需要先访问某个URL进行登录,服务器接收到请求之后验证用户名以及密码在登录成功的情况下会返回一个响应,这个响应的header中一般会有一个set-cookie的信息,它对应的值就是要设置的cookie信息。
虽然我们再之前可以通过requests.utils.dict_from_cookiejar(r.cookies)提取到这个响应信息中设置的新cookie,但在下一个请求中再携带这个数据的过程较为麻烦,所以requests有个高级的方式“会话Session”
一,Session的作用
会话Session能够跨请求保持某些参数,也会在同一个 Session 实例发出的所有请求之间保持 cookie
会话保持有两个内涵:
- 保存cookie,下一次请求会自动带上前一次的cookie
- 实现和服务端的长连接,加快请求速度
二,使用方法
# 1. 创建一个session实例对象
s = requests.Session()
# 2. 使用上一步创建的对象发起请求
r = s.get(url1, headers)
r = s.get(url2, headers)
r = s.get(url3, headers)
r = s.get(url4, headers)
session对象在请求了一个网站后,对方服务器设置在本地的cookie会保存在session对象中,下一次再使用session对象请求对方服务器的时候,会自动带上前一次的cookie
示例:
import requests
s = requests.Session()
headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
}
# 发送第一个请求
r = s.get('https://www.baidu.com', headers=headers)
print("第一次请求的请求头为:", r.request.headers)
print("响应头:", r.headers)
print("设置的cookie为:", requests.utils.dict_from_cookiejar(r.cookies))
# 发送第二个请求()
r = s.get("https://www.baidu.com")
print("第二次请求的请求头为:", r.request.headers)
效果如下: