为每个 Splash 资源选择代理
当单个资源需要不同路由时,可在渲染范围内或 on_request 回调中选择 Splash 代理。
Scrapy 请求可以成功连接到 Splash,但 Splash 内部的浏览器仍需要不同的出站路由。这是两个连接:
Scrapy → Splash API
Splash browser → forward proxy → website若每次渲染只用一个代理,请传入 HTTP API 的 proxy 参数。Splash 3.5 记录了诸如 http://proxy.example:8080 的代理 URL,或已配置的 proxy-profile 名称。其 URL 格式还支持 SOCKS5 和可选凭据。
当页面中的单个资源需要不同端点时,请使用 execute 脚本,并在导航前注册选择逻辑:
function main(splash, args)
splash:on_request(function(request)
local host = args.default_proxy
if request.url == args.special_resource then
host = args.special_proxy
end
request:set_proxy{host = host, port = 8080, type = 'HTTP'}
end)
assert(splash:go(args.url))
return splash:html()
end将 default_proxy 和 special_proxy 作为主机名传入,并将 special_resource 作为需单独路由的资源的确切 URL。当两个监听端口不同时,替换示例中的单一端口。其他资源走默认路由。在允许访问公共资源路由且未对候选应用代理凭据时,HTTP 代理列表可为这些主机和端口字段提供端点候选。
request 方法接受可选的 username 和 password 字段。类型为 HTTP 时,HTTPS 目标通过该 HTTP 代理使用 CONNECT;它们不需要虚构的 HTTPS 代理类型。
回调在每次请求之前运行。它的 request 方法无法修改已发送的请求,回调也不能调用 splash:go 或 splash:wait 等异步 Splash 方法。
当页面期望单一会话或来源身份时,请保持路由选择稳定。把每个图像和 API 请求随机分配到另一个出口,可能产生一个渲染页面,其请求不再属于同一连贯会话。