03-多进程

多进程在小型爬虫中基本不用,太浪费了,一般多用于矩阵运算,咱们只做了解即可:

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 用多核、进程隔离保稳定、拆分任务提效率,其核心运用场景可提炼为:

  1. I/O+CPU 密集型复合任务爬取后需做图片处理(压缩 / 裁剪)、NLP 分析(分词 / 情感计算)、复杂数据解析(金融指标计算)等 CPU 操作,多进程可并行利用多核,突破多线程 GIL 限制。
  2. 大规模 / 超大规模爬取百万级 URL(电商全站商品、社交媒体海量内容)拆分任务到多进程,结合分布式队列(Redis)避免重复,提升爬取效率。
  3. 高稳定性长期运行场景监控类爬虫、反爬严格的高风险爬取,进程隔离可防止单进程崩溃影响整体,保障 7×24 小时服务。
  4. 混合高并发架构多进程 + 异步(aiohttp),进程内最大化 I/O 效率,进程间利用多核,适配超大规模 I/O + 轻 CPU 计算场景。

简言之,多进程爬虫是 "CPU 密集 + 大规模 + 高稳定" 场景的最优解。

小结

目前来说多进程我们几乎不太用得到,所以本文仅作了解,到时用到在学即可,加油加油

相关推荐
STLearner11 小时前
AAAI 2026 | 时空数据(Spatial-temporal)论文总结[上](时空预测,轨迹挖掘,自动驾驶等)
大数据·人工智能·python·深度学习·机器学习·数据挖掘·自动驾驶
知行合一。。。11 小时前
Python--02--流程控制语句
开发语言·python
码农小卡拉11 小时前
Java多线程:CompletableFuture使用详解(超详细)
java·开发语言·spring boot·python·spring·spring cloud
Robot侠11 小时前
从 Python 到 Ollama:将微调后的 Llama-3/Qwen 一键导出为 GGUF
开发语言·python·llama·qwen
l1t12 小时前
Python 字符串反转方法
linux·开发语言·python
Eiceblue12 小时前
使用 Python 写入多类型数据至 Excel 文件
开发语言·python·excel
deephub12 小时前
Pydantic-DeepAgents:基于 Pydantic-AI 的轻量级生产级 Agent 框架
人工智能·python·深度学习·大语言模型·ai-agent
WarrenWu12 小时前
SQLAlchemy + Pytest:如何优雅地关闭异步数据库连接池
后端·python
写文章的大米12 小时前
性能提升5倍!Python列表和元组的底层原理揭秘
后端·python
坐吃山猪12 小时前
Google的A2A智能体群聊
python·llm·a2a