想做价格监控、评论分析或竞品跟踪?“打开页面复制粘贴”很简单,但真正用 Python 抓取亚马逊产品数据 时,最容易卡在:页面结构变、价格抓不到、请求频繁被拦。
这篇文章给你一套能落地的网页抓取流程:先用最小脚本跑通,再把稳定性和维护成本压下来。
亚马逊商品页信息很多,建议先做一个“最小字段集”,后面再扩展:
商品标题(title)
当前价格(price)
评分与评论数(rating / review_count)
关键属性(颜色/规格等,按业务需要)
字段越少,抓取通常 更快、更稳定、失败率更低,后续维护也更省心。
同样是网页抓取,亚马逊的坑会更密一些,常见原因包括:
结构经常变:同一个模块在不同地区/不同账号下可能是不同 HTML
动态内容多:价格、库存等可能延迟加载或分散在多个节点
反爬机制强:频率一高就可能出现 503、验证页,甚至直接“机器人检查”
所以目标不是“写个脚本跑一次”,而是做一个 可重复、可监控、可扩展 的小系统。
做“亚马逊产品数据抓取”选型,可以按工作量和规模来判断:
Requests + BeautifulSoup:轻量、上手快,适合验证思路和小规模采集
Scrapy:适合成百上千 URL 的任务,调度、重试、中间件更成熟
Selenium/无头浏览器:能处理强 JS 页面,但慢、资源消耗大
抓取 API:把代理、验证码、浏览器渲染等杂活交出去,工程成本更低
当你发现自己大部分时间都在处理“封禁、验证码、代理池、浏览器渲染”这些基础设施时,换个思路会更省时间。
👉 用 ScraperAPI 把代理与反爬处理交给它,专注拿数据
bash
pip install requests beautifulsoup4 lxml
下面示例只演示“能跑通”的最小版本。实际项目里,你会把字段选择、异常处理、存储拆成模块。
python
import requests
from bs4 import BeautifulSoup
PRODUCT_URL = "PRODUCT_URL_HERE" # 替换为你的商品页 URL
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/120.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
}
session = requests.Session()
resp = session.get(PRODUCT_URL, headers=headers, timeout=20)
resp.raise_for_status()
html = resp.text
if "Robot Check" in html or "captcha" in html.lower():
raise RuntimeError("可能触发了验证页:先降频、加缓存,并确认你的抓取行为合规。")
soup = BeautifulSoup(html, "lxml")
def pick_text(selector: str):
el = soup.select_one(selector)
return el.get_text(strip=True) if el else None
data = {
"title": pick_text("#productTitle"),
"price": pick_text("span.a-offscreen"),
"rating": pick_text("i[data-hook='average-star-rating'] span"),
"review_count": pick_text("#acrCustomerReviewText"),
}
print(data)
小提醒:价格节点经常出现多个(到手价、划线价、不同规格价)。span.a-offscreen 只是“先拿到一个价格文本”。
如果你要做价格监控,建议加一层筛选逻辑,比如根据父节点区域或标签文案做判断。
把“能抓到”变成“持续稳定抓到”,通常不靠玄学,靠这些工程细节:
做请求节流:按域名设置间隔(比如 2–5 秒),并加入随机抖动
分类处理状态码:429/503 不要硬刚,做指数退避重试并记录失败原因
缓存与增量:同一商品短时间别重复抓,能把请求量砍掉一大截
选择器要宽容:优先用稳定的 id/data-hook,避免写死层级很深的路径
加可观测性:至少记录成功率、平均耗时、失败页面样本,方便快速定位变更
如果你已经做了降频、重试、缓存,还是频繁遇到验证页或大规模失败,通常意味着“基础设施”才是瓶颈。
这类场景下,用抓取 API 往往能把维护成本压到更低,同时让抓取更稳定、更可预期。
👉 试试 ScraperAPI:更省心地稳定抓取亚马逊页面
最小可用的数据闭环,是“抓取 → 存储 → 回放/分析”。先从 CSV 开始就够用:
python
import csv
fieldnames = ["title", "price", "rating", "review_count"]
with open("amazon_products.csv", "a", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
if f.tell() == 0:
writer.writeheader()
writer.writerow(data)
后面规模变大再换 SQLite/PostgreSQL,也不迟。
做 Python 抓取亚马逊产品数据 之前,建议你至少过一遍这几条:
先确认网站条款与 robots 约束,避免踩红线
不采集与业务无关的个人信息,尽量只做商品公开信息
把验证码/验证页当成“需要停下来调整策略”的信号,而不是必须绕过的目标
有官方接口或授权渠道时,优先使用更稳、更合规的方式
1)为什么标题能抓到,价格抓不到?
价格可能被拆在多个区域或动态加载。先把 HTML 保存下来对照定位,再做更稳的选择器与筛选逻辑。
2)用 Scrapy 还是 Selenium?
要跑很多 URL、重试与调度很重要时选 Scrapy;页面强 JS、必须渲染才能拿到内容时再考虑 Selenium。
3)怎么判断是不是被拦了?
除了 429/503,也要检查返回内容是否出现“Robot Check”“captcha”等关键词,并把这类页面单独归档。
如果你接下来要把脚本扩展到“几千个商品、每天定时跑、失败自动告警”,可以继续把需求抛给我,我能帮你把抓取流程拆成可复用的模块(队列、重试、日志、存储结构等)。