1. 项目概述
最近在帮朋友做亚马逊产品调研时,发现手动收集评论实在太费时间。作为一个Python老手,我研究了下如何用最简单的方式批量抓取亚马逊商品评论。结果发现,只需要3行核心代码就能实现这个功能,今天就把这个高效方案分享给大家。
这个方案特别适合需要做竞品分析、市场调研的朋友。相比手动复制粘贴,用代码抓取效率能提升几十倍。我们主要利用Python的requests库和BeautifulSoup这两个工具,不需要复杂的爬虫框架,5分钟就能上手。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理与准备工作
2.1 技术选型解析
选择requests+BeautifulSoup组合主要考虑三个因素:
- 轻量级:不需要安装Scrapy等重型框架
- 易用性:API简单直观,学习成本低
- 灵活性:可以方便地处理各种网页结构
注意:亚马逊对爬虫有严格限制,建议设置合理的请求间隔(至少3秒),单次不要抓取过多页面。
2.2 环境配置
首先确保安装了Python3.6+版本,然后安装必要库:
bash复制pip install requests beautifulsoup4
建议使用虚拟环境:
bash复制python -m venv amz_review
source amz_review/bin/activate # Linux/Mac
amz_review\Scripts\activate # Windows
3. 核心代码实现
3.1 基础版三行代码
python复制import requests
from bs4 import BeautifulSoup
html = requests.get('商品URL').text
soup = BeautifulSoup(html, 'html.parser')
reviews = [div.text for div in soup.select('.review-text')]
这段代码的工作原理:
- requests获取页面HTML
- BeautifulSoup解析文档结构
- CSS选择器提取评论内容
3.2 增强版实现
基础版有几个问题需要改进:
- 没有处理分页
- 缺少请求头容易被封
- 没有异常处理
改进后的完整代码:
python复制import requests
from bs4 import BeautifulSoup
import time
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
def get_reviews(url, pages=3):
all_reviews = []
for page in range(1, pages+1):
try:
resp = requests.get(f'{url}&pageNumber={page}', headers=headers)
soup = BeautifulSoup(resp.text, 'html.parser')
reviews = [div.get_text(strip=True)
for div in soup.select('.review-text-content')]
all_reviews.extend(reviews)
time.sleep(3) # 礼貌爬取
except Exception as e:
print(f'第{page}页出错:', e)
return all_reviews
4. 关键问题解决方案
4.1 反爬虫绕过技巧
亚马逊的反爬机制主要包括:
- User-Agent检测
- 请求频率限制
- IP封禁
应对方案:
- 轮换User-Agent
- 使用代理IP池
- 设置随机延迟(3-10秒)
4.2 数据提取难点
评论数据可能出现在不同位置:
- 完整评论(.review-text-content)
- 折叠评论(.review-text')
- 不同语言版本页面
解决方案是用更通用的选择器:
python复制soup.select('[data-hook="review-body"]')
5. 数据存储与分析
5.1 存储方案比较
| 存储方式 | 优点 | 缺点 |
|---|---|---|
| CSV文件 | 简单易用 | 不适合大数据量 |
| SQLite | 轻量级数据库 | 需要SQL知识 |
| MongoDB | 灵活Schema | 需要安装服务 |
推荐使用pandas保存CSV:
python复制import pandas as pd
df = pd.DataFrame(reviews, columns=['content'])
df.to_csv('reviews.csv', index=False)
5.2 简单情感分析
可以用TextBlob进行基础情感分析:
python复制from textblob import TextBlob
def analyze_sentiment(text):
analysis = TextBlob(text)
return analysis.sentiment.polarity
df['sentiment'] = df['content'].apply(analyze_sentiment)
6. 实战注意事项
- 法律风险:仅抓取公开数据,不要绕过登录
- 频率控制:单商品建议每天不超过100页
- 数据用途:仅用于个人分析,禁止商业用途
- 异常处理:添加重试机制和超时设置
推荐使用代理的完整请求示例:
python复制proxies = {
'http': 'http://your_proxy:port',
'https': 'http://your_proxy:port'
}
resp = requests.get(url, headers=headers,
proxies=proxies, timeout=10)
7. 常见问题排查
7.1 返回空数据
可能原因:
- 选择器错误
- 触发反爬
- 页面结构变化
解决方案:
- 检查元素审查工具中的实际class
- 添加页面截图调试:
python复制with open('debug.html', 'w') as f:
f.write(resp.text)
7.2 请求被拒绝
典型表现:
- 返回403状态码
- 出现验证码页面
处理方法:
- 更新User-Agent
- 清除cookies
- 更换IP地址
8. 性能优化技巧
- 使用Session保持连接:
python复制session = requests.Session()
session.headers.update(headers)
- 异步请求加速(高级):
python复制import aiohttp
import asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
- 使用缓存避免重复请求:
python复制from requests_cache import CachedSession
session = CachedSession('amz_cache')
我在实际使用中发现,早上6-9点时间段抓取成功率最高。对于热门商品,最好把抓取任务分散到多天完成,每次只抓取部分页码。另外建议保存原始HTML,这样即使提取逻辑需要调整,也不用重新抓取页面。
