Scrapy爬取亚马逊评论报错:Crawled 0 Pages问题求助
亚马逊评论爬虫爬取失败的排查与修复
核心问题分析
出现Crawled 0 pages, scraped 0 item通常是亚马逊反爬机制拦截了请求,或是页面解析逻辑失效,导致爬虫未获取到有效内容。
具体修复方案
1. 添加请求头模拟浏览器访问
亚马逊会识别非浏览器请求,需在项目settings.py中配置请求头与延迟:
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' DOWNLOAD_DELAY = 2 # 增加下载延迟,降低被封风险
2. 优化链接提取逻辑,增加容错处理
原代码直接提取href属性,若元素不存在会直接报错中断请求,修改parse_see_all_link函数:
def parse_see_all_link(self, response): # 先检查目标元素是否存在 see_all_reviews_link = response.css("a[data-hook=see-all-reviews-link-foot]::attr(href)").get() if see_all_reviews_link: see_all_reviews_url = urljoin('https://www.amazon.it', see_all_reviews_link) yield scrapy.Request(url=see_all_reviews_url, callback=self.parse_reviews, meta={'retry_count': 0}) else: self.logger.warning(f"未找到全量评论链接,页面响应片段:{response.text[:500]}")
3. 增强评论页的反爬应对与解析容错
亚马逊可能返回JS渲染页或验证码页,需增加页面有效性判断,并优化解析逻辑:
def parse_reviews(self, response): retry_count = response.meta.get('retry_count', 0) # 检查页面是否包含评论容器,判断是否被拦截 if not response.css("#cm_cr-review_list"): if retry_count < 3: self.logger.info(f"页面无评论内容,重试第{retry_count+1}次") yield scrapy.Request( url=response.url, callback=self.parse_reviews, dont_filter=True, meta={'retry_count': retry_count + 1}, headers={'User-Agent': self.settings.get('USER_AGENT')} ) else: self.logger.error(f"多次重试后仍无法获取评论,URL:{response.url}") return # 提取下一页链接 next_page_relative_url = response.css(".a-pagination .a-last>a::attr(href)").get() if next_page_relative_url: next_page = urljoin('https://www.amazon.it/', next_page_relative_url) yield scrapy.Request( url=next_page, callback=self.parse_reviews, meta={'retry_count': 0}, headers={'User-Agent': self.settings.get('USER_AGENT')} ) # 解析评论数据,增加字段容错 review_elements = response.css("#cm_cr-review_list div.review") for review_element in review_elements: # 评分提取容错处理 rating_text = review_element.css("*[data-hook*=review-star-rating] ::text").re_first(r"(\d+\.*\d*) out") rating = rating_text if rating_text else None yield { "text": "".join(review_element.css("span[data-hook=review-body] ::text").getall()).strip(), "title": review_element.css("*[data-hook=review-title]>span::text").get(), "location_and_date": review_element.css("span[data-hook=review-date] ::text").get(), "verified": bool(review_element.css("span[data-hook=avp-badge] ::text").get()), "rating": rating, }
4. 启用Scrapy内置重试与重定向机制
在settings.py中开启相关配置,提升爬虫稳定性:
RETRY_ENABLED = True RETRY_TIMES = 3 RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 404, 429] REDIRECT_ENABLED = True
运行验证
修改完成后,执行以下命令启动爬虫并导出CSV:
scrapy crawl amazon_reviews -o reviews.csv
若仍失败,可在settings.py中设置LOG_LEVEL = 'DEBUG'查看详细日志,确认是否遇到验证码或IP拦截,必要时可添加代理IP进一步绕过反爬。
内容的提问来源于stack exchange,提问作者davide petruzzi
相关产品推荐
相关产品推荐

