urllib 打开器可以在通过代理发送请求的同时维护网站 Cookie。给它两个处理器:

from http.cookiejar import CookieJar
from urllib.request import (
    HTTPCookieProcessor, ProxyHandler, build_opener,
)

cookies = CookieJar()
opener = build_opener(
    ProxyHandler({"http": "http://proxy.example:8080"}),
    HTTPCookieProcessor(cookies),
)
with opener.open("http://www.example.com/", timeout=10) as response:
    body = response.read()

示例使用普通 HTTP 目标及其显式代理路由。若要在不使用代理认证的情况下检查允许访问的公共站点,请为该路由从HTTP 代理列表中选择候选,同时保留预期的 Cookie 罐。对同一网站会话的后续请求复用该 opener。Cookie 处理器会提取可接受的响应 Cookie,并把适用的 Cookie 添加到后续请求中。

每次调用前新建空的 CookieJar 会丢弃这种连续性。让 Cookie 罐与它所代表的会话保持在一起;对于 Cookie 需要彼此隔离的账户或工作流,使用单独的罐。

基本 CookieJar 将状态保存在内存中。若要在程序多次运行之间持久化,请选择合适的 FileCookieJar 子类,并有意识地保存或加载它。

这种安排无需安装全局 opener。调用该对象的 open 方法即可让代理与 Cookie 附着在同一操作上。

相关文章