Scrapy XPath返回空列表:爬取Yelp餐厅评论遇到的问题
解决Yelp评论爬取时Scrapy XPath返回空列表的问题
可能的原因及对应解决方法
1. 页面动态渲染导致Scrapy拿到原始HTML
Chrome控制台能获取到元素是因为浏览器执行JavaScript渲染了动态内容,但Scrapy默认下载的是服务器返回的原始静态HTML,没有这部分动态加载的评论内容。
解决方法:
- 使用支持JS渲染的Scrapy扩展,比如
scrapy-playwright:- 安装依赖:
pip install scrapy-playwright - 在Scrapy项目的
settings.py中配置:DOWNLOAD_HANDLERS = { "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", } PLAYWRIGHT_LAUNCH_OPTIONS = {"headless": True} - 在请求中启用Playwright:
yield scrapy.Request(url, meta={"playwright": True})
- 安装依赖:
- 也可使用
scrapy-splash,通过Splash服务完成JS页面渲染。
2. 动态CSS类名导致XPath失效
Yelp的CSS类名(比如css-1qn0b6x)是动态生成的,不同请求返回的页面中类名可能不一致,Chrome控制台测试的类名和Scrapy拿到的页面类名不匹配。
解决方法:
- 更换不依赖动态类名的选择器,比如基于元素结构或固定属性:
- 查找带固定测试ID的元素:
//li[@data-testid='review'](Yelp评论通常带有该属性) - 基于评论容器层级结构定位:
//div[contains(@class, 'review-container')]/../li(根据实际页面结构调整)
- 查找带固定测试ID的元素:
- 在Scrapy Shell中先执行
response.text查看页面内容,搜索评论相关关键词,确认实际存在的元素结构后再编写XPath。
3. 请求头模拟不足触发反爬
Scrapy默认请求头与浏览器差异较大,Yelp可能返回精简页面或空内容进行反爬限制。
解决方法:
- 在
settings.py中设置浏览器级别的User-Agent:USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" - 还可添加其他常用浏览器请求头,在请求时传入:
headers = { "Accept-Language": "it-IT,it;q=0.9", "Referer": "https://www.yelp.it/" } yield scrapy.Request(url, headers=headers)
内容的提问来源于stack exchange,提问作者Rodolfo
相关产品推荐
相关产品推荐

