PySpider 是一个基于生产者-消费者模式的高性能分布式网络爬虫系统,采用多线程架构和消息队列通信机制,能够高效地抓取和解析网页内容。系统专为大规模网页抓取任务设计,在本地测试环境中成功完成 160,000+ 网页的抓取与解析,具备企业级的稳定性和可扩展性。
PySpider/ ├── main.py # 主程序入口 ├── config.py # 配置中心 ├── distributed_crawler.py # 分布式爬虫控制器 ├── concurrent_fetcher.py # 并发抓取器 ├── distributed_parser.py # 分布式解析器 ├── thread_pool.py # 线程池管理器 + URL去重器 ├── message_queue.py # 消息队列系统 ├── result_processor.py # 结果处理器 └── requirements.txt # 依赖库 Data/ ├── Github_1W.csv # GitHub 爬取结果(1万页) └── Wiki_16W.csv # Wikipedia 爬取结果(16万页) # 云原生配置 ├── Dockerfile # 容器镜像构建 ├── .cnb.yml # CNB 云原生构建配置 ├── settings.json # VS Code 设置 └── LICENSE # MIT 开源协议
| 层级 | 技术选型 | 说明 |
|---|---|---|
| 开发语言 | Python 3.12+ | 类型提示、数据类、枚举类型 |
| 并发模型 | threading + queue | 多线程 + 线程安全队列 |
| 网络请求 | requests | Session 复用、连接池、自动重定向 |
| HTML解析 | html.parser | 标准库实现,无需额外依赖 |
| 数据存储 | CSV | 实时写入,逐行持久化 |
| 容器化 | Docker | Ubuntu 24.04 + Python 3.12 |
| 云平台 | CNB (Cloud Native Build) | 云原生开发环境,code-server IDE |
# 1. 克隆项目
git clone <repository-url>
cd PySpider
# 2. 安装依赖
pip install -r requirements.txt
# 3. 配置 config.py(可选,默认已配置 GitHub 爬虫)
# 修改 start_urls、target_count、output_file 等参数
# 4. 运行爬虫
python main.py
# 5. 查看输出
# 实时进度:控制台输出
# 最终结果:CSV 文件(如 Github.csv)
# 1. 构建镜像
docker build -t pyspider:latest .
# 2. 运行容器
docker run -d -p 8080:8080 -v $(pwd):/workspace --name pyspider-dev pyspider:latest
# 3. 访问 Web IDE
# 浏览器打开 http://localhost:8080
# 4. 在容器中运行爬虫
cd /workspace/PySpider
python main.py
本项目已配置 CNB 云原生开发环境,支持一键启动云端 IDE:
CONFIG = {
# 爬虫基本设置
"start_urls": ["https://github.com/"], # 起始 URL
"target_count": 10000, # 目标抓取数量
"output_file": "Github.csv", # 输出文件名
# 线程池配置
"num_fetcher_threads": 24, # 抓取线程数
"num_parser_threads": 20, # 解析线程数
# 队列配置(支持 16 万页面规模)
"fetch_queue_size": 160000,
"parse_queue_size": 120000,
"result_queue_size": 160000,
# 网络请求配置
"request_timeout": 30, # 请求超时(秒)
"max_retries": 3, # 最大重试次数
# 性能优化配置
"url_deduplication_shards": 64, # URL去重分片数
"memory_limit_mb": 8192, # 内存限制(8GB)
"gc_interval": 3, # 垃圾回收间隔(秒)
# URL 过滤配置
"url_blacklist_patterns": [ # 黑名单正则
r".*\.(jpg|jpeg|png|gif|bmp|svg|ico)$",
r".*\.(pdf|doc|docx|xls|xlsx|ppt|pptx)$",
r".*\.(mp3|mp4|avi|mov|wmv|flv)$",
],
}
输入URL → URL去重器 → 抓取队列 → 并发抓取器 → 解析队列 → 分布式解析器 → 结果队列 → 结果处理器 → CSV输出 ↑ ↓ └────────────────────────── 新URL回流循环 ───────────────────────────────────────────────┘
class URLDeduplicator:
"""高性能URL去重器 - 使用64分片集合减少锁竞争"""
def __init__(self, num_shards: int = 64):
self.shards = [set() for _ in range(num_shards)]
self.locks = [threading.Lock() for _ in range(num_shards)]
def add(self, url: str) -> bool:
shard_index = hashlib.md5(url.encode()).hexdigest()
with self.locks[shard_index]:
if url in self.shards[shard_index]:
return False # URL 已存在
self.shards[shard_index].add(url)
return True # 新 URL
技术亮点:
| 环境 | 抓取数量 | 成功率 | 平均速度 |
|---|---|---|---|
| 本地环境 | 160,000 页 | > 95% | 10-50 页/秒 |
| 网络环境 | 25,000 页 | > 90% | 2-10 页/秒 |
| 指标 | 数值 | 说明 |
|---|---|---|
| 内存占用 | ~800MB/10万URL | 64分片去重器优化 |
| CPU 利用率 | 60-80% | 多线程均衡负载 |
| 磁盘 IO | 逐行写入 | 实时持久化,无积压 |
| 网络连接 | Session 复用 | 连接池减少开销 |
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| URL | string | 网页地址 | https://github.com/torvalds/linux |
| Size | int | 网页大小(字节) | 45678 |
| URL_Count | int | 页面提取的 URL 数量 | 42 |
2025-12-17 10:30:45 | [1/10000] | https://github.com | 45678 bytes | 42 URLs 2025-12-17 10:30:46 | [2/10000] | https://github.com/features | 38291 bytes | 38 URLs ... ============================================================ 分布式网络爬虫结束 ============================================================ 根URL: https://github.com/ 目标解析网址数量: 10000 抓取线程数量: 24 解析线程数量: 20 输出文件名: /workspace/PySpider/Github.csv 总共尝试抓取网页数: 10542 最终解析成功写入csv文件网页数: 10000 ============================================================
欢迎提交 Issue 和 PR!请遵循以下规范:
本项目采用 MIT License 开源协议。
提示:本项目仅供学习和研究使用,请遵守目标网站的 robots.txt 和相关法律法规,合理控制爬取频率。