Scrapy如何设置延迟保证网站完全加载后再执行下载操作
首先明确一个误区:直接在Scrapy代码中调用time.sleep()是完全无效的。Scrapy是异步运行的框架,time.sleep()会阻塞整个异步调度逻辑,既不能起到等待页面加载的作用,还会大幅降低爬取效率。
你当前配置的DOWNLOAD_DELAY和自动节流相关参数,作用是控制两次请求发起的间隔,避免请求频率过高被网站封禁,无法解决页面内容未加载完成的问题,根据你遇到的场景分两种方案处理:
静态页面场景(内容由服务端直接生成,无JS动态渲染内容
如果页面本身是静态的,只是服务端响应速度慢导致返回内容不完整,可以在你的custom_settings中新增下载超时配置即可:
custom_settings = { 'USER_AGENT': 'User Agent', 'DOWNLOAD_DELAY': 10.0, 'DOWNLOAD_TIMEOUT': 30, # 下载超时时间设置为30秒,给服务端留足返回完整内容的时间 'AUTOTHROTTLE_ENABLED': True, 'AUTOTHROTTLE_START_DELAY': 3, 'AUTOTHROTTLE_MAX_DELAY': 60, 'AUTOTHROTTLE_TARGET_CONCURRENCY': 1.0, 'AUTOTHROTTLE_DEBUG': False }
动态页面场景(内容靠前端JS执行、异步接口加载内容)
如果页面内容需要JS渲染生成,普通的Scrapy下载器只能拿到原始的未渲染HTML,加多少请求间隔和超时都没有用,需要对接浏览器渲染工具拿到渲染完成的页面,这里推荐用scrapy-playwright实现:
先安装依赖包:
pip install scrapy-playwright
安装完成后执行playwright install安装对应浏览器内核。修改你的
custom_settings添加渲染配置:
custom_settings = { 'USER_AGENT': 'User Agent', 'DOWNLOAD_DELAY': 10.0, 'AUTOTHROTTLE_ENABLED': True, 'AUTOTHROTTLE_START_DELAY': 3, 'AUTOTHROTTLE_MAX_DELAY': 60, 'AUTOTHROTTLE_TARGET_CONCURRENCY': 1.0, 'AUTOTHROTTLE_DEBUG': False, # 新增playwright渲染配置 'DOWNLOAD_HANDLERS': { "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", }, 'PLAYWRIGHT_LAUNCH_OPTIONS': { "headless": True, "timeout": 30 * 1000, }, 'PLAYWRIGHT_DEFAULT_NAVIGATION_TIMEOUT': 30000, }
- 发起请求时添加meta参数控制等待逻辑:
from scrapy_playwright.page import PageMethod yield scrapy.Request( url="你的目标页面URL", meta={ "playwright": True, # 可选1:固定等待3秒,确保所有内容加载完成 "playwright_page_methods": [ PageMethod("wait_for_timeout", 3000) ], # 可选2:等待指定元素加载完成再返回,效率比固定延迟更高效,把下面的注释打开即可 # "playwright_page_methods": [ # PageMethod("wait_for_selector", "你要提取内容对应的CSS选择器", timeout=10000) # ] } )
通过上述配置后,返回的response就是完全渲染完成的页面内容,不会再出现内容缺失的问题。
内容的提问来源于stack exchange,提问作者Python 123
相关产品推荐
相关产品推荐

