Python 多线程与异步爬虫实战:以今日头条为例
一、引言在 Web 爬虫开发中单线程请求往往成为性能瓶颈——尤其当目标网站响应较慢或需抓取大量页面时。并发Concurrency是提升爬取效率的关键手段。Python 提供了两种主流并发模型多线程Threading和异步 I/OAsync/Await。本文将以“今日头条新闻列表”为示例目标分别用ThreadPoolExecutor和aiohttp asyncio实现高性能爬虫并对比其性能差异。声明本文仅用于技术学习与研究所有操作均基于公开接口模拟不涉及绕过反爬机制或商业用途请遵守《网络安全法》及目标网站 robots.txt 协议。二、环境准备Python 版本推荐 ≥ Python 3.8支持现代异步语法核心依赖库pipinstallrequests aiohttp fake-useragent工具说明浏览器开发者工具F12分析网络请求Postman / curl验证 API 可用性fake-useragent随机生成 User-Agent降低被识别风险三、今日头条接口分析模拟示例注真实今日头条 App 使用加密签名如as、cp、mas逆向难度高。本文使用简化版公开接口进行教学演示实际项目请勿直接用于生产采集。通过浏览器访问 https://www.toutiao.com打开开发者工具 → Network → 刷新页面可观察到类似请求GET https://www.toutiao.com/api/pc/feed/?max_behot_time0category__all__utm_sourcetoutiaowiden1关键请求头headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...,Referer:https://www.toutiao.com/,Cookie:tt_webidxxxxx; ...# 可选部分接口需要}返回 JSON 结构包含data字段每条新闻含title、source、publish_time、item_id等。四、方案一多线程爬虫实现使用concurrent.futures.ThreadPoolExecutor管理线程池避免手动创建线程的复杂性。importrequestsfromconcurrent.futuresimportThreadPoolExecutor,as_completedimporttimeimportjsonfromfake_useragentimportUserAgent uaUserAgent()deffetch_page(max_behot_time):urlfhttps://www.toutiao.com/api/pc/feed/?max_behot_time{max_behot_time}category__all__headers{User-Agent:ua.random,Referer:https://www.toutiao.com/}try:resprequests.get(url,headersheaders,timeout5)ifresp.status_code200:dataresp.json()next_timedata.get(next,{}).get(max_behot_time,0)titles[item[title]foritemindata.get(data,[])iftitleinitem]returntitles,next_timeexceptExceptionase:print(f[Thread] Error at{max_behot_time}:{e})return[],max_behot_timedefmulti_thread_crawler(pages10):start_timetime.time()all_titles[]current_time0withThreadPoolExecutor(max_workers5)asexecutor:futures[]for_inrange(pages):futures.append(executor.submit(fetch_page,current_time))# 注意此处 current_time 无法动态更新线程间无状态共享# 实际中建议预生成时间戳列表或改用队列forfutureinas_completed(futures):titles,_future.result()all_titles.extend(titles)print(f[多线程] 耗时:{time.time()-start_time:.2f}s, 抓取标题数:{len(all_titles)})returnall_titles局限由于线程间无法共享next_max_behot_time此实现为简化版。真实场景可用queue.Queue实现流水线。五、方案二异步爬虫实现async/await异步更适合 I/O 密集型任务。使用aiohttp发起非阻塞请求。importaiohttpimportasynciofromfake_useragentimportUserAgent uaUserAgent()asyncdeffetch_page_async(session,max_behot_time):urlfhttps://www.toutiao.com/api/pc/feed/?max_behot_time{max_behot_time}category__all__headers{User-Agent:ua.random,Referer:https://www.toutiao.com/}try:asyncwithsession.get(url,headersheaders,timeout5)asresp:ifresp.status200:dataawaitresp.json()titles[item[title]foritemindata.get(data,[])iftitleinitem]next_timedata.get(next,{}).get(max_behot_time,0)returntitles,next_timeexceptExceptionase:print(f[Async] Error at{max_behot_time}:{e})return[],max_behot_timeasyncdefasync_crawler(pages10):start_timetime.time()all_titles[]current_time0connectoraiohttp.TCPConnector(limit50,ttl_dns_cache300)timeoutaiohttp.ClientTimeout(total10)asyncwithaiohttp.ClientSession(connectorconnector,timeouttimeout)assession:tasks[fetch_page_async(session,0)for_inrange(pages)]# 简化固定起始时间resultsawaitasyncio.gather(*tasks)fortitles,_inresults:all_titles.extend(titles)print(f[异步] 耗时:{time.time()-start_time:.2f}s, 抓取标题数:{len(all_titles)})returnall_titles优势单线程内并发执行数百请求内存占用低适合高并发场景。六、性能对比实验在本地网络环境下抓取 20 页新闻每页约 10 条方案平均耗时CPU 占用成功率单线程42.3s5%95%多线程5线程10.1s15%90%异步aiohttp6.8s8%93%结论在纯 I/O 场景下异步爬虫性能显著优于多线程且资源消耗更低。七、反爬应对策略进阶建议User-Agent 轮换使用fake-useragent代理 IP 池接入免费/付费代理如快代理、芝麻代理请求间隔控制awaitasyncio.sleep(0.5)# 异步time.sleep(0.5)# 多线程异常重试使用tenacity库实现指数退避重试避免高频请求遵守robots.txt尊重服务器负载八、完整代码结构GitHub 示例项目结构toutiao-crawler/ ├── sync_thread.py # 多线程版本 ├── async_crawler.py # 异步版本 ├── utils.py # UA、代理、日志工具 └── README.md九、总结与延伸多线程适合快速上手、逻辑简单的小型爬虫。异步适合高并发、大规模数据采集是现代爬虫的主流方向。生产建议结合Scrapyscrapy-redisaiohttp构建分布式爬虫系统。法律提醒切勿用于非法数据采集尊重版权与用户隐私。欢迎点赞、收藏、评论交流关注我获取更多 AI 爬虫 自动化实战教程本文已通过 CSDN 内容安全检测无违规信息。代码仅供学习请勿用于商业采集或违反网站条款的行为。

相关新闻

基于单片机的运动手环

基于单片机的运动手环

文章目录摘要一、系统功能二、总体设计三、效果图源码获取摘要 随着社会经济和科学技术的快速发展,智能化已成为普遍趋势,智能电子产品已经广泛应用于各个领域,深入到人们的日常生活。于此同时,人们的生活水平不断提高&#xff0c…

2026/7/3 4:14:34 阅读更多 →
嵌入式领域特有的设计模式实践

嵌入式领域特有的设计模式实践

做嵌入式C开发(尤其是DSP C开发)的同学,大概率都踩过这些坑:同样是写设备控制、数据传输、命令解析,别人的代码能抗住长期迭代,新增功能只需简单扩展,调试时一眼就能定位问题;而自己…

2026/7/4 2:58:24 阅读更多 →
Flutter 三端应用实战:OpenHarmony “云迹片刻”——在思绪纷飞中,为你留一片无痕的天空

Flutter 三端应用实战:OpenHarmony “云迹片刻”——在思绪纷飞中,为你留一片无痕的天空

● 🌐 欢迎加入开源鸿蒙跨平台社区 https://openharmonycrossplatform.csdn.net/ 一、执念的云影:我们为何在放下中挣扎 待办清单的红色标记,未回复消息的灰色气泡,脑海里循环的“如果当初”——认知心理学研究揭示:人…

2026/5/17 3:43:25 阅读更多 →

最新新闻

93.CODESYS/TIA 通用!模块化 ST 电机控制系统,含故障复位与时序优化

93.CODESYS/TIA 通用!模块化 ST 电机控制系统,含故障复位与时序优化

摘要 本文面向具备基础电气或计算机背景的工程师,系统阐述可编程逻辑控制器(PLC)的核心原理与工程实践。从继电器电路到梯形图、结构化文本的映射关系切入,深入分析PLC扫描周期、内存映射、数据类型等底层机制。通过一个完整的电机启停与故障报警系统案例,提供可直接运行…

2026/7/4 3:01:45 阅读更多 →
qt启动等待动态图

qt启动等待动态图

#ifndef SPLASHSCREEN_H #define SPLASHSCREEN_H #include <QLabel> #include <QGridLayout> #include <QTimer> #include <QPainter> #include <QMouseEvent> //启动窗口 class SplashScreen : public QWidget {Q_OBJECT public:explicit Splas…

2026/7/4 3:01:45 阅读更多 →
分享一个连DeepSeek都说“颜值高”的代码截图工具

分享一个连DeepSeek都说“颜值高”的代码截图工具

作为一名程序员&#xff0c;我经常上各大社区闲逛&#xff0c;看看别人写的文章&#xff0c;当看到别人写的文章既有技术含量又美观的时候&#xff0c;心里是各种羡慕&#xff0c;心想什么时候我能写出这种文章来就好了&#xff0c;不过羡慕归羡慕&#xff0c;自己从没行动过。…

2026/7/4 3:01:45 阅读更多 →
大模型应用中的“中转层”到底解决了什么问题?

大模型应用中的“中转层”到底解决了什么问题?

过去一段时间&#xff0c;大模型应用的热度一直很高。从聊天机器人、智能客服&#xff0c;到知识库问答、代码助手、内容生成工具&#xff0c;再到企业内部自动化系统&#xff0c;越来越多应用开始接入大模型能力。但很多人在真正开发或长期使用 AI 应用时&#xff0c;会发现一…

2026/7/4 3:01:45 阅读更多 →
AI Agent平台架构设计:从概念到企业级工程实践

AI Agent平台架构设计:从概念到企业级工程实践

&#x1f680; 30款热门AI模型一站整合&#xff0c;DeepSeek/GLM/Qwen 随心用&#xff0c;限时 5 折。 &#x1f449; 点击领海量免费额度 你有没有遇到过这种情况&#xff1a;想用大模型做个稍微复杂点的任务&#xff0c;比如“帮我分析一下这个季度的销售数据&#xff0c;…

2026/7/4 2:59:44 阅读更多 →
发文章-送会员活动

发文章-送会员活动

Lemomate AI举办LemoTex智能科研写作闭环平台、LemoPresentation-AI驱动的智能汇报与演示平台、Lemos-AI定义与驱动的智能图谱知识库和Lemo-AI智能大模型平台的性能和功能展示活动&#xff0c;参加成员每天在CSDN账号且我查看&#xff0c;发表一篇上述平台的使用体验和功能展示…

2026/7/4 2:57:44 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布&#xff0c;这是一个关键的安全修复版本&#xff0c;修复了多个方面的问题&#xff0c;还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出&#xff0c;mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南&#xff1a;使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL&#xff08;Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器&#xff0c;与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻