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

高并发异步爬虫落地:单机日采百万数据,性能提升10倍的优化方案

背景之前做电商价格监测项目时最开始写的同步爬虫一天只能爬10万条数据服务器都跑满了还是不够用。后来一步步优化改成异步协程连接池复用的架构单机一天就能爬120万条数据CPU占用还不到30%。一、优化前的痛点先看看最开始的垃圾性能同步爬虫用requests循环爬一秒最多爬5条一天10万条顶天资源浪费每个请求都新建连接TCP握手开销占了70%的时间没有限流爬太快被封IP爬太慢完不成任务卡得要死二、最终优化架构我最终落地的架构非常简单不需要复杂的分布式集群单台2核4G服务器就能跑满带宽任务调度器异步任务队列协程池连接池复用模块请求去重模块数据持久化模块限流/降级模块这套架构的核心是尽可能减少不必要的开销把所有能复用的东西都复用起来把CPU的性能榨干。三、核心优化点1. 异步协程替换同步请求这个是最基础的优化我用asyncioaiohttp替换了原来的requests并发量直接提升了10倍# 基础异步爬取逻辑asyncdeffetch_url(url,semaphore,session):asyncwithsemaphore:# 控制并发数避免把服务器跑崩try:asyncwithsession.get(url,timeout10)asresp:ifresp.status200:returnawaitresp.text()else:returnNoneexceptExceptionase:returnNoneasyncdefmain():semaphoreasyncio.Semaphore(200)# 并发数控制在200我这边2核4G服务器跑200并发刚好# 连接池复用配置这个是性能提升的核心timeoutaiohttp.ClientTimeout(total30)connectoraiohttp.TCPConnector(limit200,# 连接池大小和并发数一致limit_per_host20,# 单个域名最多20个连接避免被封ttl_dns_cache300,# DNS缓存5分钟减少DNS解析开销force_closeFalse# 不要主动关闭连接保持长连接)asyncwithaiohttp.ClientSession(connectorconnector,timeouttimeout)assession:tasks[fetch_url(url,semaphore,session)forurlinurls]resultsawaitasyncio.gather(*tasks,return_exceptionsTrue)# 处理结果...这里要注意并发数不是越大越好我最开始设成500结果服务器直接OOM了后来压测发现2核4G服务器设成200是最优的CPU占用30%左右带宽刚好跑满。2. 连接池复用优化这个优化是性能提升最大的原来每个请求都新建TCP连接握手就要3次断开还要4次开销太大。现在用连接池复用TCP连接开销直接减少了70%单个域名的连接数控制在20以内避免给目标服务器造成太大压力被封DNS缓存5分钟减少DNS解析的开销保持长连接不要主动关闭aiohttp会自动复用可用的连接3. 限流降级策略爬太快很容易被封我做了两层限流域名级限流每个域名每秒最多爬10次超过就延迟几秒再爬全局限流单机每秒最多爬100次超过就自动降低并发数小贴士不要相信什么动态UA就能不被封限速才是最靠谱的反爬策略只要你爬的速度比正常人访问还慢几乎不会被封。四、压测数据我压测了10万条请求优化前后的对比指标优化前同步优化后异步连接池总耗时8小时20分钟23分钟QPS3.372CPU占用90%28%内存占用1.2G300M请求成功率82%97%优化后的性能是原来的21倍资源占用反而更低完全够用了。五、踩坑经验协程数太高导致OOM最开始把并发数设成500结果内存直接爆了后来压测找到最优值是200连接池太大被封IP最开始单个域名的连接数设成50结果爬了10分钟就被封了改成20就没问题了异常处理不完整导致任务卡住最开始没有处理超时、连接重置这些异常有时候任务会卡住几个小时后来加了超时和异常重试机制就好了下一篇我会讲这套爬虫的容灾方案怎么做到7×24小时运行零数据丢失。

相关文章:

高并发异步爬虫落地:单机日采百万数据,性能提升10倍的优化方案

背景:之前做电商价格监测项目时,最开始写的同步爬虫一天只能爬10万条数据,服务器都跑满了还是不够用。后来一步步优化,改成异步协程连接池复用的架构,单机一天就能爬120万条数据,CPU占用还不到30%。一、优化…...

碧蓝航线自动化终极指南:3大核心功能+5步部署解放你的游戏时间

碧蓝航线自动化终极指南:3大核心功能5步部署解放你的游戏时间 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 你…...

如何在Windows系统上通过PowerShell快速部署winget包管理器

如何在Windows系统上通过PowerShell快速部署winget包管理器 【免费下载链接】winget-install Install WinGet using PowerShell! Prerequisites automatically installed. Works on Windows 10/11 and Server 2019/2022. 项目地址: https://gitcode.com/gh_mirrors/wi/winget…...

手机号码定位终极指南:5分钟学会如何快速查询号码归属地

手机号码定位终极指南:5分钟学会如何快速查询号码归属地 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mi…...

Spring_couplet_generation社区贡献指南:如何参与开源项目改进

Spring_couplet_generation社区贡献指南:如何参与开源项目改进 想为开源项目做点贡献,但又不知道从何下手?很多开发者都有这个想法,尤其是看到像Spring_couplet_generation这样有趣的项目时。你可能觉得贡献代码是件很专业、门槛…...

01 微服务

一、认识微服务 1.1 微服务架构演变 单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署(简单方便,高度耦合,拓展性差,适合小型项目,如学生管理系统);分布式…...

Omni-Vision Sanctuary C 语言接口调用指南:高性能嵌入式边缘部署

Omni-Vision Sanctuary C 语言接口调用指南:高性能嵌入式边缘部署 1. 引言 如果你是一名嵌入式开发者,正在寻找将计算机视觉模型部署到边缘设备的方法,那么这篇文章就是为你准备的。我们将手把手教你如何为Omni-Vision Sanctuary模型封装C语…...

ESP32-S3 + INMP441麦克风没声音?手把手教你用Arduino I2S库快速诊断(附完整代码)

ESP32-S3与INMP441麦克风无声故障全排查指南 当你兴奋地将INMP441麦克风焊接到ESP32-S3开发板,准备开始音频采集项目时,却发现设备一片寂静——这种挫败感我深有体会。去年在开发智能语音门锁原型时,我曾连续三天被这个看似简单的问题困扰。本…...

时序动作分割:从帧级标签到场景理解的算法演进与应用

1. 时序动作分割:给视频帧打标签的技术进化史 第一次接触时序动作分割时,我盯着屏幕上一连串的厨房监控视频发愁——这些长达数千帧的画面里,厨师切菜、打蛋、翻炒的动作混杂在一起,就像被快进播放的生活片段。传统方法要求我们手…...

LangGraph 实战指南:拒绝 AI 应用面条代码,像搭地铁一样构建企业级 Agent

LangGraph 实战指南:拒绝 AI 应用面条代码,像搭地铁一样构建企业级 Agent 文章目录LangGraph 实战指南:拒绝 AI 应用面条代码,像搭地铁一样构建企业级 Agent前言:那个让程序员崩溃的周五晚上一、LangGraph 是什么&…...

Qwen3.5-9B-AWQ-4bit操作系统知识库:故障排查与内核参数调优指南

Qwen3.5-9B-AWQ-4bit操作系统知识库:故障排查与内核参数调优指南 1. 引言 如果你是一名系统管理员或运维工程师,每天面对各种操作系统疑难杂症,这个基于Qwen3.5-9B-AWQ-4bit模型构建的操作系统知识库可能会成为你的得力助手。它能理解Linux…...

Bidili Generator新手必看:参数设置详解与生成高质量图片技巧

Bidili Generator新手必看:参数设置详解与生成高质量图片技巧 1. 认识Bidili Generator:你的SDXL图片生成助手 Bidili Generator是一款基于Stable Diffusion XL(SDXL)1.0模型深度优化的图片生成工具。它最大的特点是解决了原生S…...

开箱即用的语音合成方案:CosyVoice-300M Lite镜像深度体验

开箱即用的语音合成方案:CosyVoice-300M Lite镜像深度体验 1. 引言 1.1 语音合成的现代需求 在智能客服、有声读物、语音助手等应用场景中,高质量的文本转语音(TTS)能力已成为提升用户体验的关键环节。然而,传统TTS…...

Qwen-Image-2512-Pixel-Art-LoRA 提示词工程进阶:掌握控制像素艺术风格与细节的秘诀

Qwen-Image-2512-Pixel-Art-LoRA 提示词工程进阶:掌握控制像素艺术风格与细节的秘诀 你是不是也遇到过这样的情况:用像素艺术模型生成图片,出来的效果要么像素块太大太粗糙,要么颜色花里胡哨不像复古游戏,要么就是画面…...

PyTorch 2.8镜像科研部署:支持WandB日志+HuggingFace Hub模型同步工作流

PyTorch 2.8镜像科研部署:支持WandB日志HuggingFace Hub模型同步工作流 1. 镜像概述与核心优势 PyTorch 2.8深度学习镜像是一个为科研工作者和开发者精心打造的通用训练/推理环境。这个镜像基于RTX 4090D 24GB显卡和CUDA 12.4深度优化,特别适合需要高性…...

LingBot-Depth进阶使用:结合API实现批量图片深度估计自动化

LingBot-Depth进阶使用:结合API实现批量图片深度估计自动化 1. 引言:为什么需要批量深度估计? 在日常的计算机视觉项目中,我们经常需要处理大量图片的深度估计任务。无论是构建3D场景数据集、开发机器人导航系统,还是…...

有人向OpenAI CEO家扔了燃烧弹:对AI的恐惧,真的要走到这一步吗?

有人向OpenAI CEO家扔了燃烧弹,来源他自己记录的播客: blog.samaltman.com他在博文里附上了全家福。他说,希望这张照片,能让下一个想动手的人犹豫一下。他在博文里附上了全家福。他说,希望这张照片,能让下一…...

SiameseUIE部署案例:中小企业文档结构化信息抽取落地实践

SiameseUIE部署案例:中小企业文档结构化信息抽取落地实践 1. 项目背景与价值 在日常业务运营中,中小企业往往需要处理大量非结构化的文档数据。比如从合同文件中提取关键人物信息,从业务报告中抽取地点信息,或者从新闻稿件中识别…...

StructBERT文本相似度模型Web服务开发:从零搭建RESTful API

StructBERT文本相似度模型Web服务开发:从零搭建RESTful API 你是不是也有过这样的想法:手头有一个很棒的AI模型,比如能精准判断两段文字相似度的StructBERT,但不知道怎么把它变成一个大家都能方便使用的服务?总不能每…...

告别抽佣,源码交付,新能源充电桩运营管理平台支持聚合管理云快充、特来电、星星充电,灵活配置分时电价、停车限免、超时占位费

充电桩运营管理平台支持领充、云快充、特来电、星星充电等2025年底,我国新能源汽车保有量已达到 4397 万辆,而全国公共充电桩仅480万台,在节假日期间“找桩难、充电烦”的问题突出,普遍存在“充电一小时,排队四小时”的…...

小白必看:Qwen3-ASR-0.6B语音识别镜像开箱即用教程

小白必看:Qwen3-ASR-0.6B语音识别镜像开箱即用教程 你是不是经常遇到这样的场景:开会录音需要整理成文字、外语视频需要字幕、或者想给一段语音快速生成文字稿?手动转写不仅耗时耗力,还容易出错。今天我要给你介绍一个超级好用的…...

如何在Blender中轻松导入导出3MF格式:3D打印工作流完整指南

如何在Blender中轻松导入导出3MF格式:3D打印工作流完整指南 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否曾经在Blender中创建了精美的3D模型&#x…...

网易云音乐NCM格式解密:3步快速解锁加密音乐的终极指南

网易云音乐NCM格式解密:3步快速解锁加密音乐的终极指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否在网易云音乐下载了VIP歌曲,却发现只能在特定客户端播放?这正是NCM加密格式带来的困扰…...

避坑指南:ESP32 Deep Sleep下GPIO状态保持,为什么你的RTC GPIO没锁住?

ESP32深度睡眠GPIO状态保持:从原理到实战的避坑指南 引言 凌晨三点,你的ESP32设备突然失控了——明明配置了深度睡眠状态下的GPIO保持功能,唤醒后却发现某个关键引脚的电平莫名其妙发生了变化。这不是什么灵异事件,而是很多开发者…...

Qwen3-Embedding-0.6B快速上手:搭建本地嵌入服务的完整步骤

Qwen3-Embedding-0.6B快速上手:搭建本地嵌入服务的完整步骤 1. 引言:认识Qwen3-Embedding-0.6B 文本嵌入技术是现代AI应用的基础组件,它能将文字转化为数值向量,让计算机理解语义关系。Qwen3-Embedding-0.6B作为通义千问家族的最…...

nli-distilroberta-base行业落地:保险条款与客户告知书语义一致性自动化审查

nli-distilroberta-base行业落地:保险条款与客户告知书语义一致性自动化审查 1. 项目概述 在保险行业,条款文档与客户告知书之间的语义一致性审查一直是个耗时费力的工作。传统人工审核方式不仅效率低下,还容易因人为疏忽导致合规风险。nli…...

卡证检测矫正模型边防应用:边境地区居民证件图像离线矫正方案

卡证检测矫正模型边防应用:边境地区居民证件图像离线矫正方案 边境地区的日常工作中,处理居民身份证、护照、驾照等证件是高频且关键的业务。无论是边民登记、通关查验还是日常管理,工作人员常常需要手动拍摄或接收大量角度各异、光线不一的…...

Qwen2.5-7B-Instruct效果展示:vLLM推理加速实测,Chainlit界面流畅对话

Qwen2.5-7B-Instruct效果展示:vLLM推理加速实测,Chainlit界面流畅对话 1. 模型能力概览 Qwen2.5-7B-Instruct是通义千问团队最新推出的70亿参数指令微调语言模型,基于vLLM推理框架部署,并通过Chainlit构建了直观的对话界面。这个…...

YOLOv12官版镜像实测:交通监控多目标检测效果有多强?

YOLOv12官版镜像实测:交通监控多目标检测效果有多强? 1. 引言:为什么选择YOLOv12进行交通监控? 在现代智能交通系统中,实时准确的目标检测能力是核心需求。传统的交通监控方案往往面临以下挑战: 复杂场景…...

LeetCode 删除无效的括号:python 题解臼

这个代码的核心功能是:基于输入词的长度动态选择反义词示例,并调用大模型生成反义词,体现了 “动态少样本提示(Dynamic Few-Shot Prompting)” 与 “上下文长度感知的示例选择” 的能力。 from langchain.prompts impo…...