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脚本模拟滚动操作,触发全量列表加载:
将上述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()} endlua_source参数传入SplashRequest的args中即可生效。 - 移除不必要的资源拦截配置
如果之前配置了Splash拦截图片、字体等静态资源的规则,建议临时关闭,部分站点的渲染逻辑依赖静态资源加载完成的回调,拦截后会阻塞后续列表数据的渲染。 - 本地校验渲染结果
调试阶段可先将Splash返回的HTML内容保存到本地文件后打开,确认车辆列表是否完整渲染,再针对性调整等待时长、元素选择器等参数,避免因选择器匹配错误导致的提取失败。
内容的提问来源于stack exchange,提问作者Vinu Abraham
相关产品推荐
相关产品推荐

