Scrapy爬取Zappos指定商品评论返回空结果求助
解决Scrapy爬取Zappos评论返回空的问题
问题根源
你遇到的空结果主要有两个原因:
- 评论是动态渲染的:Zappos的用户评论并非直接写在初始HTML里,而是页面加载后通过JavaScript异步加载渲染的,Scrapy默认请求只能拿到静态初始页面,自然抓不到评论内容。
- 代码细节错误:你的URL开头多了个空格,会导致请求异常;CSS选择器里用了HTML转义字符
>,在Scrapy中应该直接写>。
解决方法
1. 先修正代码基础错误
把URL的开头空格去掉,同时修正CSS选择器的转义问题:
import scrapy from scrapy import Request class LaptopSpider(scrapy.Spider): name = 'cs' def start_requests(self): # 去掉URL开头的空格 url = 'https://www.zappos.com/p/lamade-mozza-halter-pullover-black/product/9796103/color/3' yield Request(url, callback=self.parse) def parse(self, response): # 修正选择器的>符号,无需转义 # 先打印响应内容,确认是否有评论相关文本 print(response.text) # 这里可以先尝试找评论容器的选择器,比如实际页面的评论区类名 products_selector = response.css('#productRecap > div.p--z > div:nth-child(3) > div > div > div > div > div.Oi-z > div::text').get() print(products_selector)
2. 处理动态渲染内容
如果打印response.text后搜不到评论关键词,就需要用工具渲染JavaScript页面,推荐用Scrapy官方集成的Playwright:
- 先安装依赖:
pip install scrapy-playwright
- 在项目的
settings.py中添加配置:
DOWNLOAD_HANDLERS = { "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", } PLAYWRIGHT_LAUNCH_OPTIONS = { "headless": True, # 设为False可以看到浏览器运行过程,方便调试 "timeout": 30000, }
- 修改爬虫代码启用Playwright渲染:
import scrapy class LaptopSpider(scrapy.Spider): name = 'cs' def start_requests(self): url = 'https://www.zappos.com/p/lamade-mozza-halter-pullover-black/product/9796103/color/3' # 启用Playwright渲染动态页面 yield scrapy.Request(url, callback=self.parse, meta={"playwright": True}) def parse(self, response): # 这里根据渲染后的实际DOM结构调整选择器,比如找评论内容的容器 review_items = response.css('.review-item') for item in review_items: review_text = item.css('.review-body::text').getall() print(''.join(review_text).strip())
3. 更高效的备选方案:抓评论API接口
打开浏览器开发者工具的Network面板,刷新页面后筛选XHR/fetch请求,找到包含商品ID或"review"关键词的接口(比如Zappos的评论API通常是带商品ID的JSON接口),直接请求该接口获取结构化的评论数据,这种方式比渲染页面速度更快。
注意事项
- Zappos有反爬机制,爬取时要设置合理的
User-Agent请求头,控制请求频率,避免被封禁IP。 - 渲染页面后,要重新用浏览器的开发者工具确认评论区的DOM结构,调整对应的CSS选择器。
内容的提问来源于stack exchange,提问作者Alexkk
相关产品推荐
相关产品推荐

