1. 项目背景与核心价值
最近在帮朋友研究二手交易平台数据时,发现很多中小商家对商品定价和品类分布有强烈的分析需求。传统手动记录方式效率极低,而市面上现有工具要么功能过剩价格昂贵,要么成功率无法保证。经过两周的开发和测试,我整理出一套稳定高效的二手商品数据采集方案,在最近三个月的实测中保持100%成功率。
这套方案的核心优势在于:
- 完全基于公开可获取的页面数据
- 绕过传统爬虫容易被封禁的痛点
- 采用模块化设计方便后期维护
- 零成本部署(不需要购买付费API)
重要提示:所有操作请严格遵守平台robots.txt规定,单日请求量控制在合理范围,避免对目标服务器造成负担
2. 技术方案设计思路
2.1 整体架构设计
采用分层架构实现功能解耦:
code复制[数据采集层] → [数据处理层] → [存储层]
↑ ↑
[反反爬策略] [异常处理]
2.2 关键技术选型
-
请求模拟:使用Playwright替代传统requests库
- 优势:完整模拟浏览器环境,支持动态渲染页面
- 配置示例:
python复制from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) context = browser.new_context(user_agent='Mozilla/5.0...') page = context.new_page()
-
数据解析:组合使用XPath和CSS选择器
- 商品标题提取示例:
python复制title_xpath = '//h1[@class="title"]/text()' price_css = 'div.price::text'
- 商品标题提取示例:
-
反反爬策略:
- 动态IP轮询(建议使用家庭宽带动态IP)
- 随机化操作间隔(1-3秒)
- 模拟人工滚动页面行为
3. 完整实现流程
3.1 环境准备
基础环境配置:
bash复制# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
# 安装核心依赖
pip install playwright beautifulsoup4 pandas
playwright install
3.2 核心采集逻辑
分页采集示例代码:
python复制def crawl_page(keyword, page_num):
url = f"https://.../search?keyword={keyword}&page={page_num}"
try:
page.goto(url, timeout=60000)
page.wait_for_selector('div.item', timeout=5000)
# 模拟人工滚动
for _ in range(3):
page.mouse.wheel(0, 500)
time.sleep(random.uniform(0.5, 1.5))
items = page.query_selector_all('div.item')
return parse_items(items)
except Exception as e:
log_error(f"Page {page_num} failed: {str(e)}")
return None
3.3 数据存储方案
推荐使用SQLite+CSV双备份:
python复制# SQLite存储
conn = sqlite3.connect('data.db')
df.to_sql('products', conn, if_exists='append', index=False)
# CSV追加存储
df.to_csv('backup.csv', mode='a', header=False, encoding='utf-8')
4. 实战经验与避坑指南
4.1 稳定性提升技巧
-
元素定位策略:
- 优先使用包含class和text的组合定位
- 示例:
//div[contains(@class,"item") and contains(.,"手机")]
-
超时设置黄金法则:
- 页面加载:60秒
- 元素等待:5-8秒
- 操作间隔:1-3秒
-
异常处理模板:
python复制try:
element = page.wait_for_selector(selector, timeout=8000)
if not element:
raise ElementNotFound
return element.text_content()
except (TimeoutError, ElementNotFound):
return None
4.2 常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 返回空数据 | 页面结构变化 | 更新选择器,添加多重定位策略 |
| 频繁验证码 | 操作频率过高 | 增加随机延迟,模拟鼠标移动轨迹 |
| 连接重置 | IP被限制 | 切换网络环境,降低采集频率 |
5. 数据应用场景拓展
采集到的数据可以用于:
- 价格监控:建立历史价格曲线
- 竞品分析:统计品类分布和上新频率
- 标题优化:分析高曝光商品的标题关键词
- 库存预测:跟踪商品下架时间规律
示例分析代码:
python复制# 价格分布分析
df['price'] = df['price'].astype(float)
print(df['price'].describe())
# 标题词频统计
from collections import Counter
words = ' '.join(df['title']).split()
print(Counter(words).most_common(10))
这套方案经过三个月的持续迭代,目前每天稳定采集约5000条商品数据。最关键的心得是:保持请求行为的人性化比追求技术复杂度更重要。建议每次运行后检查日志文件,重点关注被跳过的页面和异常情况,持续优化选择器和等待策略