news 2026/6/15 15:24:52

异步爬虫 aiohttp 实战——比多线程快10倍的爬虫方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
异步爬虫 aiohttp 实战——比多线程快10倍的爬虫方案

多线程爬虫虽然比单线程快几倍,但线程本身有开销,而且受限于 Python 的 GIL 锁。异步爬虫是更高阶的方案——单线程处理上千个并发请求,比多线程快 5~10 倍。

一、异步 vs 多线程 vs 单线程

对比单线程多线程(5线程)异步(aiohttp)
爬取10页(250条)~10秒~2.8秒~1秒
爬取100页(2500条)~100秒~30秒~5秒
CPU占用
代码复杂度简单中等稍高
适合场景小规模中等规模大规模

二、异步爬虫原理

普通爬虫发请求后要等待服务器响应,这段时间 CPU 是空闲的。异步爬虫在等待的过程中切换去发送其他请求,等响应回来了再回来处理。

普通请求:发送 → 等待 → 处理 → 发送 → 等待 → 处理 ... 异步请求:发送 → 发送 → 发送 → 处理 → 处理 → 处理 ... (同时发多个请求,谁回来了处理谁)

三、环境准备

pipinstallaiohttp aiodns

四、基本用法

importasyncioimportaiohttpasyncdeffetch(session,url):"""异步请求单页"""asyncwithsession.get(url)asresponse:returnawaitresponse.text()asyncdefmain():asyncwithaiohttp.ClientSession()assession:html=awaitfetch(session,"https://example.com")print(len(html))# 运行asyncio.run(main())

五、实战:异步爬取豆瓣 Top250

importasyncioimportaiohttpfromlxmlimportetree HEADERS={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}asyncdeffetch(session,url):"""异步请求"""try:asyncwithsession.get(url,headers=HEADERS,timeout=10)asresp:returnawaitresp.text()exceptExceptionase:print(f"请求失败:{url[:30]}...{e}")returnNoneasyncdefscrape_page(session,page):"""异步爬取单页"""url=f"https://movie.douban.com/top250?start={page*25}"html=awaitfetch(session,url)ifnothtml:return[]tree=etree.HTML(html)items=tree.xpath('//ol[@class="grid_view"]/li')movies=[]foriteminitems:rank=item.xpath('.//em/text()')[0]title=item.xpath('.//span[@class="title"]/text()')[0]rating=item.xpath('.//span[@class="rating_num"]/text()')[0]people_text=item.xpath('.//span[contains(text(), "人评价")]/text()')people=people_text[0].strip()ifpeople_textelse"0人评价"movies.append({"rank":int(rank),"title":title,"rating":float(rating),"people":people})print(f"第{page+1}页完成,{len(movies)}条")returnmoviesasyncdefcrawl_all():"""异步爬取全部10页"""asyncwithaiohttp.ClientSession()assession:# 创建10个爬取任务tasks=[scrape_page(session,page)forpageinrange(10)]# 并发执行所有任务results=awaitasyncio.gather(*tasks)# 合并结果并排序all_movies=[]formoviesinresults:all_movies.extend(movies)all_movies.sort(key=lambdax:x["rank"])returnall_movies

运行

importtime start=time.time()movies=asyncio.run(crawl_all())print(f"\n共{len(movies)}部电影,耗时{time.time()-start:.1f}秒")

输出效果:

第1页完成,25条 第3页完成,25条 第5页完成,25条 第2页完成,25条 ... 共250部电影,耗时1.2秒

六、异步爬虫 + CSV 保存

爬取后自动保存到文件:

importcsvasyncdefcrawl_and_save():movies=awaitcrawl_all()withopen("douban_top250.csv","w",newline="",encoding="utf-8-sig")asf:writer=csv.DictWriter(f,fieldnames=["rank","title","rating","people"])writer.writeheader()writer.writerows(movies)print(f"已保存到 douban_top250.csv(共{len(movies)}条)")asyncio.run(crawl_and_save())

七、性能对比测试

方式250条耗时2500条耗时代码量
单线程~10秒~100秒40行
多线程(5线程)~2.8秒~30秒60行
异步 aiohttp~1.2秒~5秒70行

数据量越大,异步优势越明显。

八、踩坑提醒

1. 异步函数中不能使用 requests

# 错误:requests 是同步库,会阻塞事件循环asyncdeffetch(url):returnrequests.get(url)# 正确:使用 aiohttpasyncdeffetch(session,url):asyncwithsession.get(url)asresp:returnawaitresp.text()

2. 控制并发数

同时发太多请求会被封,用asyncio.Semaphore限制:

sem=asyncio.Semaphore(5)# 最多5个并发asyncdeffetch(session,url):asyncwithsem:# 排队等待asyncwithsession.get(url)asresp:returnawaitresp.text()

3. 超时设置

异步请求一定要设置超时,避免某个请求卡死:

timeout=aiohttp.ClientTimeout(total=10)asyncwithsession.get(url,timeout=timeout)asresp:...

4. 异步不能直接跟 matplotlib 混用

matplotlib 是同步的,先爬取完数据,再同步画图。

总结

异步爬虫是处理大规模数据采集的最佳方案。虽然学习曲线比 requests 陡一些,但带来的性能提升非常值得。建议爬取 100 页以下用多线程,100 页以上用异步。

爬虫系列完结!从 requests 入门 → XPath → BS4 → Selenium → 反爬 → 多线程 → 异步,一套完整的爬虫技能链已经覆盖。后续将分享更多实战项目和 Java 开发相关文章。


如果对你有帮助,欢迎点赞、评论、关注【张老师技术栈】,持续分享 Java/Python/爬虫 实战干货。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 15:22:39

SafetyOps:面向AI驱动系统的端到端安全操作系统

1. SafetyOps 是什么?它不是 MLOps 的升级版,而是系统安全的“总调度台”你有没有遇到过这样的场景:团队刚把一个高精度的视觉检测模型部署进工厂质检线,运行三天后突然漏检了两批高危缺陷件;或者自动驾驶算法在仿真里…

作者头像 李华
网站建设 2026/6/15 15:22:37

中医临床决策5款大语言模型,谁主沉浮?

背景 中医临床决策需整合辨证论治、体质评估与个体化方药,难以标准化与质控。大语言模型具备医学知识整合与临床推理能力,但其在中医领域的应用,尤其在辨证与组方方面,仍未被充分探索。 目的 本研究评估5种主流大语言模型在中医…

作者头像 李华
网站建设 2026/6/15 15:22:37

PPTist终极指南:免费网页版PPT制作工具的10个超实用技巧

PPTist终极指南:免费网页版PPT制作工具的10个超实用技巧 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing …

作者头像 李华
网站建设 2026/6/15 15:14:58

终极指南:如何用OpenColorIO-Config-ACES构建专业色彩管理

终极指南:如何用OpenColorIO-Config-ACES构建专业色彩管理 【免费下载链接】OpenColorIO-Config-ACES 项目地址: https://gitcode.com/gh_mirrors/op/OpenColorIO-Config-ACES OpenColorIO-Config-ACES是一款专为影视后期、动画制作和视觉特效行业设计的开源…

作者头像 李华
网站建设 2026/6/15 15:14:30

米牛图片搬运去重大师手机版使用教程

🔥【米牛图片搬运神器】100%原创过审!流量暴增秘籍,批量去重全能编辑一键搞定!🔥 📢 自媒体/电商人必看! 还在为图片重复、平台限流而头疼?米牛图片搬运批量去重过审神器 重磅来袭&a…

作者头像 李华
网站建设 2026/6/15 15:14:24

Visual C++运行库终极指南:一键解决DLL缺失的完整方案

Visual C运行库终极指南:一键解决DLL缺失的完整方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否经常遇到"找不到MSVCR100.dll"、…

作者头像 李华