Python中如何使用原生库复用Cookie
现在在写一个需求类似于爬虫的小脚本,然后那个软件是用 http authentacion 进行认证的 想问问大佬们,我用 cookielib 把 cookie 保存之后,如何再去使用他来登陆网站应用? 现在的问题是不能复用 cookie 的我,我直接访问,会出现 401 认证错误。所以如何解决这个问题呢?
Python中如何使用原生库复用Cookie
登陆的部分函数是这样的:
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存到文件里下次再用,可以用MozillaCookieJar或LWPCookieJar:
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 么 你用错了
不能用第三方库?难道用的 ios 上的 Pythonista ?
python 牛 B 的地方就在第三方库~ 不让用的话的确是扬短避长啊~


