更换代理并不会自动更换爬虫的 Cookie。对于同一个持续的会话,这可能很有用;而当多个独立会话共用同一个爬虫时,结果可能出人意料。

Scrapy 的 Cookie 中间件支持用请求的 cookiejar 元数据来选择不同的 Cookie 罐。请给这个键一个你确实打算保留的身份:

yield scrapy.Request(
    'https://example.com/start',
    meta={'proxy': selected_proxy, 'cookiejar': 'workflow-17'},
)

出口端点和 Cookie 罐的键是两个独立的决定。未经身份验证的公开抓取可以从HTTP 代理列表中选择允许该路径的 HTTP 端点;而 Cookie 罐的键仍然归工作流所有。本应留在这个会话里的后续请求需要同一个罐键;这些元数据不会自动粘附到你创建的每个新请求上。请按工作流的需要传递具体字段,而不是不加分辨地复制所有中间件元数据。

把代理地址当作 Cookie 罐的键只是一种策略

这种捷径只是按端点对状态分组。它不一定按人、账户或公网出口分组。同一个服务商端点可以轮换出口,多个账户也可以共用同一个端点。

对于需要稳定状态的授权工作流,请分别记录账户/会话标识、Cookie 罐标识和所选择的路径。如果你决定在中途更换路径,也要一并决定应用会话应当如何处理。

分开的 Cookie 罐可以防止你划定的分组之间意外共享 Cookie。但它们并不保证某个目标站点无法通过账户或其他应用数据把两次请求关联起来。

如果在更换 IP 后仍然出现错误的页面,请先查看是哪个 Cookie 罐发出了该请求,再决定清空所有 Cookie 或更换整个代理池。保留的状态很可能足以解释这个页面。

相关文章