1、基础cookies信息
先上一段对比代码,分别访问了博客主页和百度首页
可以看到,我的博客主页并没有cookies信息,而百度首页已然带上了一些cookies信息了。对这种包含一些 cookie的,你像字典一样使用命令res.cookies.keys()查看他的键值,像字典dict一样获取键值,比如:
2、从浏览器获取cookies
在无痕模式(假装第一次访问)下访问我的博客主页,会发现requests并没有cookies,如下图:
因为博客主页前台登录后会由登录变成登出,所以可以通过判断是否存在该字符串来检测是否登录成功。
def getcookies(): with open('cookies.txt', 'r') as f: cookies_str = f.readlines()[0] cookies = {} for x in cookies_str.split(';'): x = x.strip() sep = x.index('=') name = x[:sep] content = x[sep+1:] cookies[name] = content return cookies url = 'http://www.lizenghai.com' cookies = getcookies() res = requests.get(url, cookies=cookies) html = res.content.decode() print('登出' in html)
它将会打印True。
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”}}’
3、从浏览器获取cookies供给webchrome使用
此处我们放在后面webchrome讲解。
4、保持cookies会话——session
用request.get的话每次都要传递cookies进去才行。这样太麻烦了。
要知道,在浏览器中登录了某个网站之后,基本只要浏览器不关闭(看cookies超时时间),浏览该网站下的其他页面也是处于登录状态,这就叫做会话对象的保持(保持cookies)。
会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。
这一次例子中,为了便于大家测试(毕竟只有我有本博客的后台账号了)我们以豆瓣为例,在chrome浏览器下首先登录豆瓣,复制豆瓣首页中的cookies信息(前文中有说明)到cookies.txt,执行以下代码:
url = 'http://www.douban.com' cookies = getcookies() session = requests.session() requests.utils.add_dict_to_cookiejar(session.cookies, cookies) res = session.get(url) html = res.content.decode()
可以看到html中已经有账号管理等登录后才能看到的信息。
我们使用这个提前配置了cookies的session来访问豆瓣账号管理页面,如果未登录成功,将会跳转回登录页面。
https://accounts.douban.com/passport/setting
# 在访问一下账号管理。
# 在访问一下账号管理。 url = 'https://accounts.douban.com/passport/setting' res = session.get(url) html = res.content.decode()
很明显,html信息中是ok的。