您的位置:

Cookies的使用——从cookiejar说起

一、什么是Cookie?

Cookie是一种存储在客户端的小型数据文件,它通常由Web服务器发送给客户端的Web浏览器并存储在本地。Web浏览器会在之后的请求中自动发送该Cookie给Web服务器。Cookie包含了一些关于客户端和服务器之间会话的信息,比如登录凭据、购物车商品、上次访问时间等等。

二、为什么要使用Cookie?

HTTP是一种无状态协议,也就是说它无法记住之前客户端和服务器之间的交互。每次HTTP请求都是一个独立的事件,服务器无法知道是否是同一个客户端在发送请求。这时,Cookie就派上了用场。通过在客户端存储相关数据,Cookie可以在之后的请求中将这些数据发送给服务器,这样服务器就能够识别出是同一个客户端在发送请求。

三、Python中的Cookie库

Python中有很多HTTP客户端库可以用来发送HTTP请求,比如requests、http.client等。不过这些库并没有直接提供对Cookie的支持。此时,Python中的http.cookiejar库就派上了用场。

1、cookiejar库概述

cookiejar库是Python标准库中的一部分,它提供了一个CookieJar类作为基础类,可以用于管理HTTP cookies。CookieJar是一个抽象类,实际上我们要使用它的子类来管理我们的cookies。

2、cookiejar库的使用方法

cookiejar库提供了很多种不同的Cookie管理类,我们可以根据不同的需求选择不同的类。下面,我们以HTTPCookieProcessor和LWPCookieJar两个类为例,分别介绍基于内存和硬盘的Cookie存储方法。

(1)HTTPCookieProcessor

HTTPCookieProcessor用于处理HTTP请求中的Cookies,它的作用是创建一个CookieJar实例,并嵌入一个opener对象中。这样,在发送HTTP请求时,opener对象就会自动管理CookieJar中的Cookies。


import http.cookiejar
import urllib.request

cookie = http.cookiejar.CookieJar()  # 创建CookieJar实例
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))
response = opener.open("http://www.baidu.com")

for item in cookie:
    print(item.name +"="+ item.value)

首先,我们创建了一个cookie实例,然后把它传给HTTPCookieProcessor,创建了一个支持Cookies的opener对象。然后,我们用opener来发送了一个HTTP请求,并在结果中输出了CookieJar中的内容。

(2)LWPCookieJar

LWPCookieJar是CookieJar的派生类,它可以将Cookies保存在本地文件中。LWPCookieJar的使用方式与HttpCookieProcessor基本相同。我们只需要把上面的代码中的CookieJar()替换为LWPCookieJar(filename)即可。


import http.cookiejar
import urllib.request

filename = 'cookies.txt'
cookie = http.cookiejar.LWPCookieJar(filename)  # 创建LWPCookieJar实例
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open("http://www.baidu.com")

# 保存CookieJar到文件
cookie.save(ignore_discard=True, ignore_expires=True)

# 从文件中读取CookieJar
cookie.load(filename=filename, ignore_discard=True)

for item in cookie:
    print(item.name +"="+ item.value)

这段代码与上一个示例代码的唯一区别在于我们创建了一个LWPCookieJar实例,并将文件名传递给它。在使用完毕后,我们可以将CookieJar保存到文件中,并在下一次使用时从文件中读取CookieJar。

四、如何在请求中发送Cookies

当我们使用CookieJar来管理cookies时,我们的代码会非常简洁。不过,在发起HTTP请求的时候,我们有时需要手动添加一些额外的cookies。这时,我们可以使用urllib库或requests库来发送HTTP请求,并在请求中添加cookies信息。

1、使用urllib发送Cookies

在使用urllib库发送HTTP请求时,我们可以用urllib.request.Request类来创建请求对象,并通过add_header()方法来添加HTTP header信息,例如cookies。


import http.cookiejar
import urllib.request

cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)

# 添加cookies信息
req = urllib.request.Request("http://www.baidu.com")
req.add_header("Cookie", "key=value")

response = opener.open(req)

for item in cookie:
    print(item.name +"="+ item.value)

这里,我们创建了一个请求对象req,并使用add_header()方法添加了一条Cookie记录。

2、使用requests发送Cookies

requests库相对于urllib库更加Pythonic和易用,同样也可以发送HTTP请求并添加cookies。


import requests

# 添加cookies信息
cookies = {"key": "value"}

response = requests.get("http://www.baidu.com", cookies=cookies)

for item in response.cookies:
    print(item.name +"="+ item.value)

这里,我们创建了一个cookies字典,并将其传递给requests.get()方法。在得到response对象后,我们可以使用response.cookies属性来获取响应中的cookies。

五、总结

本文围绕cookies展开,从“What is Cookie”开始,逐步介绍了Python中的http.cookiejar库,在讲解完毕影响Cookie的那些因素后,拿出HTTPCookieProcessor和LWPCookieJar分别对只存在内存和硬盘上的Cookie进行了操作。最后,并举例介绍了如何发送Cookie信息。