一、有关cookie
我之前写过一篇博文《python pycurl模块》,在其中有提到pycurl 有将cookie保存在该文件中,并允许跟踪来源,其他请求会直接调用该cookie文件。这个适用于大多数的应用场景,不过有时候新的cookie内容并不会在响应头中记录到cookie文件中,比如session key之类的,其一般会在响应正文里。在直接后面的请求时,需要手动的加入到请求的cookie头信息里。本篇就结合requsts模块,了解下自定义cookie信息。
先科普下cookie的概念,Cookie它是在客户端访问Web服务器时,服务器在客户端硬盘上存放的信息,服务器可以根据Cookie来跟踪客户状态。具体见下图:
二、requests模块中cookie的使用
1、查看响应cookie
>>> url = 'https://www.baidu.com' >>> r = requests.get(url) >>> r.cookies.items() [('BDORZ', '27315')] >>> r.cookies.keys() ['BDORZ'] >>> r.cookies.values() ['27315'] >>> r.cookies['BDORZ'] '27315'
2、请求cookie
>>> url = 'http://httpbin.org/cookies' >>> cookies = dict(cookies_are='working') >>> r = requests.get(url, cookies=cookies) >>> print(r.text) { "cookies": { "cookies_are": "working" } } >>>
3、cookie的跨域访问
Cookie 的返回对象为 RequestsCookieJar,它的行为和字典类似,但接口更为完整,适合跨域名跨路径使用。你还可以把 Cookie Jar 传到 Requests 中:
>>> jar = requests.cookies.RequestsCookieJar() >>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies') >>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere') >>> url = 'http://httpbin.org/cookies' >>> r = requests.get(url, cookies=jar) >>> r.text '{"cookies": {"tasty_cookie": "yum"}}'
思考一下,在访问http://httpbin.org/elsewhere 时返回的是什么?
三、requests模块自定义cookies实战
使用Cookie访问Web服务器的方式有两种:一种是写在header头部,另一种是插入Cookie参数。
1、使用header头部
import requests url = 'http://200.200.0.7/Java/jviewer.jnlp?EXTRNIP=200.200.0.7&JNLPSTR=JViewer' cookies = '''SessionCookie=shfLO755DJlWGV4AkCjSb4jnkBHPXe3J005; Language=ZH; Username=admin;''' header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Geck o) Chrome/53.0.2785.143 Safari/537.36', 'Connection': 'keep-alive', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Cookie': cookies } r = requests.get(url,headers=header) print(r.text)
2、直接使用cookies参数
import requests url = 'http://200.200.0.7/Java/jviewer.jnlp?EXTRNIP=200.200.0.7&JNLPSTR=JViewer' cookie = '''SessionCookie=shfLO755DJlWGV4AkCjSb4jnkBHPXe3J005; Language=ZH; Username=admin;''' r = requests.get(url,cookies=cookie) print(r.text)
当然,这里还是支持使用headers的,cookies和headers地起用的方法是:r = requests.get(url,cookies=cookie ,headers=header) 。
更多内容可以参看requests模块官方文档 。