【问题标题】:Why won't Splash render this webpage?为什么 Splash 不渲染此网页?
【发布时间】:2025-11-27 06:20:03
【问题描述】:

我对 Splash 很陌生,虽然我能够在我的 Ubuntu 18 上(通过 Splash/Docker)设置 Splash,但它给了我这个页面不同的结果: https://www.overstock.com/Home-Garden/Area-Rugs/31446/subcat.html

通常它是这样渲染的:

但是当我尝试在 Splash 中渲染它时,它会像这样渲染它:

我已尝试将 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 呈现此页面?

【问题讨论】:

  • 如果你想要一个快速的解决方案,使用 scrapy-selenium,docker splash 已经过时了。如果你想飞溅,你必须手动安装并修改它
  • @wishmaster,你的意思是把scrapy-selenium和Splash放在同一个docker中吗?
  • 如果你使用 selenium (scrapy-selenium),则根本不需要飞溅

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


【解决方案1】:

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

添加上面两个表头后:

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

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

【讨论】:

  • 使用这个后仍然得到相同的结果。
  • @rom 我仍然猜测您缺少请求标头。尝试使用 API 开发平台(例如 Postman)来复制您在 Splash 之外遇到的问题并使用标头。