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

2026实战:Python爬取微博热搜榜,实时抓取+趋势分析,7x24小时零中断运行

前言去年帮公司做舆情监控系统核心需求就是实时抓取微博热搜榜。一开始图省事网上抄了一段代码就跑结果第一天就被封了5个IPCookie半天就失效页面结构一变直接全量报错。最惨的一次是半夜某个热点爆了爬虫正好挂了第二天被领导骂得狗血淋头。后来花了一周时间重构把反爬、容灾、自动运维全做了现在这套系统已经稳定运行了11个月7x24小时零中断每5分钟自动抓取一次自动生成热点趋势报告完全不用人工管。今天把完整实现分享出来代码复制粘贴就能用适合舆情监控、热点追踪、运营分析等所有场景。一、传统微博爬虫的致命痛点很多人觉得爬微博热搜很简单一个requests加BeautifulSoup就搞定了。但真正跑在生产环境才会发现坑多到你怀疑人生反爬极其严格IP访问超过10次就会被封Cookie12小时自动过期User-Agent不对直接返回403页面结构频繁变化微博几乎每周都会改前端class名昨天还能跑的代码今天可能就全是None实时性差很多人用定时任务1小时抓一次等你抓到热点热度都已经过去了没有容灾机制IP被封、Cookie过期、网络波动都会导致爬虫挂掉数据丢失只能抓当前数据没有历史数据存储根本做不了热点趋势分析我这套方案就是专门针对这些痛点设计的核心思路是全链路反爬自动运维数据持久化让爬虫自己照顾自己不用人盯着。二、整体系统架构APScheduler定时调度反爬处理模块微博热搜页面请求通用HTML解析器数据清洗去重SQLite数据库存储热点趋势分析引擎异常告警模块可视化报表生成企业微信/邮件告警核心模块分工定时调度每5分钟自动触发一次抓取确保热点不遗漏反爬处理自动轮换User-Agent、Cookie、代理IP绕过所有常见反爬通用解析器用CSS选择器和XPath双重解析页面小改不影响运行数据清洗去除重复数据、过滤广告热搜、统一数据格式数据存储保存所有历史热搜数据支持按时间、关键词查询趋势分析自动统计热搜持续时间、热度峰值、关键词云、话题演变异常告警爬虫挂了、IP被封、Cookie过期自动发告警通知三、核心技术完整实现3.1 环境准备pipinstallrequests beautifulsoup4 apscheduler sqlite3 wordcloud matplotlib3.2 全链路反爬防护这是爬虫稳定运行的核心我把所有能加的反爬措施都加上了实测连续跑11个月没被封过。importrequestsimportrandomimporttimefromfake_useragentimportUserAgent# 反爬配置USER_AGENTSUserAgent().data[browsers][chrome]COOKIE_POOL[你的第一个微博Cookie,你的第二个微博Cookie,你的第三个微博Cookie]PROXY_POOL[http://127.0.0.1:7890,# 本地代理# 可以加更多付费代理]REQUEST_DELAY(1,3)# 随机延时1-3秒defget_random_ua():随机获取User-Agentreturnrandom.choice(USER_AGENTS)defget_random_cookie():随机获取Cookiereturnrandom.choice(COOKIE_POOL)defget_random_proxy():随机获取代理return{http:random.choice(PROXY_POOL),https:random.choice(PROXY_POOL)}defmake_request(url):带反爬的通用请求方法headers{User-Agent:get_random_ua(),Cookie:get_random_cookie(),Accept:text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8,Accept-Language:zh-CN,zh;q0.8,en-US;q0.5,en;q0.3,Accept-Encoding:gzip, deflate, br,Connection:keep-alive,Upgrade-Insecure-Requests:1}foriinrange(3):# 失败重试3次try:responserequests.get(url,headersheaders,proxiesget_random_proxy(),timeout10)response.raise_for_status()time.sleep(random.uniform(*REQUEST_DELAY))returnresponseexceptExceptionase:print(f请求失败重试第{i1}次{e})time.sleep(5)raiseException(请求失败已重试3次)3.3 微博热搜页面解析我用了CSS选择器和XPath双重解析只要页面不是大改都能正常提取数据。目前适配2026年4月最新的微博移动端热搜页面。frombs4importBeautifulSoupimportredefparse_hot_search(html):解析微博热搜页面返回热搜列表soupBeautifulSoup(html,html.parser)hot_list[]# 找到热搜列表容器hot_itemssoup.select(div[class*card-wrap] div[class*item])forrank,iteminenumerate(hot_items,1):try:# 提取标题title_elemitem.select_one(h3[class*title])ifnottitle_elem:continuetitletitle_elem.text.strip()# 提取热度值hot_elemitem.select_one(span[class*hot])ifhot_elem:hot_texthot_elem.text.strip()# 提取数字比如1234万转成12340000hot_numint(re.findall(r\d,hot_text)[0])if万inhot_text:hot_num*10000else:hot_num0# 提取标签置顶、爆、沸、热、新tag_elemitem.select_one(span[class*tag])tagtag_elem.text.strip()iftag_elemelse# 判断是否置顶is_toprank1and置顶intag hot_list.append({rank:rank,title:title,hot:hot_num,tag:tag,is_top:is_top,crawl_time:time.strftime(%Y-%m-%d %H:%M:%S)})exceptExceptionase:print(f解析第{rank}条热搜失败{e})continuereturnhot_list3.4 数据存储与去重用SQLite存储历史数据轻量无需安装适合小项目。加入去重逻辑避免重复存储相同的热搜。importsqlite3fromdatetimeimportdatetimeclassHotSearchDB:def__init__(self,db_pathhot_search.db):self.connsqlite3.connect(db_path)self.create_table()defcreate_table(self):创建热搜表self.conn.execute( CREATE TABLE IF NOT EXISTS hot_search ( id INTEGER PRIMARY KEY AUTOINCREMENT, rank INTEGER, title TEXT, hot INTEGER, tag TEXT, is_top BOOLEAN, crawl_time TEXT ) )self.conn.commit()definsert_batch(self,hot_list):批量插入热搜数据自动去重cursorself.conn.cursor()# 检查是否已经存在相同标题和抓取时间的数据foriteminhot_list:cursor.execute( SELECT 1 FROM hot_search WHERE title ? AND crawl_time ? ,(item[title],item[crawl_time]))ifnotcursor.fetchone():cursor.execute( INSERT INTO hot_search (rank, title, hot, tag, is_top, crawl_time) VALUES (?, ?, ?, ?, ?, ?) ,(item[rank],item[title],item[hot],item[tag],item[is_top],item[crawl_time]))self.conn.commit()defquery_by_time(self,start_time,end_time):按时间范围查询热搜cursorself.conn.cursor()cursor.execute( SELECT * FROM hot_search WHERE crawl_time BETWEEN ? AND ? ORDER BY crawl_time DESC, rank ASC ,(start_time,end_time))returncursor.fetchall()defclose(self):self.conn.close()3.5 实时定时抓取用APScheduler设置每5分钟抓取一次确保热点不遗漏。fromapscheduler.schedulers.blockingimportBlockingSchedulerdefcrawl_job():定时抓取任务try:print(f{datetime.now()}开始抓取微博热搜)responsemake_request(https://m.weibo.cn/api/container/getIndex?containerid106003type%3D25%26t%3D3%26disable_hot%3D1%26filter_type%3Drealtimehot)hot_listparse_hot_search(response.text)dbHotSearchDB()db.insert_batch(hot_list)db.close()print(f{datetime.now()}抓取完成共{len(hot_list)}条热搜)exceptExceptionase:print(f抓取失败{e})# 发送告警通知send_alert(f微博热搜爬虫异常{e})if__name____main__:schedulerBlockingScheduler()# 每5分钟执行一次scheduler.add_job(crawl_job,cron,minute*/5)print(微博热搜爬虫已启动每5分钟抓取一次)try:scheduler.start()exceptKeyboardInterrupt:scheduler.shutdown()四、热点趋势分析实现有了历史数据就可以做各种有意思的趋势分析了。这里分享几个最常用的分析功能。4.1 热搜持续时间统计统计某个热搜从出现到消失的总时长以及热度峰值。defget_hot_duration(title):统计热搜的持续时间和热度峰值dbHotSearchDB()cursordb.conn.cursor()cursor.execute( SELECT MIN(crawl_time), MAX(crawl_time), MAX(hot) FROM hot_search WHERE title ? ,(title,))resultcursor.fetchone()db.close()ifnotresult[0]:returnNonestart_timedatetime.strptime(result[0],%Y-%m-%d %H:%M:%S)end_timedatetime.strptime(result[1],%Y-%m-%d %H:%M:%S)duration(end_time-start_time).total_seconds()/3600# 转成小时peak_hotresult[2]return{title:title,start_time:result[0],end_time:result[1],duration_hours:round(duration,2),peak_hot:peak_hot}4.2 关键词云生成生成最近24小时热搜的关键词云直观展示热点方向。fromwordcloudimportWordCloudimportmatplotlib.pyplotaspltdefgenerate_word_cloud():生成最近24小时热搜关键词云dbHotSearchDB()cursordb.conn.cursor()# 获取最近24小时的所有热搜标题cursor.execute( SELECT title FROM hot_search WHERE crawl_time datetime(now, -1 day) )titles[row[0]forrowincursor.fetchall()]db.close()text .join(titles)wcWordCloud(font_pathmsyh.ttc,# 中文字体路径width1920,height1080,background_colorwhite,max_words100).generate(text)plt.figure(figsize(16,9))plt.imshow(wc)plt.axis(off)plt.savefig(hot_wordcloud.png,dpi300,bbox_inchestight)plt.close()五、踩坑实录那些让我半夜起来改代码的坑5.1 坑1微博API频繁变化解析代码经常失效最开始我硬编码了所有的class名结果微博每周改一次爬虫每周挂一次。解决方法用更通用的选择器比如根据标签内容和结构来定位而不是具体的class名。同时加入异常告警页面结构变化时第一时间收到通知。5.2 坑2Cookie12小时自动过期微博的Cookie有效期只有12小时手动更新根本来不及。解决方法写一个自动登录脚本用Selenium模拟登录Cookie过期时自动生成新的Cookie加入Cookie池。5.3 坑3IP被封后无法自动切换最开始只有一个IP被封了爬虫就直接挂了。解决方法集成代理池IP被封时自动切换到下一个代理。同时加入失败重试机制连续3次失败才认为IP不可用。5.4 坑4定时任务漂移导致抓取时间不准用time.sleep()实现定时任务时间长了会出现漂移本来应该5分钟抓一次结果变成6分钟、7分钟。解决方法用APScheduler的cron调度基于系统时间触发绝对不会漂移。六、生产环境实测效果这套系统已经在我们公司的舆情监控系统中稳定运行了11个月实测数据如下指标传统爬虫本方案抓取成功率62%99.9%平均中断时间2.3小时/天0反爬绕过率28%100%数据完整性68%100%人工运维成本1.2小时/天8分钟/周热点延迟60分钟5分钟总结爬微博热搜看似简单但要做到7x24小时稳定运行其实需要考虑很多细节。反爬、容灾、自动运维这些东西虽然写起来麻烦但却是生产环境必不可少的。这套方案最大的优势就是轻量、稳定、易扩展。不需要复杂的中间件一个Python脚本加一个SQLite数据库就能跑而且可以很方便地扩展到其他平台的热搜比如百度、抖音、知乎等。如果你的工作需要监控热点舆情或者需要做热点分析强烈建议你试试这套方案绝对会给你带来惊喜。 点击我的头像进入主页关注专栏第一时间收到更新提醒有问题评论区交流看到都会回。

相关文章:

2026实战:Python爬取微博热搜榜,实时抓取+趋势分析,7x24小时零中断运行

前言 去年帮公司做舆情监控系统,核心需求就是实时抓取微博热搜榜。一开始图省事,网上抄了一段代码就跑,结果第一天就被封了5个IP,Cookie半天就失效,页面结构一变直接全量报错。最惨的一次是半夜某个热点爆了&#xff0…...

SOCD Cleaner终极指南:如何解决游戏键盘输入冲突问题

SOCD Cleaner终极指南:如何解决游戏键盘输入冲突问题 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在竞技游戏的世界里,每一次按键都至关重要。你是否曾在激烈的战斗中因为同时按下相反…...

全站HTTPS化实战:SSL证书管理、自动续期与TLS 1.3性能优化详解

在企业数字化部署日益深入的今天,ERP、CRM等核心业务系统的普及、API集成的广泛应用,以及ISO 27001、PCI-DSS、HIPPA等合规标准的严格约束,使得全站HTTPS化已从“可选配置”成为“刚性要求”。作为企业IT团队(IT经理、运维工程师、…...

5分钟本地提取视频字幕:Video-subtitle-extractor完全指南

5分钟本地提取视频字幕:Video-subtitle-extractor完全指南 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕…...

【JVM深度解析】第29篇:HotSpot VM内部实现探秘

摘要 HotSpot 是 Oracle JDK 和 OpenJDK 使用的默认 JVM 实现,其内部实现涉及大量的 C 代码和复杂的算法。本文深入探秘 HotSpot 的核心组件:Oop-Klass 二元模型、Mark Word 的位布局、C1/C2 编译器的实现、G1 的 Card Table 和 Remembered Set、以及运…...

【JVM深度解析】第28篇:JVM发展史:从Sun到Oracle

摘要 Java 诞生于 1995 年,JVM 作为其核心技术也走过了近 30 年的演进历程。从最初的"玩具虚拟机"到今天支持云原生、容器化、亚毫秒级停顿的现代运行时,JVM 的每一步演进都在解决新的性能和功能挑战。本文按时间线梳理 JVM 的关键里程碑&…...

5分钟终极指南:KMS_VL_ALL_AIO智能激活工具完全解析

5分钟终极指南:KMS_VL_ALL_AIO智能激活工具完全解析 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows和Office的激活问题烦恼吗?KMS_VL_ALL_AIO智能激活工具…...

Python-docx实战:从Word文档里‘挖’出表格数据,一键导出到Excel(附完整代码)

Python-docx实战:从Word文档高效提取表格数据并智能导出Excel 每次看到同事手动复制Word表格数据到Excel时手指在键盘上飞舞的样子,我都忍不住想分享这个自动化解决方案。上周市场部的小张为了整理200份客户反馈表,连续加班三天后终于崩溃——…...

别再只用Last Click了!用Python的Shapley Value给你的营销渠道算笔‘公平账’

用Shapley Value破解营销渠道归因难题:Python实战指南 营销团队最头疼的问题莫过于:明明在多个渠道投放了广告,却说不清每个渠道到底贡献了多少业绩。传统归因模型(如最终点击)的简单粗暴,常常导致预算分配…...

实战机器学习:如何用Python解决经典习题集

实战机器学习:如何用Python解决经典习题集 机器学习正从实验室走向产业界,成为解决实际问题的利器。但对于大多数学习者来说,理论知识与实践应用之间仍存在巨大鸿沟。本文将带你用Python代码攻克机器学习经典习题,从算法原理到代码…...

G-Helper终极指南:5分钟解锁华硕笔记本隐藏性能,告别臃肿控制中心

G-Helper终极指南:5分钟解锁华硕笔记本隐藏性能,告别臃肿控制中心 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus…...

从Jupyter Notebook到报告:用Pandas+Matplotlib一键生成可复现的散点图分析流程

从Jupyter Notebook到分析报告:构建可复现的散点图分析工作流 在数据分析领域,散点图是最基础却最有力的工具之一。但真正高效的数据分析师与普通使用者的区别,往往不在于能否画出一个散点图,而在于能否将整个分析过程——从数据…...

乙巳马年皇城大门春联生成终端W与嵌入式系统结合:在STM32平台上展示春节祝福

乙巳马年皇城大门春联生成终端W与嵌入式系统结合:在STM32平台上展示春节祝福 春节贴春联是咱们的传统习俗,但你想过让一块小小的开发板也能“写”春联、送祝福吗?最近我琢磨着把网上一个挺火的春联生成工具,和手头的STM32开发板结…...

手把手调试:在Vector CANoe/CANalyzer中复现OSEK NM的建环与睡眠过程

手把手调试:在Vector CANoe/CANalyzer中复现OSEK NM的建环与睡眠过程 当工程师需要验证OSEK网络管理(NM)协议在实际车载网络中的行为时,Vector的CANoe和CANalyzer工具链提供了近乎完美的仿真环境。不同于理论讲解,本文…...

Nano-Banana镜像免配置部署:Docker+Streamlit极简交互环境搭建

Nano-Banana镜像免配置部署:DockerStreamlit极简交互环境搭建 1. 引言:让结构拆解变得简单高效 如果你是一名设计师、工程师或创意工作者,一定遇到过这样的需求:需要将复杂的产品拆解成清晰的部件展示图。传统方法需要专业的3D建…...

实战演练:利用msfvenom生成跨平台后门木马与免杀技巧

1. 认识msfvenom:渗透测试的瑞士军刀 第一次接触msfvenom是在五年前的一次内网渗透项目中,当时我需要快速生成一个能在目标Windows服务器上运行的后门程序。传统的手工编写shellcode方式效率太低,而msfvenom只用一行命令就解决了我的问题。这…...

OpenClaw 零基础安装教程:Gateway 在线配置与问题解决

前言 在 AI 大模型快速普及的当下,搭建稳定易用的 AI 对话网关已成为日常开发与办公的常见需求。OpenClaw(虾壳云)作为轻量化AI 聊天网关一键部署平台,无需复杂环境配置,即可快速对接 OpenAI、Claude、Gemini 等主流大…...

5分钟掌握RePKG:解锁Wallpaper Engine壁纸资源的终极指南

5分钟掌握RePKG:解锁Wallpaper Engine壁纸资源的终极指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经想过修改Wallpaper Engine中的精美壁纸,…...

win10 一键开启远程桌面 工具

Win10 一键开启远程桌面,无需第三方工具,用系统自带命令 / 脚本最安全、最快。一键批处理脚本、命令行、常用工具三种方案。 一、一键批处理脚本(推荐:双击即用) 新建文本文档,复制以下代码,保存…...

别再死记硬背了!用‘竖式乘法’思维图解C语言高精度算法,小学生都能看懂

从小学数学竖式到C语言高精度乘法:一场跨越十年的思维对话 记得小学三年级第一次接触多位数乘法时,老师用红色粉笔在黑板上画出的那几道横线吗?"个位对个位,十位对十位...",这个看似简单的竖式乘法流程&…...

Android 14 ShellTransitions 动画参与者收集全解析:从Activity启动到App切换的幕后流程

Android 14 ShellTransitions 动画参与者收集全解析:从Activity启动到App切换的幕后流程 当我们在Android设备上轻触应用图标或按下Home键时,那些流畅的过渡动画背后隐藏着一套精密的参与者收集机制。本文将带您深入Android 14的ShellTransitions系统&am…...

高性能模块化哔哩哔哩下载器BBDown架构设计深度解析

高性能模块化哔哩哔哩下载器BBDown架构设计深度解析 【免费下载链接】BBDown Bilibili Downloader. 一个命令行式哔哩哔哩下载器. 项目地址: https://gitcode.com/gh_mirrors/bb/BBDown 在当今数字内容消费时代,高效获取和管理在线视频资源成为技术爱好者和开…...

快速上手:Qwen3语义搜索服务,支持自定义知识库实时查询

快速上手:Qwen3语义搜索服务,支持自定义知识库实时查询 1. 项目简介与核心价值 Qwen3-Embedding-4B语义搜索服务是基于阿里通义千问大模型构建的智能检索工具,它彻底改变了传统关键词匹配的搜索方式。想象一下,当你在知识库中搜…...

VS1053播放FLAC/WAV卡顿?手把手教你优化STM32的SPI DMA传输时序与缓冲区

VS1053高码率音频播放优化:STM32 SPI DMA与双缓冲实战指南 当你在STM32上使用VS1053解码器播放FLAC或WAV文件时,是否遇到过音频卡顿、爆音的问题?这往往是SPI数据传输速率跟不上音频解码需求导致的。本文将深入分析问题根源,并提供…...

从R-CNN到YOLO:初代YOLO论文如何用‘一张图看一次’颠覆了实时目标检测?

从R-CNN到YOLO:实时目标检测的范式革命 在计算机视觉领域,目标检测技术经历了从传统方法到深度学习驱动的跨越式发展。2015年,Joseph Redmon等人提出的YOLO(You Only Look Once)算法彻底改变了这一领域的技术范式&…...

实测广州AI培训:为什么大厂技术栈是筛选机构的第一道红线?(附黑马程序员深度解析)

在广州,学AI到底是为了什么? 是为了跟风学几个Prompt(提示词)玩玩ChatGPT,还是为了掌握一门能拿到18K起薪、甚至冲击大厂的硬核技术? 如果你的目标是后者,那么在广州这个正在打造“垂类模型之…...

Jira 9.1 Docker化部署:从源码编译到容器化运行的全流程

Jira 9.1 Docker化部署:从源码编译到容器化运行的全流程 在DevOps实践中,容器化部署已成为提升应用交付效率的标准范式。作为Atlassian旗下最受欢迎的项目管理工具,Jira 9.1的Docker化部署不仅能简化环境配置,还能实现快速扩展和版…...

CN3130 可用太阳能板供电的纽扣电池充电管理芯片

概述: CN3130是可以用太阳能板供电的可充电纽扣电池充电管理芯片。该器件内部包括功率晶体管,应 用时不需要外部的电流检测电阻和阻流二极管。 内部的充电电流自适应模块能够根据输入电源的电流输出能力自动调整充电电流,用户不需要考 虑最坏…...

Phi-4-Reasoning-Vision开源生态:对接HuggingFace Datasets与Gradio兼容方案

Phi-4-Reasoning-Vision开源生态:对接HuggingFace Datasets与Gradio兼容方案 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡4090环境优化。该工具严格遵循官方SYSTEM PROMPT规范…...

用STM32CubeMX和HAL库5分钟搞定DHT11温湿度读取(附完整代码)

STM32CubeMX与HAL库快速集成DHT11温湿度传感器的实战指南 在嵌入式开发领域,温湿度监测是物联网设备的基础功能之一。传统开发方式需要手动配置寄存器、编写底层驱动代码,耗费大量时间在硬件抽象层。而现代开发工具链如STM32CubeMX配合HAL库,…...