You need to enable JavaScript to run this app. Splash无法完整渲染网页,Scrapy+Splash爬取站点无数据如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Splash无法完整渲染网页,Scrapy+Splash爬取站点无数据如何解决

Scrapy+Splash 目标站点完整渲染解决方案

以下是可直接落地的配置调整方案:

  • 延长渲染等待时间并指定等待元素
    目标站点的车辆库存列表为异步接口渲染,默认Splash等待时长不足会导致返回半加载页面。在SplashRequest中新增核心配置,等待核心元素渲染完成后再返回结果:
    yield SplashRequest(
        url='https://www.teammitsubishihartford.com/new-inventory/index.htm?compositeType=new',
        callback=self.parse_inventory,
        args={
            'wait': 8, # 基础等待时长,单位秒
            'wait_for': '.vehicle-card', # 等待车辆卡片元素渲染完成,可根据实际页面结构调整选择器
            'timeout': 30, # 全局请求超时时间,避免超时报错
        }
    )
    
  • 新增页面滚动逻辑触发懒加载
    该站点采用滚动懒加载机制,Splash默认不会主动触发滚动行为,可通过传入自定义Lua脚本模拟滚动操作,触发全量列表加载:
    function main(splash, args)
      -- 覆盖无头浏览器特征避免被反爬拦截
      splash:set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
      splash:runjs("Object.defineProperty(navigator, 'webdriver', {get: () => false})")
      assert(splash:go(args.url))
      splash:wait(3)
      -- 模拟滚动到底部触发懒加载
      splash:runjs("window.scrollTo(0, document.body.scrollHeight)")
      splash:wait(4)
      -- 确认车辆卡片元素已加载
      splash:wait_for_resume([[
        const checkExist = setInterval(() => {
          if (document.querySelectorAll('.vehicle-card').length > 0) {
            clearInterval(checkExist)
            resolve()
          }
        }, 500)
      ]], 10)
      return {html = splash:html()}
    end
    
    将上述Lua脚本作为lua_source参数传入SplashRequest的args中即可生效。
  • 移除不必要的资源拦截配置
    如果之前配置了Splash拦截图片、字体等静态资源的规则,建议临时关闭,部分站点的渲染逻辑依赖静态资源加载完成的回调,拦截后会阻塞后续列表数据的渲染。
  • 本地校验渲染结果
    调试阶段可先将Splash返回的HTML内容保存到本地文件后打开,确认车辆列表是否完整渲染,再针对性调整等待时长、元素选择器等参数,避免因选择器匹配错误导致的提取失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 13:45:05