Scrapy 怎么用代理?环境变量和 meta 谁优先?代理 URL 里的用户名密码怎么发?https 怎么走?这篇用一个能记录原始请求的假代理,看代理实际收到的每一个字节。
代理收到:GET http://127.0.0.1:9961/a HTTP/1.1
Host=127.0.0.1:9961 Proxy-Authorization=(无)
代理收到:GET http://127.0.0.1:9961/b HTTP/1.1
Host=127.0.0.1:9961 Proxy-Authorization=Basic dXNlcjpwQHNzOnc= → 解码 'user:p@ss:w'
源站直接收到的请求:[](经过代理的请求没有直连源站);回调拿到的正文:['<html>via-proxy</htm', '<html>via-proxy</htm']请求的 meta["proxy"] 指向代理 URL;代理 URL 里的用户名密码被转成 Proxy-Authorization: Basic,先做百分号解码。
http_proxy=http://127.0.0.1:<代理>:代理收到 ['env', 'meta-override'](含 meta-override);源站直接收到 ['/meta-none'](meta-none 绕过了环境变量代理) 只设 https_proxy:代理收到 ['meta-override'];源站直接收到 ['/env', '/meta-none'](http 请求不走 https_proxy;meta-override 仍走 meta 里指定的代理) http_proxy + no_proxy=127.0.0.1:代理收到 ['meta-override'];源站直接收到 ['/env', '/meta-none'](命中 no_proxy 的主机不走环境变量代理,meta 指定的仍走) 只设大写 HTTP_PROXY:代理收到 ['env', 'meta-override'];源站直接收到 ['/meta-none'] HTTPPROXY_ENABLED=0:代理收到 ['meta-override'];源站直接收到 ['/env', '/meta-none']
中间件初始化时读取 http_proxy、https_proxy、no_proxy(大小写均可),按请求协议选代理;meta["proxy"] 优先,设为 None 则这个请求直连。
代理收到:CONNECT secure.example.test:443 HTTP/1.1;Host=secure.example.test:443;Proxy-Authorization 解码='alice:s3cret';Proxy-Connection=(无)
回调/errback:[{'who': 'errback', 'exc': 'scrapy.exceptions.DownloadFailedError', 'msg': '[<twisted.python.failure.Failure twisted.internet.error.ConnectionLost: Connecti', 't': 342.4}]HTTPPROXY_ENABLED = 0 只让环境变量代理失效,请求 meta 里的 proxy 依然会被下载处理器使用。
事件 [{'who': 'errback', 'exc': 'HttpError', 'status': 407}];代理收到 1 次;源站收到 []https 先发 CONNECT 建立隧道;代理要求认证返回 407 时按普通的 4xx 处理。