当前位置: 首页 > news >正文

Python 多线程与异步爬虫实战:以今日头条为例

一、引言

在 Web 爬虫开发中,单线程请求往往成为性能瓶颈——尤其当目标网站响应较慢或需抓取大量页面时。并发(Concurrency)是提升爬取效率的关键手段。Python 提供了两种主流并发模型:多线程(Threading)和异步 I/O(Async/Await)。本文将以“今日头条新闻列表”为示例目标,分别用ThreadPoolExecutoraiohttp + asyncio实现高性能爬虫,并对比其性能差异。

声明:本文仅用于技术学习与研究,所有操作均基于公开接口模拟,不涉及绕过反爬机制或商业用途,请遵守《网络安全法》及目标网站 robots.txt 协议。


二、环境准备

Python 版本

  • 推荐 ≥ Python 3.8(支持现代异步语法)

核心依赖库

pipinstallrequests aiohttp fake-useragent

工具说明

  • 浏览器开发者工具(F12):分析网络请求
  • Postman / curl:验证 API 可用性
  • fake-useragent:随机生成 User-Agent,降低被识别风险

三、今日头条接口分析(模拟示例)

注:真实今日头条 App 使用加密签名(如ascpmas),逆向难度高。本文使用简化版公开接口进行教学演示,实际项目请勿直接用于生产采集。

通过浏览器访问 https://www.toutiao.com,打开开发者工具 → Network → 刷新页面,可观察到类似请求:

GET https://www.toutiao.com/api/pc/feed/?max_behot_time=0&category=__all__&utm_source=toutiao&widen=1

关键请求头

headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...","Referer":"https://www.toutiao.com/","Cookie":"tt_webid=xxxxx; ..."# 可选,部分接口需要}

返回 JSON 结构包含data字段,每条新闻含titlesourcepublish_timeitem_id等。


四、方案一:多线程爬虫实现

使用concurrent.futures.ThreadPoolExecutor管理线程池,避免手动创建线程的复杂性。

importrequestsfromconcurrent.futuresimportThreadPoolExecutor,as_completedimporttimeimportjsonfromfake_useragentimportUserAgent ua=UserAgent()deffetch_page(max_behot_time):url=f"https://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:resp=requests.get(url,headers=headers,timeout=5)ifresp.status_code==200:data=resp.json()next_time=data.get("next",{}).get("max_behot_time",0)titles=[item["title"]foritemindata.get("data",[])if"title"initem]returntitles,next_timeexceptExceptionase:print(f"[Thread] Error at{max_behot_time}:{e}")return[],max_behot_timedefmulti_thread_crawler(pages=10):start_time=time.time()all_titles=[]current_time=0withThreadPoolExecutor(max_workers=5)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 ua=UserAgent()asyncdeffetch_page_async(session,max_behot_time):url=f"https://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,headers=headers,timeout=5)asresp:ifresp.status==200:data=awaitresp.json()titles=[item["title"]foritemindata.get("data",[])if"title"initem]next_time=data.get("next",{}).get("max_behot_time",0)returntitles,next_timeexceptExceptionase:print(f"[Async] Error at{max_behot_time}:{e}")return[],max_behot_timeasyncdefasync_crawler(pages=10):start_time=time.time()all_titles=[]current_time=0connector=aiohttp.TCPConnector(limit=50,ttl_dns_cache=300)timeout=aiohttp.ClientTimeout(total=10)asyncwithaiohttp.ClientSession(connector=connector,timeout=timeout)assession:tasks=[fetch_page_async(session,0)for_inrange(pages)]# 简化:固定起始时间results=awaitasyncio.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%
异步(aiohttp)6.8s8%93%

结论:在纯 I/O 场景下,异步爬虫性能显著优于多线程,且资源消耗更低。


七、反爬应对策略(进阶建议)

  1. User-Agent 轮换:使用fake-useragent
  2. 代理 IP 池:接入免费/付费代理(如快代理、芝麻代理)
  3. 请求间隔控制
    awaitasyncio.sleep(0.5)# 异步time.sleep(0.5)# 多线程
  4. 异常重试:使用tenacity库实现指数退避重试
  5. 避免高频请求:遵守robots.txt,尊重服务器负载

八、完整代码结构(GitHub 示例)

项目结构:

toutiao-crawler/ ├── sync_thread.py # 多线程版本 ├── async_crawler.py # 异步版本 ├── utils.py # UA、代理、日志工具 └── README.md

九、总结与延伸

  • 多线程:适合快速上手、逻辑简单的小型爬虫。
  • 异步:适合高并发、大规模数据采集,是现代爬虫的主流方向。
  • 生产建议:结合Scrapy+scrapy-redis+aiohttp构建分布式爬虫系统。
  • 法律提醒:切勿用于非法数据采集!尊重版权与用户隐私。

欢迎点赞、收藏、评论交流!
关注我,获取更多 AI + 爬虫 + 自动化实战教程!


本文已通过 CSDN 内容安全检测,无违规信息。
代码仅供学习,请勿用于商业采集或违反网站条款的行为。

http://www.jsqmd.com/news/363150/

相关文章:

  • 基于Springboot的闲一品交易平台
  • FA_融合和滤波(FF)-数据融合(0)
  • c盘红了怎么清理c盘空间,C盘变红解决方案(图文版),Windows优化工具
  • Java毕设项目推荐-基于Springboot的中药材知识科普平台设计与实现 基于springboot的中药科普知识平台的设计与实现【附源码+文档,调试定制服务】
  • 微软常用运行库合集 64位官网优化版下载,微软常用运行库合集 v2026.01.17 官方最新版 32/64位,vc运行库合集下载
  • 超实用攻略盘点:7款高效AI写论文网站技巧权威排名大公开
  • Java计算机毕设之基于springboot+小程序的心理健康咨询系统小程序的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 权威推荐:7个高效AI论文写作网站实用技巧全面解析
  • 芯谷科技——D805X 系列:250MHz 轨到轨输出 CMOS 运算放大器
  • 一线民警的“最强大脑”:AR眼镜如何破解四大实战难题
  • 深度测评:7款AI辅助论文写作工具的高效使用指南
  • 【图文教程】彻底关闭Windows 11自动更新
  • 2026年哈尔滨冠心病室上速厂家权威推荐榜:哈尔滨偏瘫大小便失禁/哈尔滨偏瘫无法行走/哈尔滨偏瘫肢体瘫痪/选择指南 - 优质品牌商家
  • 基于Java+SpringBoot的渡口流动夜市管理信息系统(源码+lw+部署文档+讲解等)
  • 【课程设计/毕业设计】基于Springboot框架下中药材科普系统的开发与应用springboot的中药科普知识平台的设计与实现【附源码、数据库、万字文档】
  • LangGraph速记
  • 基于Java+SpringBoot的大学校园篮球赛事管理系统(源码+lw+部署文档+讲解等)
  • 计算机Java毕设实战-基于springboot的中药科普知识平台的设计与实现传播中药材知识弘扬中医药文化【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 基于Java+SpringBoot的春晖养老院管理系统(源码+lw+部署文档+讲解等)
  • 2026年电器B2B电商平台公司权威推荐:工业品B2B电商平台、建材B2B电商平台、跨境B2B电商平台选择指南 - 优质品牌商家
  • 基于Java+SpringBoot的大学生英语学习平台系统(源码+lw+部署文档+讲解等)
  • Java计算机毕设之基于springboot的中药科普知识平台的设计与实现Springboot框架下中药材科普系统的开发与应用(完整前后端代码+说明文档+LW,调试定制等)
  • Spark神操作:轻松拿捏公司“历史烂数据”,一人干翻十年脏表
  • PLC的“黑话”:工业通讯协议,自动化系统的隐形守护者
  • 2026年焊接模具厂家权威推荐榜:阴极保护焊接、接地线焊接、接地降阻剂、接地降阻模块、放热焊剂、放热焊接模具选择指南 - 优质品牌商家
  • IPEmotion数据处理-分类元件的灵活运用—车辆制动次数的多样计算
  • P8825 [传智杯 #3 初赛] 运气
  • 【毕业设计】基于springboot的中药科普知识平台的设计与实现(源码+文档+远程调试,全bao定制等)
  • 嵌入式领域特有的设计模式实践
  • Java毕设项目:基于springboot的中药科普知识平台的设计与实现(源码+文档,讲解、调试运行,定制等)