为什么Splash无法呈现此网页?

时间:2020-08-22 22:21:01

标签: web-scraping scrapy screen-scraping scrapy-splash splash-js-render

我对Splash还是很陌生,因此我能够在Ubuntu 18上(通过Splash / Docker)在Splash上​​安装Splash,这为该页面提供了不同的结果: https://www.overstock.com/Home-Garden/Area-Rugs/31446/subcat.html

通常以如下方式呈现: enter image description here

但是当我尝试在Splash中渲染它时,它会这样渲染: enter image description here

我尝试将Splash中的用户代理更改为此:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36

因此,这使得Splash脚本如下:

function main(splash, args)
  splash:set_user_agent(
  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'
  )
  assert(splash:go(args.url))
  assert(splash:wait(0.5))
  return {
    html = splash:html(),
    png = splash:png(),
    har = splash:har(),
  }
end

尽管有这些添加,它仍然无法呈现页面。

如何使Splash呈现此页面?

1 个答案:

答案 0 :(得分:0)

似乎overstock.com需要一个ConnectionAccept标头。将其添加到您的请求,它应该可以正常工作。 在Postman上测试,带有和不带有Connection: keep-alive && Accept: */*标头;我得到了相同的错误页面:

enter image description here

添加上面的两个标题后:

enter image description here

因此,您的请求应进行相应的编辑:

function main(splash, args)
  splash:set_custom_headers({
     ["Connection"] = "keep-alive",
     ["Accept"] = "*/*",
  })
  assert(splash:go(args.url))
  assert(splash:wait(0.5))
  return {
    html = splash:html(),
    png = splash:png(),
    har = splash:har(),
  }
end