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

Scrapy XPath返回空列表:爬取Yelp餐厅评论遇到的问题

解决Yelp评论爬取时Scrapy XPath返回空列表的问题

可能的原因及对应解决方法

1. 页面动态渲染导致Scrapy拿到原始HTML

Chrome控制台能获取到元素是因为浏览器执行JavaScript渲染了动态内容,但Scrapy默认下载的是服务器返回的原始静态HTML,没有这部分动态加载的评论内容。

解决方法:

  • 使用支持JS渲染的Scrapy扩展,比如scrapy-playwright:
    1. 安装依赖:pip install scrapy-playwright
    2. 在Scrapy项目的settings.py中配置:
      DOWNLOAD_HANDLERS = {
          "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
          "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
      }
      PLAYWRIGHT_LAUNCH_OPTIONS = {"headless": True}
      
    3. 在请求中启用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(根据实际页面结构调整)
  • 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:27:04