多进程在小型爬虫中基本不用,太浪费了,一般多用于矩阵运算,咱们只做了解即可:
python
# 导入需要的模块
# requests:发送HTTP请求获取网页内容
import requests
# BeautifulSoup:解析HTML页面提取数据
from bs4 import BeautifulSoup
# multiprocessing.Pool:创建进程池实现多进程并行处理
from multiprocessing import Pool
# time:计算爬取耗时,用于对比多进程效率
import time
# 定义单个URL的爬取函数(每个进程执行的任务)
def crawl_single_url(url):
"""
爬取单个URL的网页标题
Args:
url (str): 待爬取的网页地址
Returns:
tuple: (url, title/错误信息),便于后续结果展示
"""
# 请求头:模拟浏览器访问,避免被目标网站识别为爬虫
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
try:
# 发送GET请求,设置超时时间5秒(避免请求卡住)
response = requests.get(url, headers=headers, timeout=5)
# 检查HTTP响应状态码:如果不是200(成功),抛出异常
response.raise_for_status()
# 解析HTML页面:使用html.parser解析器
soup = BeautifulSoup(response.text, "html.parser")
# 提取网页标题:如果存在title标签则取内容,否则返回"无标题"
if soup.title:
title = soup.title.string.strip() # strip()去除首尾空格
else:
title = "无标题"
# 返回成功结果:(URL, 标题)
return (url, title)
# 捕获请求相关异常(超时、连接失败、HTTP错误等)
except requests.exceptions.RequestException as e:
return (url, f"爬取失败:{str(e)}")
# 捕获其他未知异常(避免进程崩溃)
except Exception as e:
return (url, f"未知错误:{str(e)}")
if __name__ == "__main__":
# 注意:Windows系统下多进程必须放在if __name__ == "__main__"中,避免进程递归创建
# 待爬取的URL列表(选常见网站,便于测试)
target_urls = [
"https://www.baidu.com",
"https://www.taobao.com",
"https://www.jd.com",
"https://www.bilibili.com",
"https://www.github.com",
"https://www.python.org",
"https://www.zhihu.com"
]
# 记录开始时间(用于计算总耗时)
start_time = time.time()
# ---------------------- 多进程核心逻辑 ----------------------
# 创建进程池:processes=4表示同时运行4个进程(建议设为CPU核心数的2-4倍)
# Pool默认会根据CPU核心数创建进程,也可手动指定
with Pool(processes=4) as process_pool:
# 使用map方法分配任务:将target_urls中的每个URL传给crawl_single_url函数
# map会阻塞主进程,直到所有子进程完成任务,返回结果列表
crawl_results = process_pool.map(crawl_single_url, target_urls)
# -------------------------------------------------------------
# 记录结束时间
end_time = time.time()
# 打印爬取结果
print("=" * 50)
print("爬取结果汇总:")
print("=" * 50)
for url, result in crawl_results:
print(f"URL: {url}\n结果: {result}\n")
# 打印耗时
print("=" * 50)
print(f"多进程爬取总耗时:{end_time - start_time:.2f}秒")
print("=" * 50)
多进程爬虫的核心价值在于绕 GIL 用多核、进程隔离保稳定、拆分任务提效率,其核心运用场景可提炼为:
- I/O+CPU 密集型复合任务爬取后需做图片处理(压缩 / 裁剪)、NLP 分析(分词 / 情感计算)、复杂数据解析(金融指标计算)等 CPU 操作,多进程可并行利用多核,突破多线程 GIL 限制。
- 大规模 / 超大规模爬取百万级 URL(电商全站商品、社交媒体海量内容)拆分任务到多进程,结合分布式队列(Redis)避免重复,提升爬取效率。
- 高稳定性长期运行场景监控类爬虫、反爬严格的高风险爬取,进程隔离可防止单进程崩溃影响整体,保障 7×24 小时服务。
- 混合高并发架构多进程 + 异步(aiohttp),进程内最大化 I/O 效率,进程间利用多核,适配超大规模 I/O + 轻 CPU 计算场景。
简言之,多进程爬虫是 "CPU 密集 + 大规模 + 高稳定" 场景的最优解。
小结
目前来说多进程我们几乎不太用得到,所以本文仅作了解,到时用到在学即可,加油加油