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 密集 + 大规模 + 高稳定" 场景的最优解。

小结

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

相关推荐
free-elcmacom1 小时前
Python信号分析项目:高速数字系统的眼图破案记
开发语言·python
AI弟1 小时前
大语言模型进阶(一)之大语言模型基础
人工智能·python·深度学习·机器学习·语言模型·自然语言处理
坚持就完事了1 小时前
__name__和__main__到底是啥?
python
Aerelin1 小时前
scrapy的介绍与使用
前端·爬虫·python·scrapy·js
GoldenSpider.AI1 小时前
uv——极速、统一的Python包和项目管理器
开发语言·python·uv
上海云盾-小余1 小时前
企业级Web安全加速方案:一体化防护DDoS/CC/爬虫攻击
爬虫·web安全·ddos
子午1 小时前
【鸟类识别系统】Python+TensorFlow+Django+人工智能+深度学习+卷积神经网络算法
人工智能·python·深度学习
2301_795167201 小时前
Python 高手编程系列一十八:子类化内置类型
linux·windows·python
想看一次满天星2 小时前
阿里140-n值纯算
爬虫·python·算法·网络爬虫·阿里140