如何使用代理爬取Amazon产品数据

学习如何刮去亚马逊产品数据,包括价格,评论,以及使用住宅代理的排名. 完整 Python 和 Node.js 代码示例,具有反检测策略.

如何使用代理爬取Amazon产品数据

为什么是亚马逊产品数据?

亚马逊在全球数十个市场拥有超过3.5亿个产品。 对于电子商务企业来说,这一数据是宝贵的:竞争者定价、产品说明、客户审查、最佳销售商排名和库存信号都能够推动更明智的决定。 你是否正在建立一个 价格监测工具亚马逊产品数据是网上价值最高的目标之一。

挑战在于亚马逊在反机器人防御方面投入大量资金. 如果没有正确的代理策略,你的刮刮机将在几分钟内击中CAPTCHA,IP块,并做出误导性反应. 这个指南引导你通过 建筑,代码,和代理配置 所需的 刮亚马逊可靠的规模。

亚马逊的防毒防护

在写出单一的代码之前,你需要了解你面对的是什么. 亚马逊使用一个分层的检测系统,分析每一个收到的请求.

请求指纹

亚马逊检查HTTP头,TLS指纹,并请求订购. 请求缺少标准浏览器头或使用已知的bot签名立即标记. 那个 Accept-Language, (中文). Accept-Encoding,以及 User-Agent 标题必须一致和现实。

行为分析

要求达到人类无法达到或遵循可预测的模式(如相继的ASINs)达到的速率,触发率受到限制。 亚马逊追踪多个请求的会话行为,因此每个IP都需要表现得像真正的shopper.

CAPTCHA 挑战

当亚马逊怀疑自动流量时,它服务于一个CAPTCHA页面而不是产品数据. 居民IP获得的CAPTCHA比数据中心IP少得多,因为他们与真正的亚马逊购物者共享相同的IP池. 更深入地审视检测方法,请参见我们的指南: 反机器人系统如何检测代理。 。 。

关键外卖:有适当轮换的住宅代理对亚马逊的持续刮刮至关重要。 数据中心代理将在数小时内被封锁。

从亚马逊提取数据

数据点来源页使用大小写
产品标题、图像、描述产品细节页Catalog 大楼,内容分析
当前价格、交易价格、清单价格产品细节/列出价格监测,重新定价
客户审查和评级审查页面敏感性分析、产品研究
最佳销售商排名(BSR)产品细节页市场需求估计
采购箱销售商,货运信息产品细节页竞争者追踪
搜索结果排名搜索结果页面SEO和广告优化
类别等级浏览节点分类学绘图

设置您的代理配置

ProxyHat的住宅代理网关提供了亚马逊刮刮所需的IP多样性和地理目标. 通过我们的网关连接,并在每次请求时自动旋转IP,或在需要时保持粘度会话.

基本连接

# HTTP proxy
http://USERNAME:PASSWORD@gate.proxyhat.com:8080
# With geo-targeting (US Amazon)
http://USERNAME-country-US:PASSWORD@gate.proxyhat.com:8080
# With sticky session (maintain same IP for a browsing session)
http://USERNAME-session-amz001:PASSWORD@gate.proxyhat.com:8080

对于亚马逊刮刮,我们建议 瞄准与你刮刮的市场匹配的国家。 撕裂Amazon.de吗? 使用德国IPs. scrating amazon.co.jp? 使用日语IP. 检查 可用地点 完整名单。

Python 执行

这是亚马逊产品数据的 Python 刮纸机 代理哈特的 Python SDK 与要求和美丽的汤。

基本产品搜索器

import requests
from bs4 import BeautifulSoup
import random
import time
import json
PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
]
def get_amazon_product(asin, marketplace="com"):
    """Scrape product data from Amazon by ASIN."""
    url = f"https://www.amazon.{marketplace}/dp/{asin}"
    headers = {
        "User-Agent": random.choice(USER_AGENTS),
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
        "Accept-Encoding": "gzip, deflate, br",
        "Connection": "keep-alive",
    }
    proxies = {
        "http": PROXY_URL,
        "https": PROXY_URL,
    }
    response = requests.get(url, headers=headers, proxies=proxies, timeout=30)
    if response.status_code != 200:
        return None
    soup = BeautifulSoup(response.text, "html.parser")
    product = {
        "asin": asin,
        "title": extract_title(soup),
        "price": extract_price(soup),
        "rating": extract_rating(soup),
        "review_count": extract_review_count(soup),
        "bsr": extract_bsr(soup),
        "availability": extract_availability(soup),
    }
    return product
def extract_title(soup):
    el = soup.find("span", {"id": "productTitle"})
    return el.get_text(strip=True) if el else None
def extract_price(soup):
    el = soup.find("span", {"class": "a-price-whole"})
    if el:
        fraction = soup.find("span", {"class": "a-price-fraction"})
        price = el.get_text(strip=True).rstrip(".")
        if fraction:
            price += "." + fraction.get_text(strip=True)
        return price
    return None
def extract_rating(soup):
    el = soup.find("span", {"class": "a-icon-alt"})
    if el and "out of" in el.get_text():
        return el.get_text(strip=True).split(" ")[0]
    return None
def extract_review_count(soup):
    el = soup.find("span", {"id": "acrCustomerReviewCount"})
    return el.get_text(strip=True) if el else None
def extract_bsr(soup):
    el = soup.find("th", string=lambda t: t and "Best Sellers Rank" in t)
    if el:
        return el.find_next("td").get_text(strip=True)
    return None
def extract_availability(soup):
    el = soup.find("div", {"id": "availability"})
    return el.get_text(strip=True) if el else None
# Example usage
if __name__ == "__main__":
    asins = ["B0CHX3QBCH", "B0D5BKRY4R", "B0CRMZHDG7"]
    for asin in asins:
        product = get_amazon_product(asin)
        if product:
            print(json.dumps(product, indent=2))
        time.sleep(random.uniform(2, 5))  # Random delay between requests

处理搜索结果的缓存

def scrape_search_results(keyword, max_pages=5):
    """Scrape Amazon search results with pagination."""
    results = []
    for page in range(1, max_pages + 1):
        url = f"https://www.amazon.com/s?k={keyword}&page={page}"
        headers = {
            "User-Agent": random.choice(USER_AGENTS),
            "Accept-Language": "en-US,en;q=0.9",
        }
        proxies = {"http": PROXY_URL, "https": PROXY_URL}
        response = requests.get(url, headers=headers, proxies=proxies, timeout=30)
        if response.status_code != 200:
            print(f"Page {page}: status {response.status_code}")
            break
        soup = BeautifulSoup(response.text, "html.parser")
        items = soup.find_all("div", {"data-component-type": "s-search-result"})
        for item in items:
            asin = item.get("data-asin", "")
            title_el = item.find("h2")
            price_el = item.find("span", {"class": "a-price-whole"})
            results.append({
                "asin": asin,
                "title": title_el.get_text(strip=True) if title_el else None,
                "price": price_el.get_text(strip=True) if price_el else None,
                "page": page,
            })
        time.sleep(random.uniform(3, 7))
    return results

节点.js 执行

对于Node.js项目,使用 代理哈特节点 SDK 与欢呼为分析。

const axios = require("axios");
const cheerio = require("cheerio");
const { HttpsProxyAgent } = require("https-proxy-agent");
const PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080";
const agent = new HttpsProxyAgent(PROXY_URL);
const USER_AGENTS = [
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
];
async function scrapeProduct(asin, marketplace = "com") {
  const url = `https://www.amazon.${marketplace}/dp/${asin}`;
  const { data } = await axios.get(url, {
    httpsAgent: agent,
    headers: {
      "User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)],
      "Accept-Language": "en-US,en;q=0.9",
      Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    },
    timeout: 30000,
  });
  const $ = cheerio.load(data);
  return {
    asin,
    title: $("#productTitle").text().trim() || null,
    price: $(".a-price-whole").first().text().trim() || null,
    rating: $(".a-icon-alt").first().text().trim().split(" ")[0] || null,
    reviewCount: $("#acrCustomerReviewCount").text().trim() || null,
    availability: $("#availability").text().trim() || null,
  };
}
async function scrapeMultiple(asins) {
  const results = [];
  for (const asin of asins) {
    try {
      const product = await scrapeProduct(asin);
      results.push(product);
      console.log(`Scraped: ${product.title}`);
    } catch (err) {
      console.error(`Failed ${asin}: ${err.message}`);
    }
    // Random delay 2-5 seconds
    await new Promise((r) => setTimeout(r, 2000 + Math.random() * 3000));
  }
  return results;
}
// Usage
scrapeMultiple(["B0CHX3QBCH", "B0D5BKRY4R"]).then((results) => {
  console.log(JSON.stringify(results, null, 2));
});

亚马逊代理旋转策略

亚马逊的侦测变得更加激烈,请求越多来自单一IP. 以下是最行之有效的轮换策略。

按请求旋转

对于每个请求独立的批量产品搜索,在每一个请求中旋转IP. 这是与ProxyHat网关的默认行为:每个新连接都会获得一个新的住宅IP.

基于会话的轮换

当从多个页面刮取搜索结果时,对整个会话保持相同的IP. 对亚马逊来说,切换IP的中间偏差看起来很可疑. 使用代理Hat的粘度会话 :

# Maintain same IP for up to 10 minutes
http://USERNAME-session-search001:PASSWORD@gate.proxyhat.com:8080

地理目标旋转

匹配您的代理地址到亚马逊市场 。 访问美国IP的Amazon.de 升起旗帜. 具体目标国家:

# German IPs for amazon.de
http://USERNAME-country-DE:PASSWORD@gate.proxyhat.com:8080
# Japanese IPs for amazon.co.jp
http://USERNAME-country-JP:PASSWORD@gate.proxyhat.com:8080
# UK IPs for amazon.co.uk
http://USERNAME-country-GB:PASSWORD@gate.proxyhat.com:8080

更多关于旋转技术,请改为: 2026年网络刮刮的最佳代理。 。 。

亚马逊搜索的最佳做法

  • 随机延迟 : 使用请求间2-7秒的随机间隔. 从不按固定费率刮刮.
  • 旋转用户代理 : 维护一个至少包含10个现实浏览器用户代理字符串的集合并旋转它们.
  • 优雅地处理CAPTCHA: 如果您收到CAPTCHA响应,请退后30-60秒,用新的IP重试.
  • 尊重机器人.txt: 虽然在大多数法域没有法律约束力,但遵循机器人.txt指令显示出诚意。
  • 使用住宅代理 : Datacenter IP很容易被亚马逊识别和封锁. 住宅代理机构 与真正的购买者共享相同的IP范围 。
  • 监测成功率 : 追踪你的HTTP200率 如果下降至90%以下,请减少货币或调整您的旋转策略。
  • 缓存响应 : 如果数据没有变化, 永远不要刮两次相同的 URL 。 缓存产品数据和根据价格变化的频率设定刷新间隔.

缩放您的 Amazon 搜索器

当从成百上千的产品转移到数百万产品时,建筑就很重要.

基于队列的架构

使用信件队列( Redis, RabbitMQ, 或 SQS)来管理您的ASIN 列表 。 工人进程从队列中拉出ASIN,刮掉它们,并将结果推向一个数据存储. 这种脱钩的排程 与刮刮, 让你独立规模的工人。

货币控制

从5-10项同时提出的请求开始,并在监测成功率的同时逐步增加。 有了ProxyHat的住宅池,你一般可以同时运行20-50个会话,没有问题. 看我们的 网页刷新用例页面 建议的配置。

数据管道

将原始的 HTML 存储在用于后处理的对象商店(S3)中,并在 PostgreSQL 或数据仓库中解析数据. 这种分离让您可以不重复搜索地修复解析错误 。

Pro Tip:亚马逊产品页面经常改变结构. 存储原始的HTML,以便在选择器改变时可以重新提取数据,而不会再次击中亚马逊.

法律和道德考虑

在大多数法域,对公开数据而言,网络刮刮是合法的,但负责任的做法很重要。 只收集公开显示的数据 。 不试图访问认证的页面、销售账户或私人数据。 限制收费要求,以避免降低亚马逊为其他用户提供的服务。 只存储您需要的数据, 并按照适用的隐私法处理 。

关键外卖

  • 亚马逊的反机器人系统需要具有地理目标的住宅代用品来配合目标市场.
  • 每个批量浏览请求旋转 IP; 使用粘贴的会话进行粘贴浏览 。
  • 随机延迟,用户代理,并请求模式以避免检测.
  • 构建基于队列的架构,以超过几千个产品。
  • 存储原始 HTML 以抵御选择器更改。
  • 使用 代理哈特的住宅代理 所有亚马逊市场的成功率都很高。

准备好开始删除亚马逊的数据了吗? 我们 电子商务数据报废指南 你可以探索代理Hat的代理基础设施 定价页面。 。 。

准备开始了吗?

通过AI过滤访问148多个国家的5000多万个住宅IP。

查看价格住宅代理
← 返回博客