博客 / 詳情

返回

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:

圖片

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。 
    pip install requests lxml

2.2 扒頁面結構,明確目標數據

先把目標説清楚,避免很多人一上來就亂抓。
採集的數據字段包括:

  • 商品標題
  • 商品鏈接
  • 當前售價
  • 評論
  • 評論數量
    我們以這個搜索 URL 為例(示意): 
    https://www.amazon.com/s?k=iPhone+17
    想把這類頁面上的商品售賣信息抓下來,我們需要做以下幾個步驟:
  • 打開目標頁面,找到商品列表區域。F12 看 DOM,打開後按F5刷新一下:
    圖片

所有商品列表,都在一個統一的大容器中 

<div class="s-main-slot s-result-list s-search-results sg-row">

圖片

這個 div,就是整個搜索結果頁的主容器。
XPath 示例: 
//div[contains(@class,"s-main-slot")]
單個商品的父級容器
在主容器下,每一個商品,都是一個 div: 

<div data-component-type="s-search-result" 
     class="sg-col-inner">

圖片

也就是説:
每一個 data-component-type="s-search-result",就是一個商品卡片
XPath 示例(非常關鍵): 

//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。 
<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> 標籤中;
  • 商品鏈接:位於 標籤的 href 屬性;
  • 詳細信息:如評分、評論數,會分散在 a-icon-alt 和 a-size-small 類的標籤中。
    這時候我們就可以確定爬取數據的路徑了。

    2.3 核心代碼實現

    我們把功能解耦合,分為:中間件配置(代理)、請求發送、數據清洗。

    2.3.1 中間件配置

    要實現IP輪詢,我們需要調用青果網絡的API接口獲取實時IP。
    敲黑板!這裏的API是核心配置:

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進行數據提取。這裏我們要加一點容錯機制,保證代碼的健壯性。

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 啓動入口

if __name__ == "__main__":
    # 假設 iPhone 17 已經預售或我們要抓取相關周邊
    search_key = "iPhone 17"
    run_spider(search_key)

2.3.4 存數據!

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計算平均價格、最高評分等。

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這種站點會省掉很多無意義的折騰。有需要的可以去瞅瞅~
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.