python使用cookie库操保存cookie详解

  • Post category:Python

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)

以上代码做了以下几个操作:

  1. 创建CookieJar实例,用于存储Cookie;
  2. 创建HTTPCookieProcessor(Cookie处理器)实例,用于处理Cookie;
  3. 创建打开器(opener)实例,用于发送请求;
  4. 发送请求,将Cookie保存到CookieJar中;
  5. 将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())

以上代码做了以下几个操作:

  1. 创建LWPCookieJar实例,并从文件中加载Cookie;
  2. 创建HTTPCookieProcessor实例,用于处理Cookie;
  3. 创建打开器(opener)实例,用于发送请求;
  4. 发送请求,携带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保存到了本地文件中。