共计 1641 个字符,预计需要花费 5 分钟才能阅读完成。
问题背景
最近帮朋友监控二手显卡价格,手动复制咸鱼商品信息实在太痛苦了——每次要翻 20 多页,还得对比历史价格。更糟的是,频繁刷新后突然跳出验证码,所有努力白费。这种重复劳动正是自动化工具的用武之地。

技术方案对比
- Requests+BeautifulSoup
- 优点:学习成本低,适合轻量级采集
-
缺点:缺乏分布式支持
-
Scrapy 框架
- 优点:内置异步处理,扩展性强
-
缺点:配置复杂,过度设计
-
Puppeteer
- 优点:能处理动态渲染页面
- 缺点:资源消耗大,速度慢
建议新手从 Requests 起步,本文也基于此方案
核心实现
伪装浏览器头
import random
def get_headers():
"""生成随机 User-Agent 防止被识别为爬虫"""
user_agents = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'AppleWebKit/537.36 (KHTML, like Gecko)',
'Chrome/91.0.4472.124 Safari/537.36'
]
return {'User-Agent': random.choice(user_agents)}
智能间隔请求
import time
def safe_request(url):
"""带随机延迟的请求封装"""
time.sleep(random.uniform(1, 3)) # 1- 3 秒随机间隔
try:
response = requests.get(url, headers=get_headers(), timeout=10)
response.raise_for_status()
return response
except Exception as e:
print(f'请求失败: {e}')
return None
数据提取示例
from lxml import html
def parse_goods(page):
"""使用 XPath 提取商品信息"""
tree = html.fromstring(page)
try:
return tree.xpath('//div[@class="item-title"]/text()')
except AttributeError:
print('解析失败,页面结构可能已变更')
return []
反爬对抗策略
验证码破解
推荐使用:
– 打码平台(如超级鹰)
– OCR 识别简单验证码
IP 代理池搭建
关键要点:
1. 购买优质代理服务(芝麻代理等)
2. 实现自动 IP 切换机制
3. 定期测试代理可用性
示例代码:
PROXY_POOL = ['111.1.1.1:8888', '222.2.2.2:9999']
def get_with_proxy(url):
proxy = {'http': random.choice(PROXY_POOL)}
return requests.get(url, proxies=proxy, timeout=15)
数据持久化
MySQL 表设计
CREATE TABLE secondhand_goods (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) COMMENT '商品标题',
price DECIMAL(10,2) COMMENT '当前价格',
pub_date DATETIME COMMENT '发布时间',
seller VARCHAR(50) COMMENT '卖家昵称',
crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
生产环境 checklist
法律红线
- 遵守 robots.txt 协议
- 不爬取用户隐私数据
- 控制请求频率(建议≥3 秒 / 次)
监控建议
- 记录每次请求状态码
- 统计每日有效数据量
- 设置失败报警阈值
应急方案
- 立即切换代理 IP
- 临时降低采集频率
- 准备备用账号池
延伸思考
这套方法稍作修改就能用于:
1. 淘宝商品比价
2. 微博热点追踪
3. 招聘信息聚合
关键调整点:
– 目标网站的 DOM 结构
– 反爬策略强度评估
– 数据存储字段设计
正文完
