You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Scrapy+Splash抓取数据时Splash无法渲染完整页面求助

解决Scrapy+Splash页面渲染不完整的可行方案

我之前处理过不少Scrapy+Splash的渲染问题,针对你说的页面渲染不完整、关键信息缺失的情况,给你几个经过验证的解决方案:

  • 模拟页面交互触发动态加载
    很多页面的内容不是一次性加载的,需要滚动、点击等交互才会触发后续内容渲染,单纯增加等待时长没用。你可以用Splash的Lua脚本模拟这些操作,比如循环滚动到底部:

    function main(splash)
        splash:go(splash.args.url)
        splash:wait(2) -- 初始等待页面框架加载
        -- 模拟滚动到底部3次,每次等待1秒让内容加载
        for i=1,3 do
            splash:runjs("window.scrollTo(0, document.body.scrollHeight)")
            splash:wait(1)
        end
        return splash:html()
    end
    

    如果页面有需要点击的加载按钮,也可以用splash:runjs()模拟点击操作。

  • 对齐浏览器请求头信息
    部分网站会根据请求头(比如User-Agent、Accept)识别爬虫,返回简化版页面。你需要让Splash的请求头和真实浏览器保持一致:

    yield SplashRequest(
        url=target_url,
        callback=self.parse_item,
        args={
            'wait': 3,
            'headers': {
                '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',
                'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                'Accept-Language': 'zh-CN,zh;q=0.9'
            }
        }
    )
    
  • 禁用缓存并启用私有模式
    Splash的缓存可能导致页面重复加载旧内容,你可以在请求参数中禁用缓存,同时开启私有模式确保会话隔离:

    yield SplashRequest(
        url=target_url,
        callback=self.parse_item,
        args={
            'wait': 3,
            'cache': 0,  # 禁用缓存
            'private_mode': True  # 开启私有模式
        }
    )
    
  • 调整视口分辨率适配页面布局
    有些页面会根据视口大小加载不同内容(比如移动端和桌面端差异),设置和桌面浏览器一致的视口尺寸可能解决问题:

    function main(splash)
        splash:set_viewport_size(1920, 1080) -- 设置桌面端分辨率
        splash:go(splash.args.url)
        splash:wait(3)
        return splash:html()
    end
    
  • 排查资源加载失败或JS报错
    页面渲染不完整可能是因为某些关键JS或资源加载失败,你可以开启HAR日志功能排查问题:

    yield SplashRequest(
        url=target_url,
        callback=self.parse_item,
        args={
            'wait': 3,
            'har': 1  # 开启HAR日志
        }
    )
    
    def parse_item(self, response):
        har_log = response.data['har']['log']
        # 遍历检查每个资源的加载状态
        for entry in har_log['entries']:
            req_url = entry['request']['url']
            status_code = entry['response']['status']
            if status_code >= 400:
                print(f"资源加载失败: {req_url},状态码: {status_code}")
    

    如果发现有JS报错,也可以在Lua脚本中开启日志查看:splash:set_debug(true)

内容的提问来源于stack exchange,提问作者Genfood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:34:33