如何 Amazon Sponsored Ad Placement Scraper 实现 96% 的成功率

发布: (2025年12月26日 GMT+8 09:35)
11 分钟阅读
原文: Dev.to

Source: Dev.to

🚨 问题:不完整的数据导致错误决策

去年,在分析竞争对手的广告策略时,我们的团队发现了一件令人困惑的事:使用不同工具抓取相同关键词 “wireless earbuds” 时,得到的 Sponsored Products 广告数量 相差巨大——有时甚至 相差两倍

最初我们以为是时间点的问题。实际情况更令人担忧:我们只看到了亚马逊为“可疑访客”展示的简化版本

这一发现把我带入了亚马逊反爬机制的深渊,我们测试了十几种方案,耗费了大量代理 IP 预算。今天,我分享这些来之不易的经验,帮助大家避免同样的坑。

💰 为什么亚马逊如此严密地保护 SP 广告数据

直截了当一点:Sponsored Products 广告是亚马逊的“印钞机”。 每一次广告点击都会转化为真实收入,这也解释了平台为何通过五道复杂的屏障几乎执着地保护这些数据。

🔒 屏障 #1 – IP 声誉评分系统

  • 亚马逊维护着一个庞大的 IP 声誉数据库。
  • 数据中心 IP、已知代理服务器以及经常轮换的动态 IP 会被标记为高风险
  • 即使是住宅代理 IP,如果产生的请求模式与普通用户行为不符(例如每秒访问多个分类搜索页面),也会触发降级处理。

系统不会直接阻止你,而是有选择地降低广告展示次数或仅显示出价较低的广告内容。

🎭 屏障 #2 – JavaScript 动态渲染陷阱

  • SP 广告是通过客户端 JavaScript 注入的,单纯的 HTTP 请求无法获取完整内容。
  • 亚马逊前端代码中嵌入了大量检测机制:
检测项检测内容
✅ Window 对象完整性缺失或被篡改的属性
✅ WebGL 指纹验证虚假或缺失的 GPU 信息
navigator.webdriver 检测自动化标记
✅ Canvas 指纹识别无头浏览器特征

一旦发现异常,广告渲染逻辑会被悄悄跳过。你的抓取页面看起来正常,却缺少最关键的数据。

🌍 屏障 #3 – 地理位置与邮编匹配

  • 同一个关键词在不同邮编区域会展示完全不同的广告,因为卖家会针对特定地区投放。
  • 如果请求的 IP 地理位置与声明的 ZIP‑code 参数不匹配——或使用明显的跨境代理——亚马逊会将该请求标记为可疑,并限制广告内容。

🕵️ 屏障 #4 – 请求频率与会话连续性

  • 真正的用户会在搜索结果页停留、滚动并点击;而爬虫往往表现出机械的规律性。
  • 亚马逊的行为分析引擎会跟踪每个会话的轨迹,一旦发现异常模式,就会收紧广告展示策略。

累计效果: 同一 IP 或设备指纹下出现多种可疑行为,会导致声誉分数持续下降,最终将来源列入黑名单

🎲 屏障 #5 – 广告投放黑箱算法

即使突破了前四道屏障,SP 广告的展示本身也是一个实时竞价的黑箱系统。数量、位置以及具体商品均由复杂的专有算法动态决定。

🛠️ 解决方案矩阵 – 从小规模到大规模

规模每日请求量技术成功率月成本关键点
小型10,000Professional API Services90‑96 %+$3,500+• 投入大量资源破解反爬机制
• 持续跟踪平台算法变化
• 结构化数据输出
• 根据成功请求计费。

📊 实际测试数据对比

14 天的测试,覆盖 100 个关键词和 5 个 ZIP 码

方案平均成功率高竞争成功率成本 / 1K
Self‑built Selenium68 %52 %$45
ScraperAPI43 %38 %$60+
Bright Data79 %74 %$120
Pangolin Scrape API96.3 %92 %$35

🏆 为什么 Pangolin 表现最佳?

  • Optimized IP network – 专为 Amazon 设计;每个 IP 都会进行长期的“账户培育”。
  • Dynamic fingerprint generation – 为每个请求生成独特但合理的浏览器指纹。
  • Intelligent request scheduling – 算法会根据实时反馈调整策略。

Source:

💻 代码示例 – 快速入门

选项 1:基础 Puppeteer(小规模测试)

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());

async function scrapeSponsoredAds(keyword, zipCode) {
    const browser = await puppeteer.launch({
        headless: true,
        args: [
            '--no-sandbox',
            '--disable-blink-features=AutomationControlled'
        ]
    });

    const page = await browser.newPage();

    // 设置真实的视口和用户代理
    await page.setViewport({ width: 1280, height: 800 });
    await page.setUserAgent(
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' +
        'AppleWebKit/537.36 (KHTML, like Gecko) ' +
        'Chrome/124.0.0.0 Safari/537.36'
    );

    // 可选:添加额外的请求头以模拟真实浏览器
    await page.setExtraHTTPHeaders({
        'Accept-Language': 'en-US,en;q=0.9',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    });

    // 构建带有 ZIP 码参数的 Amazon 搜索 URL
    const url = `https://www.amazon.com/s?k=${encodeURIComponent(keyword)}&ref=nb_sb_noss_2&zipCode=${zipCode}`;
    await page.goto(url, { waitUntil: 'networkidle2', timeout: 60000 });

    // 等待赞助产品容器加载(如有需要请调整选择器)
    await page.waitForSelector('[data-component-type="sponsored-product"]', { timeout: 15000 });

    // 提取广告数据
    const ads = await page.evaluate(() => {
        const nodes = document.querySelectorAll('[data-component-type="sponsored-product"]');
        return Array.from(nodes).map(node => ({
            title: node.querySelector('h2')?.innerText.trim(),
            asin: node.getAttribute('data-asin'),
            price: node.querySelector('.a-price-whole')?.innerText.trim(),
            rating: node.querySelector('.a-icon-alt')?.innerText.trim(),
            url: node.querySelector('a')?.href
        }));
    });

    await browser.close();
    return ads;
}

// 示例用法
scrapeSponsoredAds('wireless earbuds', '10001')
    .then(ads => console.log(JSON.stringify(ads, null, 2)))
    .catch(err => console.error('Scrape error:', err));

选项 2:使用 Pangolin Scrape API(任意规模)

# Bash – 简单的 curl 请求
curl -X POST https://api.pangolin-scrape.com/v1/amazon/sp \
     -H "Authorization: Bearer YOUR_API_KEY" \
     -H "Content-Type: application/json" \
     -d '{
           "keyword": "wireless earbuds",
           "zip_code": "10001",
           "locale": "en_US"
         }'
# Python – 包装库示例
import requests

API_KEY = "YOUR_API_KEY"
endpoint = "https://api.pangolin-scrape.com/v1/amazon/sp"

payload = {
    "keyword": "wireless earbuds",
    "zip_code": "10001",
    "locale": "en_US"
}

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

response = requests.post(endpoint, json=payload, headers=headers)
if response.ok:
    ads = response.json()
    print(ads)
else:
    print("Error:", response.status_code, response.text)

📌 要点

  1. 确定是哪种屏障在限制你的爬虫 – 先从 IP 信誉入手,然后转向 JS 渲染、地理匹配、请求频率,最后是竞价算法。
  2. 选择与规模相匹配的解决方案 – 小规模项目可以通过调优的 Selenium 设置生存;中等规模需要无头浏览器集群;大规模最好使用专用 API,持续适配 Amazon 的变化。
  3. 投入动态指纹和真实会话行为 – 静态指纹是死路一条;你的流量越像真实购物者,成功率就越高。

祝爬取愉快(请负责任地进行)!

亚马逊赞助广告投放抓取器

下面提供了两种方法,您可以用来收集来自亚马逊的赞助产品(SP)广告投放数据。

选项 1 – 无头浏览器(Puppeteer)

const puppeteer = require('puppeteer');

async function getSponsoredAds(keyword, zipCode = '10001') {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();

    // Set a realistic user‑agent and location cookie
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36');
    await page.setCookie({
        name: 'zip',
        value: zipCode,
        domain: '.amazon.com'
    });

    // Build the search URL and navigate to it
    const searchUrl = `https://www.amazon.com/s?k=${encodeURIComponent(keyword)}`;
    await page.goto(searchUrl, { waitUntil: 'networkidle2' });

    // Simulate human behavior
    await page.evaluate(() => {
        window.scrollBy(0, Math.random() * 500 + 300);
    });
    await new Promise(r => setTimeout(r, 2000 + Math.random() * 3000));

    // Extract sponsored ads from the results page
    const sponsoredAds = await page.evaluate(() => {
        const ads = [];
        document
            .querySelectorAll('[data-component-type="s-search-result"]')
            .forEach((el, i) => {
                const badge = el.querySelector('.s-label-popover-default');
                if (badge?.textContent.includes('Sponsored')) {
                    ads.push({
                        position: i + 1,
                        asin: el.getAttribute('data-asin'),
                        title: el.querySelector('h2')?.textContent.trim()
                    });
                }
            });
        return ads;
    });

    await browser.close();
    return sponsoredAds;
}

// Example usage
// (async () => {
//     const ads = await getSponsoredAds('bluetooth speaker', '90001');
//     console.log(ads);
// })();

选项 2 – Pangolin API(生产就绪)

const axios = require('axios');

class PangolinSPAdScraper {
    constructor(apiKey) {
        this.apiKey = apiKey;
        this.baseUrl = 'https://api.pangolinfo.com/scrape';
    }

    async getSponsoredAds(keyword, options = {}) {
        const response = await axios.post(this.baseUrl, {
            api_key: this.apiKey,
            type: 'search',
            amazon_domain: 'amazon.com',
            keyword: keyword,
            zip_code: options.zipCode || '10001',
            output_format: 'json'
        });

        return response.data.search_results
            .filter(item => item.is_sponsored)
            .map(item => ({
                position: item.position,
                asin: item.asin,
                title: item.title,
                price: item.price,
                adType: item.sponsored_type
            }));
    }
}

// Usage
const scraper = new PangolinSPAdScraper('YOUR_API_KEY');
scraper.getSponsoredAds('bluetooth speaker', { zipCode: '90001' })
    .then(ads => console.log(`Found ${ads.length} ad placements`))
    .catch(err => console.error('Error:', err));

🎯 我的建议

规模建议方法
小规模使用 Selenium/Puppeteer 开始,了解数据情况。
中等规模如果有可靠的开发团队,构建小型集群;否则直接使用 API。
大规模使用专业 API——节省的时间远超成本。

关键原则: 始终使用真实数据验证爬取效果。 不要满足于“能爬取一些数据”;要问“我是否抓取了所有相关数据?”

🏁 底线

在亚马逊以数据驱动的市场中,SP‑ad 数据的准确性直接影响业务决策。一个只能捕获 50 % 广告投放的抓取器可能会误导你认为某关键词的竞争度低,从而导致出价或库存选择不佳。

因为构建可靠的 Sponsored Ad Placement Scraper 的技术门槛很高,大多数团队更倾向于将资源投入核心产品逻辑,并将数据收集外包给可信赖的服务。

🔗 资源

  • Pangolin 网站:
  • API 文档:
  • 开发者控制台:
Back to Blog

相关文章

阅读更多 »

2025年浏览量最高的10篇出版物

从 foundation model 安全框架和 cloud scale 的 formal verification,到 advanced robotics 和 multimodal AI reasoning,这些是最受关注的出版物……