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

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

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

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

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

应用场景数据类型商业价值
竞品监控价格、评分、评论数实时调整定价策略,保持竞争力
选品研究畅销榜单、新品发布发现热门品类,优化库存决策
评论分析评论文本、评分趋势洞察用户痛点,改进产品设计
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
下一篇 2024-01-23 07:23

相关推荐

  • 注册多个推特账号:为何选择原生住宅IP?

    在数字化时代,社交媒体已成为企业和个人进行市场推广、品牌塑造和信息传播的重要渠道。推特作为全球知名的社交媒体平台,自然成为众多用户的首选。然而,为了更有效地管理多个推特账号,选择合适的IP地址进行注册显得尤为重要。在众多选项中,原生住宅IP因其独特的优势,成为了注册多个推特账号的理想选择。 原生住宅IP的优势 1. 不易被平台检测到 推特等社交媒体平台对账户…

    2024-08-01
  • 批量创建Gmail邮箱的方法解析,高效注册不踩坑!

    Gmail邮箱在跨境电商、社交媒体营销、自动化运营等多个领域都有重要作用。然而,想要批量注册Gmail账号并长期稳定使用并非易事,尤其是当Google对批量注册行为越来越严格的情况下。本文将详细介绍高效注册Gmail邮箱的方法,并提供防止被封的关键技巧。 1. 批量注册Gmail邮箱的主要难点 (1) Google的风控系统严格 (2) 需要大量手机号码验证…

    2025-01-20
  • 动态代理IP对于数据采集的优势和应用

    伴随互联网的发展,数据采集已经变成了很多企业和机构必不可少的一项工作。而动态代理IP则是数据采集中不能缺少的一部分。 动态代理IP在数据采集中具有以下优势: 1.提高数据采集的效率 使用动态代理IP可以无限制地切换IP地址,减少被目标网站封禁的可能性,从而提高数据采集的效率。 2.提高数据采集的质量 使用动态代理IP可以避免目标网站对于同一IP的限制,从而提…

    2024-01-02
  • 什么是代理IP?

     一、什么是代理IP?   代理IP又称代理服务器(Proxy Server)。是一种重要的安全功能,能起到防火墙的作用。   形象的讲,代理服务器是网络信息的中转站,它是介于浏览器和Web服务器之间的一台服务器,有了它之后,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。在日常生活中,我们使用IP代理,大多数是…

    2023-11-17
  • 为什么脸书刚注册就被封?Facebook刚注册就被封的原因及解决方法

    一些用户在注册脸书之后马上就被封号了,那么为什么Facebook注册就被封?首先就要找到原因,接下来就来为大家介绍一下Facebook注册就被封的原因及解决方法,一起跟着这篇文章来了解一下。 1、当IP地址不稳定、手机或电脑多次重复注册Facebook账号时引起的账号安全认证,严重时有封号的可能,所以注册的时候不要经常换VPN,固定一个浏览器和一个IP。 2…

    2024-07-04