python实战 | 如何使用海外代理IP抓取Amazon黑五数据

家人们!黑五又要来了,作为全球最大的电商购物狂欢节,Amazon上的商品数据变化可谓是瞬息万变,尤其是像iPhone17这种热门新品,价格波动、库存情况、用户评价等数据,都是跨境电商卖家和数据分析师的"香饽饽"。但你懂的,直接用本地IP去 scrape 亚马逊,准保被Amazon的网站机制怼一脸:刚抓了几个SKU,IP就被Ban了、验证码狂跳、数据刷不出来......

今天哥们儿就来手把手教你,如何用海外代理IP采集Amazon上iPhone17的售卖数据,顺带带你看看怎么分析这堆数据,看完你就能上手撸代码了!

一、为什么采集Amazon数据,非得用海外代理IP?

先说结论:

Amazon.com 对中国大陆 IP 并不友好。

大家都知道,Amazon作为全球电商巨头,用户流量巨大,网站的机制也是超级严密。如果你想用本地IP去硬刚Amazon的风控系统,那我敬你是条汉子,这分分钟就被识别为"异常流量",直接封IP或者弹出验证码。更别提黑五期间,服务器负载高,针对这部分的访问限制会更严。

为啥呢?原因很简单:

  • 你用的是本地IP;

  • 你的访问都来自相同的IP地址,网站已经识别到"是bot在搞事"。

这一点,海外代理IP就是破局的关键了!海外代理IP可以让你的请求来自不同的IP,而不是盯着一个IP死薅数据。而且高质量的代理更不会轻易掉链子,能保证请求的稳定性、防止运行中断,能高效帮助你完成数据采集任务。

至于选型,我也踩过多个坑。早年间为了省预算,用过免费代理,结果不仅丢包率高,还遇到脏数据。经过多次复盘,我现在只用青果网络。

他们家的业务分池技术让IP的纯净度达到极高,出bug概率最低,完全规避了连带封锁的风险。而且作为一手厂商,没有中间商赚差价,控制成本这块拿捏得死死的;有问题还能直接找技术沟通解决,不会像别家那样,爬到阈值就卡壳,得换池子搞才行。自从切了他们的代理,我的爬虫任务基本没有出现过雪崩效应。

不得不说,真香。

注意一点:

青果网络的海外代理本身不支持大陆网络使用,合规风险低。

从这里获取海外代理 IP:

python 复制代码
import requests

API_URL = "https://overseas.proxy.qg.net/get?key=yourkey&num=1&area=&isp=&format=txt&seq=\r\n&distinct=false"

def get_proxy():
    ip = requests.get(API_URL, timeout=10).text.strip()
    return {
        "http": ip,
        "https": ip
    }

ok,接下来还是围绕我们今天的主题,如何用海外代理爬亚马逊iPhone17的数据。

二、实战操作

2.1 配置环境

在开始爬虫之前,我们需要以下工具和环境:

Python 编程环境:Python 3,

搭配基础包:requests 和 lxml。

bash 复制代码
pip install requests lxml

2.2 扒页面结构,明确目标数据

先把目标说清楚,避免很多人一上来就乱抓。

采集的数据字段包括:

  • 商品标题

  • 商品链接

  • 当前售价

  • 评论

  • 评论数量

我们以这个搜索 URL 为例(示意):

bash 复制代码
https://www.amazon.com/s?k=iPhone+17

想把这类页面上的商品售卖信息抓下来,我们需要做以下几个步骤:

  • 打开目标页面,找到商品列表区域。F12 看 DOM,打开后按F5刷新一下:

所有商品列表,都在一个统一的大容器中

bash 复制代码
<div class="s-main-slot s-result-list s-search-results sg-row">

这个 div,就是整个搜索结果页的主容器。

XPath 示例:

bash 复制代码
//div[contains(@class,"s-main-slot")]

单个商品的父级容器

在主容器下,每一个商品,都是一个 div

bash 复制代码
<div data-component-type="s-search-result" 
     class="sg-col-inner">

也就是说:

每一个 data-component-type="s-search-result",就是一个商品卡片

XPath 示例(非常关键):

bash 复制代码
//div[@data-component-type="s-search-result"]

后面所有字段,都是从这个节点往下找。

如商品价格价格在 <span class="a-price"> 内,分整数字和分数部分。整数字在 <span class="a-price-whole">,分数在 <span class="a-price-fraction">,符号在$。

  • 类名:a-price(主容器),a-price-whole,a-price-fraction。

  • XPath 示例:.//span[@class="a-price-whole"]/text() 和 .//span[@class="a-price-fraction"]/text()(组合成完整价格,如 "1,499.00")。

  • 特性:如果有折扣,原价在 <span class="a-price a-text-price"> 或 <span class="a-offscreen">(屏幕外,供无障碍阅读)。黑五期间常有额外折扣类如 a-text-price。

    bash 复制代码
    <span class="a-price" data-a-size="xl" data-a-color="base">
      <span class="a-offscreen">$1,499.00</span>
      <span aria-hidden="true">
        <span class="a-price-symbol">$</span>
        <span class="a-price-whole">1,499</span>
        <span class="a-price-decimal">.</span>
        <span class="a-price-fraction">00</span>
      </span>
    </span>

其他以此类推,不赘述啦。

我们可以得出:一般每一个商品信息会用一个标签包裹起来,主要包含以下内容:

  • 商品标题:存放在 <h2> 标签内的 <span> 中;

  • 商品价格:在 a-price 类的 <span> 标签中;

  • 商品链接:位于 <a> 标签的 href 属性;

  • 详细信息:如评分、评论数,会分散在 a-icon-alt 和 a-size-small 类的标签中。

这时候我们就可以确定爬取数据的路径了。

2.3 核心代码实现

我们把功能解耦合,分为:中间件配置(代理)、请求发送、数据清洗。

2.3.1 中间件配置

要实现IP轮询,我们需要调用青果网络的API接口获取实时IP。

**敲黑板!**这里的API是核心配置:

python 复制代码
import requests
from lxml import etree
import time
import random

# 功能:通过 API 获取青果网络海外代理 IP
# 这就是我们的"外挂"接口
def get_proxy_middleware():
    # 青果网络提取链接,此处替换为你自己的 key
    api_url = "https://overseas.proxy.qg.net/get?key=yourkey&num=1&area=&isp=&format=txt&seq=\r\n&distinct=false"
    
    try:
        response = requests.get(api_url, timeout=5)
        if response.status_code == 200:
            ip_port = response.text.strip()
            # 构造 Requests 库需要的 proxies 字典
            return {
                "http": f"http://{ip_port}",
                "https": f"http://{ip_port}"
            }
    except Exception as e:
        print(f"代理获取异常,请检查网络连通性: {e}")
    return None

# 伪装 Header,防止被反爬策略识别
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}
2.3.2 业务逻辑层

利用requests挂载代理,通过lxml进行数据提取。这里我们要加一点容错机制,保证代码的健壮性。

python 复制代码
def run_spider(keyword):
    target_url = f"https://www.amazon.com/s?k={keyword}"
    
    # 获取代理 IP
    proxy = get_proxy_middleware()
    if not proxy:
        print("代理池枯竭,任务终止")
        return

    print(f"正在进行全量抓取,当前节点: {proxy},关键词: {keyword}")

    try:
        # 发起 HTTP 请求
        resp = requests.get(target_url, headers=headers, proxies=proxy, timeout=10)
        
        # 简单校验一下状态码
        if resp.status_code == 200:
            # 避免被亚马逊的风控识别为 robot
            if "Robot Check" in resp.text:
                 print("触发验证码风控,建议切换IP重试")
                 return
            
            parse_html(resp.text)
        else:
            print(f"请求失败,状态码: {resp.status_code}")
            
    except Exception as e:
        print(f"发生未知错误: {e}")

def parse_html(html_str):
    tree = etree.HTML(html_str)
    
    # 获取所有商品卡片节点
    items = tree.xpath('//div[@data-component-type="s-search-result"]')
    
    data_list = []
    
    for item in items:
        try:
            # 数据清洗与提取
            title = item.xpath('.//h2//span/text()')
            # 三元表达式处理空值,防止 Index Out of Bounds
            title_str = title[0] if title else "无标题数据"
            
            price = item.xpath('.//span[@class="a-price"]//span[@class="a-offscreen"]/text()')
            price_str = price[0] if price else "暂无报价"
            
            link = item.xpath('.//h2//a/@href')
            link_str = "https://www.amazon.com" + link[0] if link else ""
            
            # 结构化数据
            sku_data = {
                "Title": title_str,
                "Price": price_str,
                "Url": link_str
            }
            data_list.append(sku_data)
            print(sku_data) # 控制台输出,实时监控抓取进度
            
        except Exception as e:
            continue
            
    return data_list

青果网络提供的海外代理IP对于高并发还行:

2.3.3 启动入口
python 复制代码
if __name__ == "__main__":
    # 假设 iPhone 17 已经预售或我们要抓取相关周边
    search_key = "iPhone 17"
    run_spider(search_key)
2.3.4 存数据!
python 复制代码
import csv

# ... 前面爬取和解析得到 product_list ...

# 存成CSV文件
filename = "amazon_iphone17_blackfriday.csv"
with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:  # utf-8-sig 防止中文乱码
    fieldnames = ['title', 'price', 'link', 'rating', 'reviews']  # 定义列名
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    
    writer.writeheader()  # 写入标题行
    for prop in product_list:
        writer.writerow(prop)  # 写入一行数据

print(f"【数据已保存】: 共 {len(product_list)} 条记录到 {filename}")

更高级点存数据库(比如SQLite)适合数据量大或者需要复杂查询的情况,稍微麻烦点,但更规范。

三、数据分析

数据采集完了,我们可以用Python简单分析一下这些数据,比如用Pandas计算平均价格、最高评分等。

python 复制代码
import pandas as pd

df = pd.read_csv("amazon_iphone17_blackfriday.csv")
avg_price = df['price'].str.replace('$', '').str.replace(',', '').astype(float).mean()
print(f"iPhone17平均价格:${avg_price:.2f}")

# 简单可视化(需安装matplotlib)
import matplotlib.pyplot as plt
df['rating'] = df['rating'].str.extract('(\d+\.\d+)').astype(float)
df.plot(kind='bar', x='title', y='rating')
plt.title("iPhone17变体评分对比")
plt.show()

通过分析,你能发现黑五期间iPhone17的价格折扣力度、热门变体(如Pro Max的销量更高)等insights,帮你决策跨境电商选品。

也可以直接丢给 Pandas、或者喂给 AI 做结构化分析。

四、总结

  • **选对代理:**千万别图便宜用劣质代理,亚马逊的黑名单库比你想象的要全。青果网络这类头部厂商的IP池,清理度高,能大幅提高我们的业务成功率。

  • 轮换+延时: 虽然我们用了代理,但要严格控制代码武德 。再加上time.sleep()频率随机,模拟真实人类的操作次数。

  • 快速迭代:先跑通Demo,再根据业务需求做增量更新。

  • 数据存下来: 存CSV或数据库,别让辛苦爬的数据飞了。

  • 低调干活: 控制速度,看 robots.txt,别碰不能爬的。灵活调整策略,才能在数据的"战场"上立于不败之地

好啦,从代理配置到代码落地全讲完了,剩下的就是动手实操啦~

以及,青果网络也有免费测试,对爬虫工程师来说上手成本也很低,用来跑Amazon这种站点会省掉很多无意义的折腾。有需要的可以去瞅瞅~

相关推荐
Swizard2 小时前
拒绝“狗熊掰棒子”!用 EWC (Elastic Weight Consolidation) 彻底终结 AI 的灾难性遗忘
python·算法·ai·训练
月光技术杂谈2 小时前
基于Python的网络性能分析实践:从Ping原理到自动化监控
网络·python·性能分析·ping·时延·自动化监控
龘龍龙2 小时前
Python基础学习(四)
开发语言·python·学习
李慕婉学姐2 小时前
【开题答辩过程】以《基于PHP的动漫社区的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
开发语言·mysql·php
洵有兮3 小时前
python第四次作业
开发语言·python
kkoral3 小时前
单机docker部署的redis sentinel,使用python调用redis,报错
redis·python·docker·sentinel
BoBoZz193 小时前
IterativeClosestPoints icp配准矩阵
python·vtk·图形渲染·图形处理
test管家3 小时前
PyTorch动态图编程与自定义网络层实战教程
python
laocooon5238578863 小时前
python 收发信的功能。
开发语言·python