2026如何抓取亚马逊的数据(全指南)

亚马逊是全球最大的电子商务平台,蕴藏着海量的商品数据、客户反馈和市场趋势信息。无论是卖家监控竞争对手、研究人员分析市场动态,还是开发者构建价格追踪工具,亚马逊数据都具有极高的价值。

然而,亚马逊也是公认最难抓取的网站之一,其复杂的反爬机制让许多开发者望而却步。本文将为你提供一份完整的亚马逊数据抓取解决方案,从手动爬虫的实战技巧,到规模化面临的挑战,再到如何利用住宅代理构建稳定高效的数据采集Pipeline。

2026如何抓取亚马逊的数据(全指南)

一、为什么要抓取亚马逊数据?

作为全球最大的电商平台,亚马逊的数据价值体现在多个方面:

应用场景数据类型商业价值
竞品监控价格、评分、评论数实时调整定价策略,保持竞争力
选品研究畅销榜单、新品发布发现热门品类,优化库存决策
评论分析评论文本、评分趋势洞察用户痛点,改进产品设计
SEO优化标题、关键词、排名优化Listing,提升搜索曝光

二、使用Python手动抓取亚马逊数据

在开始编写代码前,你需要先了解亚马逊的页面结构和反爬特点。

2.1 环境准备

# 创建项目目录
mkdir amazon-scraper && cd amazon-scraper

# 安装必要库
pip3 install beautifulsoup4 requests pandas playwright
playwright install

2.2 了解亚马逊页面结构

亚马逊的产品列表页和详情页有不同的数据暴露方式:

页面类型数据内容加载方式抓取难度
列表页标题、价格、评分、评论数服务端渲染+动态加载中等
详情页描述、变体、QA、评论大量动态内容

要分析页面结构,可以右键点击网页元素选择“检查”,在开发者工具中查看HTML标签和属性。重点关注:

  • 商品卡片的容器元素(通常有data-component-type="s-search-result"属性)
  • 价格元素的选择器(如.a-price-whole
  • 评分元素的标签结构

2.3 基础爬虫代码:抓取亚马逊商品列表

以下代码使用Playwright异步模式抓取亚马逊搜索结果页的商品信息:

import asyncio
from playwright.async_api import async_playwright
import pandas as pd
import random

async def scrape_amazon_search(keyword="headphones", max_pages=1):
    """
    抓取亚马逊搜索结果页的商品信息
    """
    async with async_playwright() as pw:
        # 启动浏览器
        browser = await pw.chromium.launch(headless=True)
        page = await browser.new_page()

        # 设置随机User-Agent
        await page.set_extra_http_headers({
            "User-Agent": random.choice([
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
            ])
        })

        all_products = []

        for page_num in range(1, max_pages + 1):
            # 构建搜索URL
            url = f"https://www.amazon.com/s?k={keyword}&page={page_num}"
            print(f"正在抓取第 {page_num} 页: {url}")

            try:
                # 访问页面
                await page.goto(url, timeout=60000, wait_until="domcontentloaded")

                # 等待商品卡片加载
                await page.wait_for_selector('div[data-component-type="s-search-result"]', timeout=10000)

                # 提取所有商品卡片
                products = await page.query_selector_all('div[data-component-type="s-search-result"]')

                for product in products:
                    try:
                        # 提取标题
                        title_elem = await product.query_selector('h2 a span')
                        title = await title_elem.inner_text() if title_elem else "N/A"

                        # 提取价格
                        price_whole = await product.query_selector('.a-price-whole')
                        price_fraction = await product.query_selector('.a-price-fraction')

                        if price_whole and price_fraction:
                            price = f"${await price_whole.inner_text()}.{await price_fraction.inner_text()}"
                        else:
                            price = "N/A"

                        # 提取评分
                        rating_elem = await product.query_selector('span[aria-label*="out of 5 stars"]')
                        rating = await rating_elem.get_attribute('aria-label') if rating_elem else "N/A"

                        # 提取评论数
                        reviews_elem = await product.query_selector('span[aria-label*="stars"] + span a')
                        reviews = await reviews_elem.inner_text() if reviews_elem else "0"

                        # 提取ASIN
                        asin = await product.get_attribute('data-asin')

                        all_products.append({
                            "title": title[:100] + "..." if len(title) > 100 else title,
                            "price": price,
                            "rating": rating,
                            "reviews": reviews,
                            "asin": asin,
                            "page": page_num
                        })
                    except Exception as e:
                        print(f"解析单个商品出错: {e}")
                        continue

                # 随机延迟,避免被识别为爬虫
                await asyncio.sleep(random.uniform(2, 5))

            except Exception as e:
                print(f"抓取第 {page_num} 页失败: {e}")
                break

        await browser.close()
        return all_products

# 运行爬虫
results = asyncio.run(scrape_amazon_search(keyword="wireless earbuds", max_pages=2))

# 保存到CSV
df = pd.DataFrame(results)
df.to_csv('amazon_products.csv', index=False, encoding='utf-8-sig')
print(f"抓取完成,共 {len(results)} 条商品记录")

2.4 常见问题与处理技巧

即使代码正确,第一次运行时也可能失败。以下是几个关键应对策略:

问题表现解决方案
请求被拒返回503、403状态码轮换User-Agent,使用代理IP
出现验证码页面重定向到验证页降低请求频率,使用住宅代理
数据加载不全商品列表只显示部分增加wait_for_selector等待时间
IP被封所有请求失败切换到新的代理IP

三、亚马逊进阶抓取技术

当你要从单次抓取升级到常态化采集时,需要掌握以下进阶技巧:

3.1 处理分页

亚马逊的结果列表通常有多个页面,通过URL参数&page={n}翻页:

base_url = "https://www.amazon.com/s?k=headphones"

for page in range(1, 6):
    # 构建分页URL
    url = f"{base_url}&page={page}"

    # 抓取逻辑...

    # 关键:随机延迟,避免被限流
    import random
    import time
    time.sleep(random.uniform(3, 7))

3.2 绕过广告和赞助商品

搜索结果中混杂着广告,需要过滤:

# 检测是否包含"Sponsored"标签
sponsored = await product.query_selector('span:has-text("Sponsored")')
if sponsored:
    continue  # 跳过广告商品

3.3 处理动态加载内容

评论、QA等区域通过AJAX动态加载,需要显式等待:

# 等待"加载更多"按钮出现
await page.wait_for_selector('li.a-last a', timeout=5000)

# 点击加载更多
await page.click('li.a-last a')

# 等待新内容加载
await page.wait_for_timeout(2000)

# 继续抓取新加载的内容

3.4 反封锁策略要点

策略实现方式效果
随机延迟time.sleep(random.uniform(2, 5))避免请求节奏规律化
轮换User-Agent维护UA列表,每次随机选择减少浏览器指纹识别
限制并发数控制同时运行的爬虫数量避免触发流量异常告警
使用代理IP配置住宅代理轮换最有效的反封禁手段
kookeey 全球代理IP点击按钮免费试用

四、规模化抓取的挑战与解决方案

4.1 常见规模化问题

当你从单次抓取升级到常态化采集时,会遇到以下挑战:

挑战表现根本原因
IP被封禁请求返回503、验证码同一IP高频访问被识别
数据不一致不同时间抓取结果不同地域、登录状态影响返回内容
维护成本高频繁调整选择器亚马逊前端代码更新
抓取速度慢单IP被限流需要分布式采集

4.2 为什么需要稳定的代理IP

代理IP是规模化抓取的基石,其核心价值在于:

IP轮转分散请求

  • 将请求分散到海量IP上,模拟普通用户访问
  • 彻底规避频率限制和IP黑名单
  • 大幅降低被识别为爬虫的概率

获取地域化数据

  • 将出口IP锁定在特定城市
  • 获取该地区独有的搜索结果和价格
  • 实现本地化市场研究

保持会话一致性

  • 粘性会话确保任务期间IP不变
  • 适合需要登录或添加到购物车的场景
  • 避免频繁中断导致任务失败

kookeey动态住宅代理IP

kookeey提供专业的动态住宅代理服务,有效解决规模化抓取难题:

海量纯净IP池

  • 超过5500万个真实住宅IP,遍布全球
  • IP来源于真实用户,难以被识别为代理
  • 极大降低被平台封锁的风险

精准地理定位

  • 支持城市和国家级别的精准定位
  • 轻松获取目标市场的本地化数据
  • 满足区域性市场研究需求

灵活的会话控制

  • 支持粘性会话,最长24小时
  • 满足需要保持登录状态的场景
  • 避免频繁切换IP导致的中断
免费获取 kookeey 新用户福利 🎁
200MB 动态流量
100MB 移动代理
288元 优惠大礼包
100%独享IP ISP 支持独享端口 / API 调用

4.3 在代码中集成kookeey代理

进入kookeey官网,新用户200MB免费测试流量购买流量包,提取线路

将kookeey代理集成到Playwright爬虫中:

# kookeey代理配置
proxy = {
    "server": "http://gate.kookee.info:15959",
    "username": "YOUR_KOOKEEY_USERNAME",
    "password": "YOUR_KOOKEEY_PASSWORD"
}

# 启动浏览器时配置代理
browser = await pw.chromium.launch(
    headless=True,
    proxy=proxy
)

4.5 验证代理是否生效

在开始大规模抓取前,建议先验证代理配置:

import requests

# Kookeey代理配置
proxies = {
    "http": "http://YOUR_USERNAME:YOUR_PASSWORD@gate.kookee.info:15959",
    "https": "http://YOUR_USERNAME:YOUR_PASSWORD@gate.kookee.info:15959"
}

# 访问IP检测网站
try:
    response = requests.get(
        'https://lumtest.com/myip.json',
        proxies=proxies,
        timeout=10
    )
    ip_info = response.json()
    print(f"代理配置成功!当前出口IP: {ip_info['ip']}")
    print(f"地理位置: {ip_info['country']} - {ip_info['city']}")
except Exception as e:
    print(f"代理连接失败: {e}")
常见问题(FAQ)
为什么我的爬虫第一次能运行,第二次就失败了?
亚马逊检测到同一IP的异常请求模式,两次运行间隔长一些,每次运行时使用新的代理IP,增加随机延迟,清理浏览器缓存。
什么是ASIN?为什么它很重要?
ASIN(Amazon Standard Identification Number)是亚马逊的标准识别号,每个商品都有唯一的10位字符ASIN。它的重要性在于: 1、作为商品的唯一标识,用于构建详情页URL 2、避免重复抓取同一商品 3、方便数据去重和关联分析。 可以从商品页URL中提取ASIN,例如: https://www.amazon.com/dp/B09G9D7K6S → ASIN为B09G9D7K6S

五、总结:

三个阶段逐步升级

阶段目标核心策略工具选择
起步阶段验证思路,小规模测试理解页面结构,掌握基础爬虫Python + Playwright,随机延迟
成长阶段常态化采集,稳定运行引入代理IP,优化反封策略kookeey代理 + 轮换User-Agent
规模化阶段大规模、分布式采集IP轮转 + 地理定位 + 粘性会话kookeey住宅代理 + 并发控制

通过以上方法,你可以将简单的手动脚本升级为能够应对常态化、大规模采集任务的商业级数据采集系统。

本文来自网络投稿,不代表kookeey立场,如有问题请联系我们

(0)
kookeeykookeey
上一篇 2026-02-26 12:25
下一篇 2026-03-16 10:46

相关推荐

  • 亚马逊多店铺怎么防关联?新手必看

    防关联,你真的了解吗?亚马逊通过蛛丝马迹来判断卖家是否运营多家店铺,首先是注册资质,不能用相同公司的资质注册多家店铺,包括个人资质,电话,邮箱,账户。其次是产品,产品图片,描述,包括物流发货信息。最后是关联的三大因素,其中有IP关联,环境关联,以及操作关联 众所周知,大量开店,用店群来抢流量是大多数跨境电商卖家成长起来的快速策略,店铺一多,担心的首要问题就是…

    2023-11-30
  • 全局代理和局部代理有什么不同?

    全局代理和局部代理是在计算机网络中常见的两种代理方式,它们在功能和应用场景上有着不同的特点。下面我们来详细了解一下全局代理和局部代理的区别。 全局代理是指在网络设置中将所有的网络请求都通过代理服务器进行转发的方式。无论是浏览网页、下载文件还是其他网络请求,都会经过全局代理服务器进行转发。全局代理通常需要在操作系统或者网络设置中进行配置,一旦配置完成,所有的网…

    2024-01-23
  • 为什么有的时候Socks5比HTTP爬虫IP更快?

    作为一名长期从事爬虫行业动态IP解决方案服务商,我发现经常有客户疑惑:为什么有的时候Socks5代理IP比HTTP代理IP更快?其实,这个是很常见的一种现象。今天,我就来分析一下为什么Socks5代理IP有时比HTTP代理IP更快,希望能帮助到你们! 首先,我们要了解Socks5和HTTP代理IP的区别。Socks5是一种网络协议,它在传输层进行代理,能够代…

    2023-12-14
  • 精通Discord营销:多账号注册与管理,高效打造矩阵

    Discord虽然是一个海外小众平台,但在Z世代群体来说却非常受欢迎。通常在游戏行业、年轻化的电商特定品类、软件等业务中,Discord的社群营销可以起到非常卓越的效果。但是,您必须学会管理不同的帐户,以构成矩阵打造社区,更加高效。那么如何做呢? 一、多账号管理工具Maskfog指纹浏览器有助于无缝注册并使用多个Discord帐户,它提供自定义指纹环境、独立…

    2024-01-19
  • 跨境电商必备:海外代理IP的应用与实操指南

    跨境电商行业正迅速发展,但同时也面临激烈的竞争和各种技术挑战。为了在市场中占据优势,许多跨境电商卖家开始使用海外代理IP,优化账户管理、市场调研和推广效果。本文将详细讲解跨境电商使用海外代理IP的具体方法和优势,并介绍kookeey代理服务如何为卖家提供高效的解决方案。 为什么跨境电商需要海外代理IP? 跨境电商使用海外代理IP的具体操作 kookeey代理…

    2024-12-18