欢迎光临
我们一直在努力

Python 并发实战:多线程爬虫 + 协程爬虫

两套直接能跑的爬虫实战:

  • 普通多线程爬虫(入门够用)
  • 异步协程爬虫(高并发、速度碾压多线程)
  • 统一场景:批量请求多个网页链接,对比效率。


    一、准备依赖

    bash

    运行

    pip install requests aiohttp


    二、多线程爬虫实战(threading + 队列)

    用 Queue 队列 做任务分发,线程安全,适合入门爬虫。

    python

    运行

    import threading
    import queue
    import requests
    import time

    # 待爬链接列表
    url_list = [
    "https://www.baidu.com",
    "https://www.qq.com",
    "https://www.sina.com.cn",
    "https://www.163.com",
    "https://www.taobao.com"
    ]

    # 任务队列
    q = queue.Queue()
    for url in url_list:
    q.put(url)

    # 爬虫工作函数
    def spider():
    while not q.empty():
    url = q.get()
    try:
    resp = requests.get(url, timeout=5)
    print(f"成功爬取: {url} 状态码: {resp.status_code}")
    except Exception as e:
    print(f"失败: {url} 错误: {e}")
    finally:
    q.task_done()

    if __name__ == "__main__":
    start = time.time()

    # 开启3个线程
    thread_num = 3
    for _ in range(thread_num):
    t = threading.Thread(target=spider)
    t.daemon = True
    t.start()

    # 等待队列所有任务完成
    q.join()
    end = time.time()
    print(f"\\n多线程爬虫总耗时: {end – start:.2f} 秒")

    特点

    • 简单好理解,适合小规模爬取
    • 受线程数限制,并发量一般
    • 有网络 IO 阻塞,速度中等

    三、协程异步爬虫实战(asyncio + aiohttp)

    单线程实现高并发,不用开多线程,请求瞬间并发,速度比多线程快很多。

    python

    运行

    import asyncio
    import aiohttp
    import time

    url_list = [
    "https://www.baidu.com",
    "https://www.qq.com",
    "https://www.sina.com.cn",
    "https://www.163.com",
    "https://www.taobao.com"
    ]

    # 异步请求函数
    async def fetch(session, url):
    try:
    async with session.get(url, timeout=aiohttp.ClientTimeout(total=5)) as resp:
    print(f"成功爬取: {url} 状态码: {resp.status}")
    return await resp.text()
    except Exception as e:
    print(f"失败: {url} 错误: {e}")

    # 主协程
    async def main():
    # 创建异步会话
    async with aiohttp.ClientSession() as session:
    # 批量创建协程任务
    tasks = [fetch(session, url) for url in url_list]
    # 并发执行所有任务
    await asyncio.gather(*tasks)

    if __name__ == "__main__":
    start = time.time()
    asyncio.run(main())
    end = time.time()
    print(f"\\n协程异步爬虫总耗时: {end – start:.2f} 秒")


    四、两者对比

    表格

    方式并发能力速度适用场景
    多线程爬虫 中等 一般 小批量、简单爬虫
    协程异步爬虫 极高 快很多 大批量、高并发接口 / 爬虫

    赞(0)
    未经允许不得转载:171主机测评 » Python 并发实战:多线程爬虫 + 协程爬虫
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址