Scrapy-Splash已停止维护,官方推荐迁移到Playwright或Selenium;若必须使用,需确保独立运行Splash服务(如Docker容器)、正确配置SPLASH_URL、启用SplashMiddleware并禁用RedirectMiddleware,且Lua脚本需主动断言与调试以应对React/Vue hydration问题。

Scrapy-Splash 本身已停止维护,官方推荐迁移到 Playwright 或 Selenium;若必须用 Splash,请确认你有独立运行的 Splash 服务(docker run -p 8050:8050 scrapinghub/splash),且 Scrapy 项目配置正确——否则 scrapy crawl 会卡在等待响应或直接报 ConnectionRefusedError。
为什么 SplashRequest 发出去没返回?
最常见原因是 Splash 服务没起来,或 Scrapy 没配对通信协议。Splash 默认只监听 localhost:8050,而 Docker 容器内运行时,Scrapy 若跑在宿主机,需确认容器端口映射是否生效(curl http://localhost:8050/_debug 应返回 JSON);若 Scrapy 也跑在 Docker 里,得用容器名(如 http://splash:8050)而非 localhost。
- 检查 Splash 日志:
docker logs,看是否有listening on 0.0.0.0:8050 - Scrapy 的
settings.py必须设SPLASH_URL = 'http://localhost:8050'(或对应地址) -
SplashRequest的url参数必须是完整 URL(含http://),不能是相对路径 - 如果用了
render.html接口但页面含跨域 JS,Splash 默认不加载——需显式加html=1和wait=2,并考虑allowed_domains白名单
SplashRequest 和普通 Request 混用要注意什么?
Scrapy 中 SplashRequest 是 scrapy.Request 的子类,但中间件处理逻辑不同:它依赖 SplashMiddleware 注入渲染逻辑,所以必须启用该中间件,且顺序要在 HttpCompressionMiddleware 之后、RedirectMiddleware 之前。
- 在
settings.py中启用:'scrapy_splash.SplashCookiesMiddleware': 725和'scrapy_splash.SplashMiddleware': 725 - 禁用默认重定向中间件(
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': None),否则 Splash 渲染后的跳转会丢失上下文 - 不要在
parse方法里对SplashResponse直接调.css()—— 先用response.body看原始 HTML 是否含目标内容;有时 JS 渲染后 DOM 结构和预想不同 - 混用时,记得给
SplashRequest加meta={'splash': {'endpoint': 'render.html', 'args': {'html': 1, 'wait': 2}}},否则可能走默认execute端点,返回空响应
如何调试 lua_source 脚本失败?
自定义 Lua 脚本(比如滚动到底部再截图)出错时,Splash 不会把错误堆栈透传给 Scrapy,默认只返回 HTTP 500 或空 body。必须主动捕获并打印错误。
- 脚本开头加
assert(splash:go(args.url)),否则go失败会静默继续 - 关键步骤后加
assert(splash:wait(1)),避免因 JS 未就绪就执行下一步 - 用
splash:evaljs("console.log('xxx')")输出调试信息,配合splash:har()查看网络请求是否触发 - 在
SplashRequest中设置args={'html': 1, 'png': 1}并检查response.data['png']是否为空,能快速判断脚本是否执行到末尾
真正麻烦的不是写 Lua 脚本,而是 Splash 对现代前端框架(React/Vue)的 hydration 行为支持有限——比如组件 mount 后才动态插入数据,但 wait 时间不够或没监听 DOMContentLoaded,就会抓到空容器。这时候得结合 splash:runjs() + document.querySelectorAll 轮询,而不是盲目加长 wait。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











