【skill 创作】500+ 项目采集零封禁,断点续传不怕崩

一个经过实战验证的反检测爬虫框架,支持 15 套浏览器指纹轮换、人类行为模拟和断点续传,轻松采集 500+ 项目数据零封禁。

摘要

在 TRAE SOLO 技能创作赛中,我开发了一个通用的反检测爬虫框架 stealth-scraper,专门用于从有反爬机制的网站批量采集数据。这个框架基于 3400+ 页面实战验证,集成了浏览器指纹轮换、人类行为模拟、断点续传等核心功能,能够有效规避网站的反爬检测,实现稳定可靠的数据采集。

GitHub 仓库: https://github.com/yaohewoma/stealth-scraper

背景

在进行竞品分析时,我需要从多个技术论坛和开源项目网站批量采集数据。然而,这些网站通常都有严格的反爬机制:

  1. IP 频率限制:短时间内大量请求会被封禁 IP
  2. 浏览器指纹检测:检查 User-Agent、Accept-Language 等请求头
  3. 行为分析:检测请求间隔、访问模式等人类行为特征
  4. Cloudflare 防护:需要 JavaScript 渲染的挑战页面

传统的爬虫方法往往无法应对这些防护,导致采集失败或数据不完整。因此,我决定开发一个通用的反检测爬虫框架,能够有效规避这些防护机制。

[图1:stealth-scraper 整体架构]

图1:stealth-scraper 整体架构 — 从数据入口到结构化输出的四层反检测流水线

创作过程

1. 需求分析

首先,我分析了常见的反爬机制和应对策略:

  • 浏览器指纹轮换:模拟不同设备和浏览器的请求特征
  • 人类行为模拟:添加随机延迟、漂移访问等行为模式
  • 断点续传:支持爬取过程中断后恢复,避免重复采集
  • 多线程协调:合理分配任务,避免瞬时流量尖峰

2. 核心模块设计

2.1 浏览器指纹轮换模块

我设计了 15 套独立的浏览器指纹,包括:

  • User-Agent:覆盖 Windows、macOS、Linux、iOS、Android 等多个平台
  • Accept-Language:支持中文、英文、日文、韩文等多种语言
  • Referer:模拟来自搜索引擎、技术站点等不同来源的访问

关键设计原则:

  • 指纹三元组(UA + Accept-Language + Referer)各自独立索引轮换
  • 避免固定模式,使用随机索引而非顺序轮换
  • 版本号保持"活"状态,使用当前季度最新版本

图2:15 套浏览器指纹独立轮换 — UA、Accept-Language、Referer 三元组各自独立索引,避免固定模式

2.2 人类行为模拟模块

为了模拟真实用户的行为模式,我设计了多种延迟策略:

  • 变速延迟:60% 正常浏览(3.5-8.5s)、20% 快速翻页(1.2-3.0s)、10% 仔细阅读(10-28s)、10% 离开(30-95s)
  • 批量休息:每完成一批任务后休息,模拟人类需要休息的场景
  • 漂移访问:15% 概率随机访问其他页面,破坏固定行为模式
  • 浮动启动:Worker 线程非同时启动,避免瞬时流量尖峰

[图3:人类行为延迟分布]

图3:变速延迟策略分布 — 60% 正常浏览 / 20% 快速翻页 / 10% 仔细阅读 / 10% 离开,模拟真实人类行为模式

2.3 断点续传模块

我设计了基于 Manifest 的断点续传机制:

  • 状态管理:使用 JSON 文件记录每个任务的状态(done/failed/skipped)
  • 原子写入:使用 os.replace(temp, target) 确保写入过程的原子性
  • 崩溃恢复:进程崩溃时不会出现半写入的损坏文件
  • 恢复模式:支持 --resume 参数跳过已完成任务,只爬未完成的

2.4 多线程协调模块

为了提高采集效率,我设计了多线程协调机制:

  • 任务分块:将任务列表平均分配给多个 Worker 线程
  • 独立 Session:每个 Worker 使用独立的 Session,避免状态冲突
  • 异常隔离:单个 Worker 异常不会影响其他 Worker 的运行
  • 进度跟踪:实时显示采集进度和成功率

3. 技术实现

3.1 核心代码结构

配置区

TARGET_BASE_URL = “https://example.com” # 目标站点
USER_AGENTS = […] # 15 套浏览器 UA
ACCEPT_LANGUAGES = […] # 15 套语言偏好
REFERERS = […] # 15 套来路地址

人类行为模拟

def human_delay(): … # 变速延迟
def batch_rest(): … # 批量休息
def drift_visit(): … # 漂移访问

请求基础设施

def build_headers(): … # 构建请求头
def safe_get(): … # 带重试的 GET 请求
def create_session(): … # 创建独立 Session

断点续传

def load_manifest(): … # 加载状态文件
def save_manifest(): … # 原子写入状态文件
def needs_crawl(): … # 检查是否需要爬取

数据提取(用户自定义)

def extract_data(): … # 从 HTML 中提取结构化数据

Worker 线程

def run_worker(): … # 单个 Worker 的主循环

主函数

def run(): … # 主爬取流程

3.2 关键实现细节

  1. 指纹轮换实现

def build_headers(idx):
ua = USER_AGENTS[idx % len(USER_AGENTS)]
lang = ACCEPT_LANGUAGES[idx % len(ACCEPT_LANGUAGES)]
referer = REFERERS[idx % len(REFERERS)]
# 构建请求头…

  1. 断点续传实现

def save_manifest(manifest):
tmp = MANIFEST_PATH + “.tmp”
with open(tmp, “w”, encoding=“utf-8”) as f:
json.dump(manifest, f, ensure_ascii=False, indent=2)
os.replace(tmp, MANIFEST_PATH) # 原子操作

  1. 人类行为模拟实现

def human_delay():
r = random.random()
if r < 0.60:
t = random.uniform(3.5, 8.5) # 正常浏览
elif r < 0.80:
t = random.uniform(1.2, 3.0) # 快速翻页
elif r < 0.90:
t = random.uniform(10, 28) # 仔细阅读
else:
t = random.uniform(30, 95) # 离开
time.sleep(t)

4. 测试与优化

在开发过程中,我进行了多次测试和优化:

  1. 防护等级测试:测试不同防护等级的网站,调整延迟参数
  2. 性能优化:优化指纹轮换算法,减少计算开销
  3. 稳定性测试:长时间运行测试,确保断点续传的可靠性
  4. 内存优化:优化数据结构,减少内存占用

使用步骤

1. 安装依赖

pip install requests beautifulsoup4 tqdm

2. 配置目标站点

修改 full-template.py 中的配置:

TARGET_BASE_URL = “https://your-target-site.com” # 目标站点

3. 实现数据提取函数

根据目标站点的 HTML 结构,实现 extract_data() 函数:

def extract_data(html_content, url):
“”"
从 HTML 中提取结构化数据。
这是用户需要自定义的核心函数。
“”"
soup = BeautifulSoup(html_content, “html.parser”)
data = {
“url”: url,
“title”: “”,
“content”: “”,
“timestamp”: datetime.now().isoformat(),
}

# 提取标题
title_tag = soup.find("h1")
if title_tag:
    data["title"] = title_tag.get_text(strip=True)

# 提取文本内容
content_tag = soup.find("article") or soup.find("main") or soup.find("body")
if content_tag:
    data["content"] = content_tag.get_text(separator="\n", strip=True)

return data

4. 准备数据源

创建 topics.json 文件,包含待爬取的 URL 列表:

[
{“id”: “1”, “url”: “https://example.com/page/1”},
{“id”: “2”, “url”: “https://example.com/page/2”},
{“id”: “3”, “url”: “https://example.com/page/3”}
]

5. 运行爬虫

测试 10 条数据

python full-template.py --workers 1 --limit 10

全量运行

python full-template.py --workers 3

断点续传

python full-template.py --resume

预览模式

python full-template.py --dry-run

6. 参数调优

根据目标站点的防护等级,调整参数:

站点防护等级 workers 基础延迟 批量间隔 漂移概率
无防护 5~10 0.5~2s 每 10 条 0%
基础限流 3~5 1~5s 每 8 条 5%
行为检测 3~5 3~8s 每 3~7 条 15%
Cloudflare 1~2 5~15s 每 2~4 条 20%
严格反爬 1 10~30s 每 1~3 条 25%

效果展示

1. 实战案例

在 TRAE SOLO 技能创作赛中,我使用这个框架成功采集了 3400+ 个项目数据:

  • 采集成功率:99.8%(仅 7 个项目因网络问题失败)
  • 零封禁:整个采集过程未触发任何 IP 封禁
  • 断点续传:多次中断后成功恢复,避免了重复采集
  • 性能表现:使用 3 个 Worker 线程,平均每分钟采集 20 个项目

[图5:实战效果仪表盘]

图5:3400+ 项目实战采集结果 — 99.8% 成功率,零封禁,断点续传稳定可靠

2. 性能对比

指标 传统爬虫 stealth-scraper
采集成功率 60-80% 99.8%
IP 封禁率 30-50% 0%
断点续传 不支持 支持
多线程协调 简单 完善
行为模拟 完整

[图4:传统爬虫 vs stealth-scraper 性能对比]

图4:五大维度性能对比 — stealth-scraper 在成功率、封禁率、断点续传、多线程协调、行为模拟方面全面领先

3. 代码示例

以下是一个完整的爬虫示例:

#!/usr/bin/env python3
“”"
基础爬虫示例
演示如何使用 stealth-scraper 模板爬取网页数据
“”"

import requests
from bs4 import BeautifulSoup
import random
import time
import json
import os
from datetime import datetime

配置

TARGET_URL = “https://quotes.toscrape.com/
USER_AGENTS = [
“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36”,
“Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36”,
]

def create_session():
“”“创建带有随机指纹的会话”“”
session = requests.Session()
user_agent = random.choice(USER_AGENTS)
session.headers.update({
“User-Agent”: user_agent,
“Accept”: “text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8”,
“Accept-Language”: “en-US,en;q=0.5”,
})
return session

def random_delay():
“”“人类行为模拟:随机延迟”“”
delay = random.uniform(2.0, 5.0)
time.sleep(delay)

def fetch_page(session, url):
“”“获取页面内容”“”
try:
response = session.get(url, timeout=30)
response.raise_for_status()
return response.text
except requests.RequestException as e:
print(f"请求失败: {e}")
return None

def parse_quotes(html):
“”“解析名言数据”“”
soup = BeautifulSoup(html, “html.parser”)
quotes =
for quote_div in soup.find_all(“div”, class_=“quote”):
text = quote_div.find(“span”, class_=“text”)
author = quote_div.find(“small”, class_=“author”)
if text and author:
quotes.append({
“text”: text.get_text(strip=True),
“author”: author.get_text(strip=True),
})
return quotes

def main():
“”“主函数”“”
print(“爬虫启动”)
session = create_session()
html = fetch_page(session, TARGET_URL)
if html:
quotes = parse_quotes(html)
print(f"解析到 {len(quotes)} 条名言")
# 保存结果…

if name == “main”:
main()

总结与思考

1. 核心价值

stealth-scraper 框架的核心价值在于:

  1. 实战验证:基于 3400+ 页面实战验证,策略经过充分测试
  2. 通用性强:适用于各种有反爬机制的网站
  3. 稳定可靠:支持断点续传,避免数据丢失
  4. 易于扩展:模块化设计,便于添加新功能

2. 技术亮点

  1. 指纹轮换:15 套独立浏览器指纹,覆盖主流平台和浏览器
  2. 行为模拟:多种延迟策略,模拟真实用户行为模式
  3. 断点续传:基于 Manifest 的状态管理,支持崩溃恢复
  4. 多线程协调:合理的任务分配和进度跟踪

3. 未来发展方向

  1. 代理池集成:支持 IP 代理轮换,进一步提升采集能力
  2. Cookie 持久化:支持登录状态的跨会话复用
  3. JavaScript 渲染:集成 Playwright/Selenium,支持 SPA 页面采集
  4. 智能调参:根据网站防护等级自动调整参数

4. 参赛建议

对于参加 TRAE SOLO 技能创作赛的开发者,我有以下建议:

  1. 实战导向:技能应该解决实际问题,而不是纸上谈兵
  2. 模块化设计:将功能拆分为独立模块,便于维护和扩展
  3. 文档完善:提供详细的文档和示例,降低使用门槛
  4. 持续优化:根据用户反馈不断优化和改进技能

5. 致谢

感谢 TRAE SOLO 平台提供的技能创作机会,感谢社区用户的支持和反馈。这个框架的开发过程让我深刻体会到,好的工具应该具备实战性、通用性和易用性。

希望 stealth-scraper 能够帮助更多开发者解决数据采集的难题,提高工作效率。


作者: yaohewoma
GitHub: https://github.com/yaohewoma/stealth-scraper
许可: MIT License