Python爬虫实战:多线程与异步IO并发爬虫——从10倍到100倍提速
📅 2026/7/6 13:26:32
👁️ 次浏览
一、为什么你的爬虫那么慢?很多新手写完爬虫后都会遇到同一个问题:单线程爬虫太慢了。你写了一个爬虫,抓取1000个页面要花30分钟。老板说"明天要这些数据",你直接加班到凌晨。问题出在哪?看这个对比:方式1000个页面耗时提升倍数单线程顺序请求500秒(8分钟)1x多线程(10线程)55秒9x多线程(50线程)15秒33x异步aiohttp(100并发)8秒62x异步+连接池(200并发)5秒100x原因很简单:大部分时间爬虫都在等待服务器响应。网络请求的瓶颈不是你的CPU,而是IO等待。单线程时,发一个请求后程序就傻等,等服务器回数据了再发下一个——这期间CPU完全空闲。并发爬虫的核心思想就是:在等待网络响应的时候,同时发起更多请求。二、最简单的提速:threading多线程先看一个单线程爬虫的典型写法:import requests import time def crawl(url): resp = requests.get(url) return resp.status_code urls = [f"https://httpbin.org/get?id={i}" for i in range(100)] start = time.time() for url in urls: crawl(url) print(f"单线程耗时: {time.time()-start:.2f}秒")改成多线程,只需加几行代码:import requests import time from concurrent.futures import ThreadPoolExecutor, as_completed def crawl(url): resp = requests.get(url, timeout=10) return url, resp.status_code urls = [f"https://httpbin.org/get?id={i}" for i in range(100)] # ========== 多线程版本 ========== start = time.time() with ThreadPoolExecutor(max_workers=20) as executor: futures = {executor.submit(crawl, url): url for url in urls} for future in as_completed(futures): url, status = future.result() print(f"{url} - {status}") print(f"多线程耗时: {time.time()-start:.2f}秒")ThreadPoolExecutor是Python标准库提供的线程池,核心参数就一个:max_workers——同时运行的线程数。线程数怎么选?IO密集型任务(爬虫大部分情况):20-100线程CPU密集型任务(数据解析如果很复杂):CPU核心数 × 2目标服务器较弱时:降低线程数,避免被封三、多线程爬虫完整实战:批量采集新闻资讯import requests import time import random import threading from concurrent.futures import ThreadPoolExecutor, as_completed from bs4 import BeautifulSoup import json import os class ConcurrentNewsCrawler: """多线程并发新闻采集器""" def __init__(self, max_workers=20): self.max_workers = max_workers self.results = [] self.lock = threading.Lock() self.session = requests.Session() # 随机UA列表 self.user_agents = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36", ] def get_headers(self): """生成随机请求头""" return { "User-Agent": random.choice(self.user_agents), "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", } def crawl_page(self, url): """抓取单个页面""" try: resp = self.session.get( url, headers=self.get_headers(), timeout=15, ) resp.raise_for_status() resp.encoding = resp.apparent_encoding soup = BeautifulSoup(resp.text, "html.parser") # 提取文章信息(根据实际网站结构调整选择器) item = { "url": url, "title": self._extract_title(soup),
在上一篇《线程控制》中,我们不仅学习了线程控制相关的接口,还从底层理解了线程是如何在 POSIX 线程库(pthread) 与 Linux 内核 的共同配合下完成创建、管理以及回收的。然而,仅仅能够创建多个线程还远远不够。当多个线…
📅 2026/7/6 13:24:32
EMA 指数移动平均 PyTorch 实现:3 种主流框架集成方案与性能开销实测在深度学习的训练过程中,模型权重往往会在最优值附近高频振荡,这种"抖动"现象直接影响模型的泛化能力。指数移动平均(EMA)技术通过维护模…
📅 2026/7/6 13:24:32
之前做的那个2048游戏有些问题,这是重新修订的版本,对程序内容进行了优化和升级,游戏可以正常运行。一、主要功能功能模块说明核心玩法经典 2048 游戏,使用方向键移动方块,相同数字合并,目标拼出 2048。动画…
📅 2026/7/6 13:24:32
近期技术圈**“前端已死”**的话题持续刷屏,引发无数程序员、入行小白的热议与焦虑。有人感慨前端行业寒冬已至,岗位锐减、内卷严重;有人认为只是正常技术迭代,无需过度恐慌;也有不少人被片面言论误导,对前…
📅 2026/7/6 14:16:41
深耕企业数字化落地多年,我踩过无数中小企业运营的坑,其中合同审核疏漏是最让人刻骨铭心的一次,也彻底改变了我对AI落地中小企业的认知。
2025年开春,公司敲定了一份重要合作合同,当时团队安排专人人工逐条审核&#x…
📅 2026/7/6 14:16:41
加州伯克利发布《Measuring Agents in Production》行业实测调研报告,基于大量企业真实落地样本拆解商用 AI 智能体底层落地逻辑,给想做 Agent 开发、企业私有化部署的小白与后端程序员一套可落地的工程思路
(论文地址:https://ar…
📅 2026/7/6 14:16:41
2026年春招彻底撕开了职场最残酷的两极分化真相,刷完最新求职行业报告,真的越看越唏嘘!
一边是AI赛道岗位爆发式增长,大厂砸出月薪6万高薪疯狂抢人,核心岗位人才一匠难求;另一边是无数普通打工人、初级程序…
📅 2026/7/6 14:16:41
2026年已经过半,你还在纠结要不要学AI、怎么入门大模型、零基础能不能上手?
不用内耗、不用迷茫!这篇专为小白、职场人、初级程序员打造的2026最新AI学习指南,一次性帮你理清所有学习思路,告别碎片化学习、无效内卷、盲…
📅 2026/7/6 14:16:41
AI时代,没有特长或者主动性的人,发展空间会被收窄。
最近很多自媒体都在转一个观点:"李飞飞说10年后职场只剩两类人。"
于是我去看了6月19日那期Marina Mogilko的播客完整视频后发现——这个观点最初提出者不是李飞飞,…
📅 2026/7/6 14:14:41
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray
你是否厌倦了Windows任务栏上密密麻麻的图标&…
📅 2026/7/6 0:01:19
1. 项目概述:一次对React Server Components核心安全机制的深度剖析 最近在安全研究圈里,CVE-2025-55182这个编号被频繁提及,它直指React生态中一个相对较新的概念——React Server Components(RSC)。作为一个长期关注…
📅 2026/7/6 0:01:20
星露谷物语终极MOD指南:5个步骤打造智能自动化农场 【免费下载链接】StardewMods Mods for Stardew Valley using SMAPI. 项目地址: https://gitcode.com/gh_mirrors/st/StardewMods
你是否厌倦了在星露谷物语中重复收割、加工、存储的繁琐操作?梦…
📅 2026/7/6 0:01:20
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/6 10:35:30
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/6 6:10:21
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/6 5:35:58
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/6 6:10:28
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/6 6:10:26
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/5 23:45:08