一、有关cookie

我之前写过一篇博文《python pycurl模块》,在其中有提到pycurl 有将cookie保存在该文件中,并允许跟踪来源,其他请求会直接调用该cookie文件。这个适用于大多数的应用场景,不过有时候新的cookie内容并不会在响应头中记录到cookie文件中,比如session key之类的,其一般会在响应正文里。在直接后面的请求时,需要手动的加入到请求的cookie头信息里。本篇就结合requsts模块,了解下自定义cookie信息。

先科普下cookie的概念,Cookie它是在客户端访问Web服务器时,服务器在客户端硬盘上存放的信息,服务器可以根据Cookie来跟踪客户状态。具体见下图:

http-cookies
http-cookies

二、requests模块中cookie的使用

1、查看响应cookie

 1>>> url = 'https://www.baidu.com'
 2>>> r = requests.get(url)
 3>>> r.cookies.items()
 4[('BDORZ', '27315')]
 5>>> r.cookies.keys()
 6['BDORZ']
 7>>> r.cookies.values()
 8['27315']
 9>>> r.cookies['BDORZ']
10'27315'

2、请求cookie

 1>>> url = 'http://httpbin.org/cookies'
 2>>> cookies = dict(cookies_are='working')
 3>>> r = requests.get(url, cookies=cookies)
 4>>> print(r.text)
 5{
 6  "cookies": {
 7    "cookies_are": "working"
 8  }
 9}
10>>>

3、cookie的跨域访问

Cookie 的返回对象为 RequestsCookieJar,它的行为和字典类似,但接口更为完整,适合跨域名跨路径使用。你还可以把 Cookie Jar 传到 Requests 中:

1>>> jar = requests.cookies.RequestsCookieJar()
2>>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
3>>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
4>>> url = 'http://httpbin.org/cookies'
5>>> r = requests.get(url, cookies=jar)
6>>> r.text
7'{"cookies": {"tasty_cookie": "yum"}}'

思考一下,在访问http://httpbin.org/elsewhere 时返回的是什么?

三、requests模块自定义cookies实战

使用Cookie访问Web服务器的方式有两种:一种是写在header头部,另一种是插入Cookie参数。

1、使用header头部

 1import requests
 2url = 'http://200.200.0.7/Java/jviewer.jnlp?EXTRNIP=200.200.0.7&JNLPSTR=JViewer'
 3cookies = '''SessionCookie=shfLO755DJlWGV4AkCjSb4jnkBHPXe3J005; Language=ZH; Username=admin;'''
 4header = {
 5'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Geck
 6o) Chrome/53.0.2785.143 Safari/537.36',
 7'Connection': 'keep-alive',
 8'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
 9'Cookie': cookies
10       }
11r = requests.get(url,headers=header)
12print(r.text)

2、直接使用cookies参数

1import requests
2url = 'http://200.200.0.7/Java/jviewer.jnlp?EXTRNIP=200.200.0.7&JNLPSTR=JViewer'
3cookie = '''SessionCookie=shfLO755DJlWGV4AkCjSb4jnkBHPXe3J005; Language=ZH; Username=admin;'''
4r = requests.get(url,cookies=cookie)
5print(r.text)

当然,这里还是支持使用headers的,cookies和headers地起用的方法是:r = requests.get(url,cookies=cookie ,headers=header) 。

更多内容可以参看requests模块官方文档