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

Scrapy结合Splash时CSS选择器无法获取动态页面数据如何解决

Scrapy+Splash无法提取动态加载分页标签的排查方案

核心问题排查方向

  • 响应被覆盖:你进入Scrapy shell后执行的fetch('https://analisi.transparenciacatalunya.cat/...')是Scrapy原生HTTP请求,完全绕过了Splash渲染服务,直接返回未执行JS的静态页面源码。此时响应状态码200仅代表原始页面可访问,静态源码里根本不存在JS动态生成的span.pager-label元素,自然提取结果为空。
  • Splash请求格式错误:你启动shell时传入的Splash地址存在双引号嵌套问题,URL解析逻辑会被截断,Splash实际没有正确接收到目标页面地址;同时默认Splash渲染等待时间仅0.5秒左右,Socrata平台的表格组件加载需要2-5秒,等待时间不足时Splash会在元素渲染完成前就返回HTML,同样拿不到目标内容。
  • CSS选择器鲁棒性差:你使用的从#app开始的全层级CSS选择器对DOM结构变化极其敏感,前端只要微调任意一层嵌套容器的class或层级,选择器就会直接失效。

可直接落地的解决步骤

  1. 修正Splash启动请求,解决引号嵌套、等待时间不足的问题,启动命令如下:
scrapy shell "http://localhost:8050/render.html?url=https%3A%2F%2Fanalisi.transparenciacatalunya.cat%2Fes%2FEnergia%2FCertificats-d-efici-ncia-energ-tica-d-edificis%2Fj6ii-t3w2&wait=5&timeout=10"

参数说明:目标URL做URL编码避免解析异常,wait=5指定页面加载完成后额外等待5秒保障表格、分页组件渲染完成,timeout=10拉长超时时间避免大体积资源加载中断。

  1. 进入Scrapy shell后不要执行原生fetch命令,直接使用精简后的CSS选择器提取内容:
# 抛弃全层级路径,直接定位目标元素的独有class,抗DOM结构变化能力更强
response.css('span.pager-label::text').get()
  1. 如果仍提取失败,先打开本地Splash的Web调试页(默认地址http://localhost:8050),输入目标URL并设置相同的等待参数,通过渲染截图、返回源码确认是否触发了平台反爬、是否真的加载出了分页标签。

更稳定的替代方案

该站点基于Socrata开放数据平台搭建,所有公开数据集提供原生数据API,完全不需要爬取渲染前端页面:

  • 要获取表格总行数,直接调用统计接口即可,返回结构化JSON数据,无动态加载问题,准确率远高于前端分页标签提取:
# 接口返回格式为[{"count":"1341412"}],数值和你提供的参考值一致
fetch('https://analisi.transparenciacatalunya.cat/resource/j6ii-t3w2.json?$select=count(*)')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:01:06