实验目标:
本次实验目标为设计一个分布式网络爬虫实现一下功能:
随着国际互联网的迅速发展,网上的信息越来越多,全球网页数量超过 20 亿, 每天新增加 730 万网页。要在如此浩瀚的信息海洋里寻找信息,就像"大海捞针"一 样困难。在实际生活中我们经常会使用像百度、Google 这些搜索引擎检索各种信息, 搜索引擎正是为了解决这个问题而出现的技术,而网络爬虫正是搜索引擎所需要的关 键部分。本次实验主要的内容就是利用 IO 复用抓取网页,并多线程的分析每个抓取 到的网页所包含的 URL 信息,通过消息队列将抓取网页的部分和分析网页部分进行通 信,最终记录下 160000 网页中所包含的所有 URL,实现分布式网络爬虫。
本项目成功实现了一个高性能的分布式网络爬虫系统,采用多线程架构和消息队列通信机制,能够高效地抓取和解析网页内容。该系统通过分布式设计实现了生产者-消费者模式,支持大规模网页抓取任务。
✅ URL分析和爬取:从给定网址开始,递归分析包含的URL并爬取网页
✅ 去重机制:高性能分片去重器确保不重复抓取
✅ 分布式支持:多线程并发,支持大规模网页抓取
✅ 网页大小记录:实时记录每个网页的大小信息
✅ 高性能设计:IO复用和多线程架构实现高性能
✅ 实际验证:本地16万页面、网络2.5万页面的成功抓取
本系统采用分层架构设计,将复杂的爬虫任务分解为多个独立但相互协作的模块:
__pycache__文件夹# 1. 进入项目目录
cd PySpider
# 2. 安装依赖
pip install -r requirements.txt
# 3. 配置好config.py后运行主程序
python main.py
# 4. 查看输出结果
# 实时进度:控制台输出
# 最终结果:CSV文件(如 Github.csv)
# 1. 构建镜像
docker build -t docker.cnb.cool/orionseeker/webspider:latest .
# 2. 运行容器
docker run -d -p 8080:8080 -v $(pwd):/workspace --name webspider-dev docker.cnb.cool/orionseeker/webspider:latest
# 3. 访问开发环境
浏览器打开 http://localhost:8080
# 4. 在容器中运行爬虫
cd PySpider
python main.py
# === 基本爬虫配置 ===
"start_urls": ["https://github.com/"] # 起始URL列表
"target_count": 10000 # 目标抓取页面数量
"output_file": "Github.csv" # 输出CSV文件名
# === 线程池配置 ===
"num_fetcher_threads": 24 # 抓取线程数量
"num_parser_threads": 20 # 解析线程数量
# === 队列配置 ===
"fetch_queue_size": 160000 # 抓取队列大小
"parse_queue_size": 120000 # 解析队列大小
"result_queue_size": 160000 # 结果队列大小
"url_queue_size": 240000 # URL队列大小
# === 网络请求配置 ===
"request_timeout": 30 # 请求超时时间(秒)
"max_retries": 3 # 最大重试次数
"user_agent": "Mozilla/5.0..." # 用户代理字符串
"headers": {...} # HTTP请求头配置
# === URL过滤配置 ===
"url_blacklist_patterns": [...] # URL黑名单正则表达式
"max_depth": 5 # 最大抓取深度
"same_domain_only": False # 是否只抓取同域名页面
"max_urls_per_page": 2000 # 每页最大URL提取数量
# === 性能优化配置 ===
"memory_limit_mb": 8192 # 内存限制(8GB)
"gc_interval": 3 # 垃圾回收间隔(秒)
"url_deduplication_shards": 64 # URL去重器分片数量
# === 动态超时配置 ===
"timeout_per_page": 1.0 # 每页预计处理时间(秒)
"min_completion_timeout": 3600 # 最小完成超时时间(1小时)
"max_completion_timeout": 86400 # 最大完成超时时间(24小时)
实时生成的CSV文件包含三列数据:
| 列名 | 描述 | 示例 |
|---|---|---|
| URL | 网页地址 | https://github.com/torvalds/linux |
| Size | 网页大小(字节) | 45678 |
| URL_Count | 从该页面提取的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 ...
PySpider/ ├── main.py # 主程序入口和生命周期管理 ├── config.py # 配置管理和参数优化 ├── distributed_crawler.py # 分布式爬虫控制器 ├── concurrent_fetcher.py # 并发抓取器 ├── distributed_parser.py # 分布式解析器 ├── thread_pool.py # 线程池管理器 ├── message_queue.py # 消息队列系统 ├── result_processor.py # 结果处理器 └── requirements.txt # Python依赖包列表
workspace/ ├── README.md # 项目完整文档 ├── .cnb.yml # 代码仓库配置 ├── Dockerfile # Docker容器配置 └── settings.json # code-server配置
PySpider/Data ├── Github.csv # GitHub网站爬取结果 └── Wiki.csv # Wikipedia网站爬取结果
输入URL → URL去重器 → 抓取队列 → 并发抓取器 → 解析队列 → 分布式解析器 → 结果队列 → 结果处理器 → CSV输出 ↑ ↓ └────────────────────────── 新URL回流循环 ──────────────────────────────────────────────────────┘
通过本分布式网络爬虫项目的开发,我们不仅完成了课题要求的技术目标,更重要的是建立了一个现代化、高性能、可扩展的网络爬虫系统,为搜索引擎的关键组成部分——网络爬虫提供了一个完整的解决方案。