本项目是一个高性能的分布式网络爬虫系统,采用多线程架构和IO复用技术,能够高效地从一个给定网址开始,分析并爬取所有不重复的网页内容,直到完成全部网页抓取任务。系统具备分布式架构、智能去重、实时监控和大规模数据处理能力,支持160000+网页规模的爬取任务。
随着互联网的迅速发展,全球网页数量已超过20亿,每天新增730万网页。要在如此浩瀚的信息海洋中高效获取信息,网络爬虫作为搜索引擎的核心技术,发挥着关键作用。本项目通过消息队列机制实现抓取与解析的解耦,采用多线程设计提升并发性能,是一个兼具教学价值和实用价值的完整项目。

系统采用三个独立的消息队列实现线程间通信:
# 抓取队列:存储待抓取的URL
class FetchQueue(MessageQueue):
def add_url(self, url: str) -> bool:
# 非阻塞添加URL到抓取队列
# 解析队列:存储已抓取的页面内容
class ParseQueue(MessageQueue):
def add_page(self, url: str, content: str, size: int) -> bool:
# 非阻塞添加页面到解析队列
# 结果队列:存储解析后的URL结果
class ResultQueue(MessageQueue):
def add_result(self, url: str, new_urls: list, size: int) -> bool:
# 添加解析结果到结果队列
线程池管理器采用工厂模式统一管理所有线程:
class ThreadPoolManager:
def __init__(self, config):
# 初始化三个队列
self.fetch_queue = FetchQueue()
self.parse_queue = ParseQueue()
self.result_queue = ResultQueue()
# 高性能URL去重器
self.visited_urls = URLDeduplicator(num_shards=16)
# 创建抓取器和解析器
self.fetcher = ConcurrentFetcher(num_threads=20)
self.parser = DistributedParser(num_threads=16)
解析器使用标准库html.parser实现HTML解析和URL提取:
class URLExtractor(HTMLParser):
def handle_starttag(self, tag, attrs):
if tag == "a":
for attr_name, attr_value in attrs:
if attr_name == "href":
# 提取并清理URL
absolute_url = urljoin(self.base_url, attr_value)
cleaned_url = self._clean_url(absolute_url)
# Python 3.12+ 环境
python3 --version
# 安装依赖
pip install requests
# 或使用项目依赖文件
pip install -r requirements.txt
主要配置在config.py文件中:
CONFIG = {
# 基础配置
"start_urls": ["https://github.com/"], # 起始URL列表
"target_count": 10000, # 目标抓取数量
"output_file": "wiki.csv", # 输出文件名
# 并发配置
"num_fetcher_threads": 20, # 抓取线程数
"num_parser_threads": 16, # 解析线程数
# 队列配置
"fetch_queue_size": 50000, # 抓取队列大小
"parse_queue_size": 50000, # 解析队列大小
# 网络配置
"request_timeout": 10, # 请求超时(秒)
"max_retries": 3, # 最大重试次数
# 过滤配置
"max_content_size": 100 * 1024 * 1024, # 最大内容大小(100MB)
"same_domain_only": False, # 是否只抓取同域名
"max_depth": 5, # 最大深度
}
# 进入项目目录
cd /workspace/PySpider
# 直接运行爬虫
python3 main.py
# 实时输出示例:
# 2024-12-14 15:30:25 | [1/10000] | https://github.com/ | 562355 bytes | 107 URLs
# 2024-12-14 15:30:26 | [2/10000] | https://github.com/collections | 166491 bytes | 94 URLs
# 2024-12-14 15:30:27 | [3/10000] | https://github.com/readme | 308981 bytes | 142 URLs
# 查看结果文件
cat wiki.csv
CSV输出文件包含三列:
URL,Size,URL_Count https://github.com/,562355,107 https://github.com/collections,166491,94 https://github.com/readme,308981,142
当达到目标数量时,系统会输出完整的统计信息:
============================================================ 分布式网络爬虫结束 ============================================================ 根URL: https://github.com/ 目标解析网址数量: 10000 抓取线程数量: 20 解析线程数量: 16 输出文件名: /workspace/PySpider/wiki.csv 总共尝试抓取网页数: 15234 最终解析成功写入csv文件网页数: 10000 ============================================================
PySpider/ ├── main.py # 主程序入口 ├── config.py # 配置管理 ├── distributed_crawler.py # 分布式控制器 ├── concurrent_fetcher.py # 并发抓取器 ├── distributed_parser.py # 分布式解析器 ├── message_queue.py # 消息队列系统 ├── thread_pool.py # 线程池管理器 ├── result_processor.py # 结果处理器 ├── requirements.txt # 依赖库列表 └── README.md # 项目说明文档 # 输出文件 ├── wiki.csv # 爬取结果文件 └── crawler.log # 运行日志文件
| 组件 | 技术选型 | 用途 |
|---|---|---|
| 核心语言 | Python 3.12+ | 主要编程语言 |
| 并发模型 | threading.Thread | 多线程并发处理 |
| HTTP客户端 | requests 2.31+ | 网页下载、会话管理 |
| HTML解析 | html.parser | 内置解析器,无额外依赖 |
| 队列系统 | queue.Queue | 线程安全消息队列 |
| 数据存储 | CSV格式 | 结果输出、数据分析 |
| URL处理 | urllib.parse | URL解析、标准化 |
这个分布式网络爬虫项目不仅实现了完整的爬取功能,还展示了Python在并发编程、网络编程和系统架构设计方面的强大能力,是一个兼具教学价值和实用价值的高质量项目。