python教程

当前位置:首页 > requests爬虫 > 当前文章

requests爬虫

什么是Cookie,requests处理Cookie的多种方法

2019-07-19 186赞 老董笔记

  什么是Cookie

  浏览器访问网页的时候,服务器就会返回响应头,如果响应头中包含一些字符串,浏览器把这些字符串以文件的形式存储到本地电脑上。再次请求该站的一个网页时请求头就会携带上这个字符串,这个字符串就是cookie。

  Cookie的场景

  在当当网A页面购买了A书,B页面买了B书,C页面买了C书。虽然是不同的页面但最后订单中可以显示出所有商品。为什么呢,说明服务器对用户有1个标记。即使访问不同网页也能知道是1个人。这种标记就通过Cookies实现。

  如果一个http响应中包含了cookie,那么我们可以利用 cookies属性拿到:

# -*- coding: utf-8 -*-

headers = {
'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44',
}

r = requests.get("https://www.baidu.com/",headers=headers)
obj = r.cookies
print(obj)
<RequestsCookieJar[<Cookie BAIDUID=117CD9E1A49D4164203C4170FD9D5929:FG=1 for .baidu.com/>, <Cookie BIDUPSID=117CD9E1A49D4164645C26EDA9574292 for .baidu.com/>, <Cookie H_PS_PSSID=34442_35106_31254_34903_34504_34916_34813_26350_34868_22160_35018 for .baidu.com/>, <Cookie PSTM=1636619939 for .baidu.com/>, <Cookie BDSVRTM=0 for www.baidu.com/>, <Cookie BD_HOME=1 for www.baidu.com/>]>

  r.cookies值为RequestsCookieJar对象,它的行为和字典类似,我们可以遍历来获取值。

# -*- coding: utf-8 -*-

headers = {
'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44',
}

r = requests.get("https://www.baidu.com/",headers=headers)
obj = r.cookies
for k,v in obj.items():
    print(f'{k}:{v}')
BAIDUID:4C1BE25A9C59436E6FBDE1156E42A608:FG=1
BIDUPSID:4C1BE25A9C59436E54B468F3AEB2DEB6
H_PS_PSSID:35104_31254_35048_35096_34504_34917_34578_34813_34815_26350_34971_34867_35018
PSTM:1636620094
BDSVRTM:0
BD_HOME:1

  也可以通过requests.utils.dict_from_cookiejar()方式来转为字典。

# -*- coding: utf-8 -*-
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44',
}

r = requests.get("https://www.baidu.com/",headers=headers)
cookiejar = r.cookies
dic = requests.utils.dict_from_cookiejar(cookiejar)
print(dic)
{'BAIDUID': '70866C970551C41F5F02A931FE450B1B:FG=1', 'BIDUPSID': '70866C970551C41F0AE52BFE081C9248', 'H_PS_PSSID': '34949_35104_31254_35050_34903_34504_34916_34579_34812_26350_34970_34867_35018', 'PSTM': '1636620212', 'BDSVRTM': '0', 'BD_HOME': '1'}

  如果在请求网页时要想发送cookies到服务器,可以有3种方法选择

  1)直接使用cookies参数

  2)因为cookies是请求头的一部分,也可以放在headers里去请求(要把字典式的cookie转为key1=value1;key2=value2字符串),大部分情况下是没问题的,有些站却不行!

  3)RequestsCookieJar对象的行为和字典类似,但接口更为完整,可以把利用CookieJar来传参请求。

# -*- coding: utf-8 -*-
url = 'http://httpbin.org/cookies'

# 字典形式传入
cookies = {'k1':'v1','k2':'v2'}
r = requests.get(url, cookies=cookies)
print(r.text)
print('============')

# cookie转为key1=value1;key2=value2字符串
cookie_str = "k1=v1;k2=v2"
headers = {'Cooike':cookie_str}
r = requests.get(url, headers=headers) # 这个站未生效
print(r.text)
print('============')

#  RequestsCookieJar对象形式
jar = requests.cookies.RequestsCookieJar()
jar.set('k1', 'v1', domain='httpbin.org', path='/cookies')
jar.set('k2', 'v2', domain='httpbin.org', path='/cookies')
r = requests.get(url, cookies=jar)
print(r.text)
print('============')
{
  "cookies": {
    "k1": "v1", 
    "k2": "v2"
  }
}

============
{
  "cookies": {}
}

============
{
  "cookies": {
    "k1": "v1", 
    "k2": "v2"
  }
}

============

感兴趣直接点击图片获取>>

文章评论

什么是Cookie,requests处理Cookie的多种方法文章写得不错,值得赞赏