Python中如何使用原生库复用Cookie

现在在写一个需求类似于爬虫的小脚本,然后那个软件是用 http authentacion 进行认证的 想问问大佬们,我用 cookielib 把 cookie 保存之后,如何再去使用他来登陆网站应用? 现在的问题是不能复用 cookie 的我,我直接访问,会出现 401 认证错误。所以如何解决这个问题呢?


Python中如何使用原生库复用Cookie
11 回复

登陆的部分函数是这样的:
base64string = base64.encodestring(
“%s:%s” % (username, password))[:-1] # 注意哦,这里最后会自动添加一个\n
authheader = “Basic %s” % base64string
cookie = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
req = urllib2.Request(url=url)
req.add_header(“Authorization”, authheader)
response = opener.open(req)


在Python里直接用标准库处理Cookie复用,最直接的就是用http.cookiejar配合urllib.request。简单来说,就是创建一个CookieJar对象来存Cookie,然后把它装进OpenerDirector里,之后所有的请求都用这个opener发,它就会自动处理Cookie的存储和发送了。

下面是个完整例子,模拟登录然后访问需要登录的页面:

import urllib.request
import urllib.parse
from http.cookiejar import CookieJar

# 1. 创建CookieJar和处理器
cookie_jar = CookieJar()
cookie_handler = urllib.request.HTTPCookieProcessor(cookie_jar)

# 2. 创建能处理Cookie的opener
opener = urllib.request.build_opener(cookie_handler)

# 3. 模拟登录(假设登录接口和参数)
login_url = 'https://example.com/login'
login_data = urllib.parse.urlencode({
    'username': 'your_username',
    'password': 'your_password'
}).encode('utf-8')

# 发送登录请求,CookieJar会自动保存返回的Cookie
login_request = urllib.request.Request(login_url, data=login_data)
opener.open(login_request)

# 4. 访问需要登录的页面,之前保存的Cookie会自动带上
protected_url = 'https://example.com/dashboard'
protected_request = urllib.request.Request(protected_url)
response = opener.open(protected_request)

print(response.read().decode('utf-8'))

关键就两步:建一个CookieJar,然后用HTTPCookieProcessor把它绑到opener上。之后所有用这个opener发的请求都会自动处理Cookie,包括把服务器返回的Cookie存下来,以及下次请求时自动把对应的Cookie发回去。

如果你需要把Cookie存到文件里下次再用,可以用MozillaCookieJarLWPCookieJar

from http.cookiejar import MozillaCookieJar

# 创建MozillaCookieJar实例
cookie_jar = MozillaCookieJar('cookies.txt')
# 加载之前保存的Cookie(如果文件存在)
try:
    cookie_jar.load(ignore_discard=True, ignore_expires=True)
except FileNotFoundError:
    pass

# 创建处理器和opener(同上)
cookie_handler = urllib.request.HTTPCookieProcessor(cookie_jar)
opener = urllib.request.build_opener(cookie_handler)

# ... 使用opener发送请求 ...

# 请求完成后保存Cookie到文件
cookie_jar.save(ignore_discard=True, ignore_expires=True)

requests库的话更简单,直接用Session对象就行,它内部自动处理Cookie复用。

总结:用http.cookiejar配合urllib.request就能搞定原生库的Cookie复用。

无脑 pickle 吧

为什么一定要用原声库呢? requests 不好么?

用 requests 很方便啊。

环境依赖问题,要求不能用第三方的库

pickle 序列化、反序列化

不说别的 你知道为啥会加\n 么 你用错了

http authentacion 认证的一般不用管 cookie 了,所有请求头部都带上认证信息就行了

不能用第三方库?难道用的 ios 上的 Pythonista ?

python 牛 B 的地方就在第三方库~ 不让用的话的确是扬短避长啊~

回到顶部