You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Splash无法获取完整页面求助:Docker部署下渲染目标页面失败

解决Splash渲染warframe.market时React容器无内容的问题

我之前踩过类似的动态页面渲染坑,结合warframe.market的网站特性,给你梳理几个最可能的原因和实操性的解决思路:

1. 网站反爬虫机制识别了Splash的"非人类"特征

warframe.market这类游戏交易站反爬虫做得比较严格,Splash默认的浏览器指纹(比如User-Agent、WebGL/Canvas特征)和真实浏览器差异明显,很容易被判定为爬虫,导致页面故意不加载核心内容。

解决方法

  • 启动Splash时指定真实的浏览器User-Agent:
    docker run -p 8050:8050 scrapinghub/splash --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    
  • 用Lua脚本模拟更真实的请求头和交互,比如添加Referer、模拟鼠标移动:
    function main(splash, args)
      -- 设置接近真实浏览器的请求头
      splash:set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
      splash:set_custom_headers({
        ["Accept-Language"] = "en-US,en;q=0.9",
        ["Referer"] = "https://www.google.com/"
      })
      -- 模拟鼠标移动,触发页面初始化逻辑
      splash:go(args.url)
      splash:mouse_move(100, 100)
      -- 等待React容器内出现内容,而不是固定等待时间
      splash:wait_for_element("#warframe_react > div")
      return { html = splash:html() }
    end
    

2. 页面依赖的第三方资源加载失败

warframe.market依赖大量CDN托管的JS、CSS资源和API接口,如果Splash的网络环境无法访问这些资源(比如公司防火墙拦截、地区限制),React就无法完成初始化渲染。

解决方法

  • 启动Splash时开启verbose模式,仔细查看日志里的资源请求状态:
    docker run -p 8050:8050 scrapinghub/splash --verbose
    
    重点看有没有403/404状态码的请求,如果有,排查是否是网络限制导致的,必要时给Splash配置代理:
    docker run -p 8050:8050 scrapinghub/splash --proxy-protocol http --proxy-host your-proxy-ip --proxy-port your-proxy-port
    

3. React初始化需要特定的交互触发

有些单页应用会等待用户的交互动作(比如滚动、鼠标移动)或者特定的窗口大小才会加载核心内容,Splash默认的无交互、小窗口模式可能触发不了渲染逻辑。

解决方法

  • 启动Splash时设置接近真实桌面的窗口大小:
    docker run -p 8050:8050 scrapinghub/splash --viewport-width 1920 --viewport-height 1080
    
  • 在Lua脚本中模拟滚动操作,强制触发内容加载:
    function main(splash, args)
      splash:go(args.url)
      -- 模拟滚动到页面底部
      splash:runjs("window.scrollTo(0, document.body.scrollHeight);")
      splash:wait(3)
      return { html = splash:html() }
    end
    

4. Splash的JS引擎版本过时

如果你的Splash镜像版本较旧,内置的Qt WebEngine可能不支持warframe.market使用的新JS语法或React特性,导致JS执行失败,无法渲染内容。

解决方法

  • 拉取最新版本的Splash镜像重新运行:
    docker run -p 8050:8050 scrapinghub/splash:latest
    

内容的提问来源于stack exchange,提问作者P. Daimaou

火山引擎 最新活动