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 请求随机分配到另一个出口,可能产生一个渲染页面,其请求不再属于同一连贯会话。

相关文章