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

如何抓取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:04:54