Python使用Cookie库保存Cookie详解
在使用爬虫程序的时候,有时候需要保存Cookie用来实现持久化登录。Python中的Cookie库可以方便地实现Cookie的创建和保存。
Cookie简介
Cookie是网站服务器发送给浏览器并存储在本地的一小块数据。浏览器会在随后的请求中自动携带这些cookie数据。一般的使用场景是在登录后服务器会发送Cookie到浏览器保存,浏览器使用这个Cookie请求后续的页面。
Python Cookie库
Python中有一个标准库叫做http.cookiejar
,它提供了Cookie相关的支持功能。但是它不是直接用来处理网络请求的,使用之前需要和其他库(比如urllib、requests)配合使用。
保存Cookie
下面是一个简单的示例,使用python的Cookie库保存Cookie,保存的Cookie可以用于后续的请求:
import http.cookiejar
import urllib.request
# 创建cookie的实例
cookie_jar = http.cookiejar.CookieJar()
# 创建cookie处理器
handler = urllib.request.HTTPCookieProcessor(cookie_jar)
# 创建打开器
opener = urllib.request.build_opener(handler)
# 发送请求,保存Cookie
opener.open('http://www.baidu.com')
# 保存cookie到文件
cookie_jar.save('cookie.txt', ignore_discard=True, ignore_expires=True)
以上代码做了以下几个操作:
- 创建CookieJar实例,用于存储Cookie;
- 创建HTTPCookieProcessor(Cookie处理器)实例,用于处理Cookie;
- 创建打开器(opener)实例,用于发送请求;
- 发送请求,将Cookie保存到CookieJar中;
- 将Cookie保存到文件中。
加载Cookie
对于经过认证的网站,为了保证登录状态,必须将Cookie保存下来,以便下次请求的时候携带上。下面是一个加载Cookie的示例:
import http.cookiejar
import urllib.request
# 创建cookie的实例
cookie_jar = http.cookiejar.LWPCookieJar('cookie.txt')
# 加载cookie
cookie_jar.load(ignore_discard=True, ignore_expires=True)
# 创建cookie处理器
handler = urllib.request.HTTPCookieProcessor(cookie_jar)
# 创建打开器
opener = urllib.request.build_opener(handler)
# 发送请求
response = opener.open('http://www.baidu.com')
# 打印响应内容
print(response.read())
以上代码做了以下几个操作:
- 创建LWPCookieJar实例,并从文件中加载Cookie;
- 创建HTTPCookieProcessor实例,用于处理Cookie;
- 创建打开器(opener)实例,用于发送请求;
- 发送请求,携带Cookie。
在这个示例中,我们使用了http.cookiejar.LWPCookieJar
类,它是http.cookiejar.CookieJar
的子类,它提供了将Cookie保存到disc(本地文件)、ignore_expires、ignore_discard等参数的配置。在加载Cookie的时候,需要从文件中读取。
这里的重点是CookieJar、HTTPCookieProcessor、OpenerDirector三个类的关系。
- CookieJar:管理从服务端发送过来的Cookie以及将Cookie发送回服务端。
- HTTPCookieProcessor:负责处理处理和发送Cookie的处理器。
- OpenerDirector:负责包装操作以及建立连接的类。
以上三个类的功能都比较简单,实际使用的时候可以自定义实现,根据实际需求进行修改。
示例
以一个简单的模拟登录为例,使用Python的Cookie库保存Cookie。
import http.cookiejar
import urllib.request
import urllib.parse
# 登录URL
url = 'https://accounts.douban.com/j/mobile/login/basic'
# 登录信息
data = {
"name": "username",
"password": "password",
"remember": "false",
"ticket": ""
}
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
}
# 创建cookie的实例
cookie_jar = http.cookiejar.LWPCookieJar('cookie.txt')
# 创建cookie处理器
handler = urllib.request.HTTPCookieProcessor(cookie_jar)
# 创建打开器
opener = urllib.request.build_opener(handler)
# 将请求头添加到打开器中
opener.addheaders = [(key, value) for key, value in headers.items()]
# 发送登录请求
response = opener.open(url, urllib.parse.urlencode(data).encode('UTF-8'))
# 保存cookie到文件中
cookie_jar.save(ignore_discard=True, ignore_expires=True)
# 获取资源
response = opener.open('https://www.douban.com')
# 打印响应内容
print(response.read().decode('UTF-8'))
在这个示例中,我们使用Python的HTTP库urllib和Python的Cookie库http.cookiejar来模拟登录。为了保证登录状态,我们将Cookie保存到了本地文件中。