Scrapy爬虫首页数据正常,无法提取下一页数据问题排查
问题排查与修复方案
你的爬虫第一页正常但翻页后无法获取数据,核心问题出在翻页链接定位不健壮、商品选择器依赖不稳定的页面类,以及缺少基础反爬处理,以下是具体修复:
1. 核心问题分析
- 翻页链接硬编码层级:你用的XPath依赖固定的div索引(如
div[52]),亚马逊页面结构会随页码、结果数量变化,导致无法正确抓取下一页链接。 - 商品选择器不可靠:
div.sg-col-4-of-12是布局类名,不同页码/设备渲染可能会改变,导致后续页面找不到商品容器。 - 反爬检测拦截:默认Scrapy请求的User-Agent会被亚马逊识别为爬虫,后续页面可能返回验证码或空内容。
2. 修改后的爬虫代码
import scrapy from amazonscraper.items import AmazonscraperItem from scrapy.loader import ItemLoader class AmazonspiderSpider(scrapy.Spider): name = 'amazonspider' allowed_domains = ['amazon.com'] start_urls = ['https://www.amazon.com/s?i=fashion-womens-intl-ship&bbn=16225018011&rh=n%3A16225018011%2Cn%3A1040660%2Cn%3A1045024&pd_rd_r=2da30763-bfe6-4a38-b17a-77236fa718c5&pd_rd_w=JtaUW&pd_rd_wg=BtgRm&pf_rd_p=6a92dcea-e071-4bb9-866a-369bc067390d&pf_rd_r=86NBFKV4TA7CCSEVNBM7&qid=1671522114&rnid=1040660&ref=sr_pg_1'] def parse(self, response): # 用亚马逊官方定义的商品容器属性定位,稳定性更高 products = response.css('div[data-component-type="s-search-result"]') for product in products: l = ItemLoader(item=AmazonscraperItem(), selector=product) # 通用商品名称选择器,避免依赖可变类名 l.add_css('name', 'h2 a span') l.add_css('price', 'span.a-price span.a-offscreen') l.add_css('review', 'i.a-icon span.a-icon-alt') yield l.load_item() # 用翻页按钮的标准类名定位,不依赖页面层级 next_page = response.css('a.s-pagination-item.s-pagination-next::attr(href)').get() if next_page: # response.follow自动补全域名,无需手动拼接 yield response.follow(next_page, callback=self.parse)
3. 补充反爬配置(修改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' # 设置请求延迟,降低被封禁概率 DOWNLOAD_DELAY = 2 # 可选:若亚马逊robots.txt限制爬虫,可关闭遵循(注意合规性) # ROBOTSTXT_OBEY = False
4. 关键修改说明
- 商品容器:
div[data-component-type="s-search-result"]是亚马逊搜索结果的标准标识,不受页面布局变化影响。 - 翻页链接:通过翻页按钮的专属类名
a.s-pagination-item.s-pagination-next定位,完全脱离硬编码层级,适配所有页码。 - 反爬处理:真实User-Agent让请求模拟浏览器行为,下载延迟降低请求频率,减少被拦截风险。
5. 调试建议
如果仍有问题,开启DEBUG日志查看响应内容:
scrapy crawl amazonspider -s LOG_LEVEL=DEBUG
检查后续页面是否返回验证码,若出现验证码,需考虑添加代理IP或使用Cookie池进一步规避反爬。
内容的提问来源于stack exchange,提问作者Miracle
相关产品推荐
相关产品推荐

