如果说跨境电商是一场没有硝烟的战争,那么数据就是最锋利的武器。 在 eBay 这样的国际电商平台上,爆款商品的背后,往往意味着:
可现实是,很多朋友刚写好一个简单爬虫,没跑几页就遭遇 403 禁止访问 或者被弹出“你是机器人吗?”的拦截提示。这背后的核心问题就是:IP 和访问模式太单一,很容易被目标网站识别。
解决办法并不复杂:借助海外代理 IP,让爬虫更像一个真实的用户,再加上代理池轮换、重试回退、随机 UA、速率限制等,就能大幅提升采集的稳定性。
具体如何实施呢?很多小白依然瞎子抓虾一头雾水。别着急,今天我们就从 0 到 1 带你一起来最终实现:自动批量采集某关键词下的 eBay 爆款商品,并保存到 Excel 中。
一句话总结:既要采得到,也要采得稳。
pip install requests lxml pandas
在数据采集场景中,海外代理ip的作用可以说是非常必要的。
作为常年写爬虫的开发者,我试过不少代理服务,青果给我的体验可以用几个字概括:稳如老狗。
👆是他们家的带宽,海外代理ip带宽有多重要不需要我多说了吧。
👆这是他们家的并发
在青果网络的后台复制 API 提取链接,例如:
https://overseas.proxy.qg.net/get?key=yourkey&num=1&area=&isp=&format=txt&seq=\r\n&distinct=false
在 eBay 搜索“iphone”,URL 如下:
https://www.ebay.com/sch/i.html?_nkw=iphone&_pgn=1
通过对比翻页:
_nkw
→ 关键词_pgn
→ 页码这意味着只要改 _pgn=2,3,4…
,就能翻页抓取。逻辑非常清晰,完全可以用代码来自动构造。
废话不多说,直接上:
import os, time, random, logging, requests, pandas as pd
from lxml import etree
from typing import List, Dict, Optional
# =========================
# 可配置区
# =========================
KEYWORD = "iphone"
SITE = "www.ebay.com"
PAGES = 5
PROXY_API = "https://overseas.proxy.qg.net/get?key=yourkey&num=1&area=&isp=&format=txt&seq=\r\n&distinct=false"#使用青果网络海外代理IP API
OUTPUT_XLSX = f"{KEYWORD}_ebay_hot.xlsx"
# =========================
# 日志
# =========================
logging.basicConfig(level=logging.INFO,
format="%(asctime)s | %(levelname)s | %(message)s")
logger = logging.getLogger("ebay-hot")
# =========================
# 工具:UA 池
# =========================
UA_POOL = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/605.1.15 Version/16.5 Safari/605.1.15",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/123.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0",
]
def rand_headers(): return {"User-Agent": random.choice(UA_POOL)}
# =========================
# 代理池
# =========================
def get_proxy() -> Optional[Dict[str, str]]:
try:
r = requests.get(PROXY_API, timeout=8)
ip = r.text.strip().splitlines()[0].strip()
return {"http": f"http://{ip}", "https": f"http://{ip}"}
except Exception as e:
logger.warning(f"获取代理失败:{e}")
return None
# =========================
# 请求封装(重试+回退)
# =========================
def fetch_html(url: str, retries=4) -> Optional[str]:
for attempt in range(1, retries+1):
proxies = get_proxy()
headers = rand_headers()
try:
logger.info(f"请求 {url} | 尝试 {attempt}")
r = requests.get(url, headers=headers, proxies=proxies, timeout=12)
r.raise_for_status()
return r.text
except Exception as e:
backoff = 2 ** attempt + random.random()
logger.warning(f"失败:{e} | {backoff:.1f}s 后重试")
time.sleep(backoff)
return None
# =========================
# 解析函数
# =========================
def parse(html: str, page: int) -> List[Dict]:
tree = etree.HTML(html)
items = tree.xpath('//li[contains(@class,"s-item")]')
results = []
for it in items:
title = _first(it.xpath('.//h3/text()'))
price = _first(it.xpath('.//span[@class="s-item__price"]/text()'))
sold = _first(it.xpath('.//span[contains(text(),"sold")]/text()'))
link = _first(it.xpath('.//a[@class="s-item__link"]/@href'))
img = _first(it.xpath('.//img[contains(@class,"s-item__image-img")]/@src'))
if title and link:
results.append({
"页码": page, "标题": title, "价格": price,
"销量": sold, "链接": link, "图片": img
})
return results
def _first(lst): return lst[0].strip() if lst else None
# =========================
# 主流程
# =========================
def run():
all_data = []
for p in range(1, PAGES+1):
url = f"https://{SITE}/sch/i.html?_nkw={KEYWORD}&_pgn={p}"
html = fetch_html(url)
if html:
rows = parse(html, p)
logger.info(f"第 {p} 页采集 {len(rows)} 条")
all_data.extend(rows)
time.sleep(random.uniform(2, 5))
if all_data:
df = pd.DataFrame(all_data)
df.drop_duplicates(subset=["链接"], inplace=True)
df.to_excel(OUTPUT_XLSX, index=False)
logger.info(f"导出完成:{os.path.abspath(OUTPUT_XLSX)}")
if __name__ == "__main__":
run()
运行脚本后,你会在目录下得到一个 iphone_ebay_hot.xlsx
文件,里面包含:
这些数据完全可以作为选品分析、市场调研的参考输入。比如统计平均价格区间、销量 TOP10 商品,或者对比不同时间段的爆款变化。
文章写到这里,完整的采集链路已经打通:分析 → 请求 → 解析 → 保存。不过,想要让脚本长期稳定运行,关键还是在“网络层”。如果没有优质的海外代理ip,写得再好的代码也可能被轻易封锁。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。