如何抓取Amazon每日特惠全量数据?Scrapy+Playwright加载问题
问题分析与解决方法
核心问题
你遇到的情况是因为Amazon的Today's Deals页面采用滚动加载机制:初始仅渲染30条特惠,剩余内容需要滚动页面到底部才会触发加载。另外日志显示httpcache/hit: 2,说明请求命中了本地缓存,可能拿到的是未完全加载的旧页面数据。
解决方案
1. 关闭HTTP缓存
修改配置文件settings.py,禁用缓存避免拿到旧数据:
HTTPCACHE_ENABLED = False
2. 实现滚动加载逻辑
修改爬虫代码,利用Playwright的页面对象执行滚动操作,触发全部内容加载:
import logging import scrapy from scrapy_playwright.page import PageCoroutine class Amztest1Spider(scrapy.Spider): name = "amztest1" def start_requests(self): url = 'https://www.amazon.com/gp/goldbox' yield scrapy.Request( url, meta=dict( playwright=True, playwright_include_page=True, playwright_page_coroutines=[ # 等待初始内容加载完成 PageCoroutine("wait_for_selector", "div[data-testid='deal-card']"), ], errback=self.errback, ) ) async def parse(self, response): page = response.meta["playwright_page"] previous_count = 0 current_count = len(await page.query_selector_all("div[data-testid='deal-card']")) # 循环滚动直到内容不再新增 while current_count > previous_count: previous_count = current_count # 滚动到页面底部 await page.evaluate("window.scrollTo(0, document.body.scrollHeight)") # 等待新内容加载(可根据网络情况调整时长) await page.wait_for_timeout(2000) # 更新当前内容数量 current_count = len(await page.query_selector_all("div[data-testid='deal-card']")) # 获取全部特惠链接 deal_links = await page.query_selector_all("div[data-testid='deal-card'] a") links = [await link.get_attribute("href") for link in deal_links] logging.debug(f"PRODUCT COUNT: {len(links)}") # 输出或处理抓取到的链接 for link in links: yield {"deal_url": link} await page.close() async def errback(self, failure): page = failure.request.meta["playwright_page"] await page.close()
3. 补充说明
- 滚动等待时间
2000(2秒)可根据网络情况调整,确保新内容完全渲染。 - 直接使用Playwright的
page.query_selector_all获取元素,比Scrapy的response.xpath更可靠——页面动态更新后,response的内容不会自动同步最新渲染结果。 - 初始的
PageCoroutine确保页面基础内容加载完成后再执行滚动逻辑。
内容的提问来源于stack exchange,提问作者Abdullah
相关产品推荐
相关产品推荐

