5分钟快速上手:微信公众号爬虫完整指南与实战教程
5分钟快速上手微信公众号爬虫完整指南与实战教程【免费下载链接】wechat_articles_spider微信公众号文章的爬虫项目地址: https://gitcode.com/gh_mirrors/we/wechat_articles_spider想要批量获取微信公众号文章的阅读量、点赞数和评论数据吗wechat_articles_spider是一个功能强大的 Python 爬虫库专门用于采集微信公众号文章的关键数据。无论你是数据分析师、市场研究员还是开发者这个工具都能帮你轻松获取公众号运营数据为决策提供数据支持。 为什么需要微信公众号爬虫在数字营销时代微信公众号已成为品牌传播和内容营销的重要阵地。然而微信平台并未开放完整的数据接口这使得获取公众号文章的阅读量、点赞数、评论信息等关键指标变得异常困难。传统方法面临的问题手动统计耗时耗力数据更新不及时无法进行批量分析缺乏历史数据积累wechat_articles_spider 的解决方案自动化获取文章链接批量采集互动数据支持历史文章回溯提供数据导出功能️ 技术原理揭秘如何绕过微信限制图通过浏览器开发者工具获取微信认证参数核心认证参数解析微信公众号爬虫的核心在于获取正确的认证参数。系统通过模拟真实用户行为携带以下关键参数访问微信服务器Cookie- 用户会话标识Token- 公众号后台访问令牌appmsg_token- 文章访问令牌__biz- 公众号唯一标识这些参数需要通过抓包工具获取具体方法如下# 关键参数示例 params { __biz: MzA5NjEzOTQyMA, # 公众号唯一标识 appmsg_type: 9, # 图文消息类型 mid: 2651505707, # 消息ID sn: b87b9ef8c76e256657dfd1448dca3311, # 消息签名 pass_ticket: ryXp8guWeh10yWYTOq2VlnBS8Eetb%252F # 会话票据 }请求流程架构用户登录 → 抓包获取参数 → 构建请求 → 解析响应 → 数据存储 ↓ ↓ ↓ ↓ ↓ 微信公众号 → 开发者工具 → 爬虫程序 → JSON解析 → 数据库 快速安装与配置环境准备# 克隆项目仓库 git clone https://gitcode.com/gh_mirrors/we/wechat_articles_spider # 进入项目目录 cd wechat_articles_spider # 安装依赖包 pip install -r requirements.txt项目结构概览wechat_articles_spider/ ├── wechatarticles/ # 核心爬虫模块 │ ├── ArticlesInfo.py # 文章数据获取 │ ├── ArticlesUrls.py # 文章链接采集 │ ├── Url2Html.py # 文章下载转换 │ ├── ArticlesAPI.py # API接口封装 │ └── utils.py # 工具函数 ├── test/ # 测试示例 │ ├── test_WechatInfo.py # 数据获取测试 │ ├── test_WechatUrls.py # 链接获取测试 │ └── test_Url2Html.py # 下载功能测试 └── jsons/ # 示例数据参数获取实战图使用Fiddler抓包工具监控微信公众号请求浏览器开发者工具获取方法打开 Chrome 浏览器按 F12 进入开发者工具访问微信公众号后台mp.weixin.qq.com切换到 Network 标签页刷新页面查找包含actiongetfaq的请求从 Request Headers 中复制 Cookie 和 TokenFiddler抓包获取 appmsg_token安装并配置 Fiddler启用 HTTPS 解密登录微信 PC 端打开公众号文章在 Fiddler 中搜索包含appmsg_token的请求从 URL 参数中提取 appmsg_token 值 核心功能实战演示1. 获取公众号文章链接from wechatarticles import PublicAccountsWeb # 初始化爬虫实例 cookie your_cookie token your_token nickname 公众号名称 biz MzA5NjEzOTQyMA # 公众号biz参数 # 创建实例 paw PublicAccountsWeb(cookiecookie, tokentoken) # 获取文章链接 article_data paw.get_urls( nicknamenickname, bizbiz, begin0, count10 # 获取10篇文章 ) # 输出结果 for article in article_data: print(f标题: {article[title]}) print(f链接: {article[link]}) print(f发布时间: {article[publish_time]}) print(- * 50)2. 批量获取文章数据from wechatarticles import ArticlesInfo import time class WechatDataCollector: def __init__(self, appmsg_token, cookie): self.info_getter ArticlesInfo(appmsg_token, cookie) def get_article_stats(self, article_url): 获取单篇文章的阅读量和点赞数 try: read_num, like_num, old_like_num self.info_getter.read_like_nums(article_url) comments self.info_getter.comments(article_url) return { read_num: read_num, like_num: like_num, comment_count: len(comments) if comments else 0, comments: comments } except Exception as e: print(f获取文章数据失败: {e}) return None def batch_collect(self, urls, delay5): 批量采集文章数据 results [] for i, url in enumerate(urls): print(f正在处理第 {i1}/{len(urls)} 篇文章...) stats self.get_article_stats(url) if stats: results.append({url: url, **stats}) # 避免请求过快被封 time.sleep(delay) return results3. 文章下载与本地化from wechatarticles import Url2Html import os class ArticleDownloader: def __init__(self, save_dir./articles): self.save_dir save_dir os.makedirs(save_dir, exist_okTrue) self.downloader Url2Html() def download_article(self, url, save_imagesTrue): 下载单篇文章为HTML try: result self.downloader.run( url, modehtml, save_imgsave_images, save_pathself.save_dir ) if result: print(f✅ 文章下载成功: {url}) return True else: print(f❌ 文章下载失败: {url}) return False except Exception as e: print(f⚠️ 下载过程中出错: {e}) return False 高级应用场景场景一竞品公众号数据分析图微信生态中的数据采集与应用场景业务需求监控竞品公众号的运营表现分析文章互动数据趋势识别热门内容和发布时间实现方案import pandas as pd from datetime import datetime class CompetitorAnalyzer: def __init__(self, config, competitors): self.config config self.competitors competitors def generate_report(self, days30): 生成竞品分析报告 report_data [] for competitor in self.competitors: print(f分析竞品: {competitor[name]}) # 获取文章数据 articles self.get_recent_articles( competitor[nickname], competitor[biz], daysdays ) # 计算关键指标 metrics self.calculate_metrics(articles) report_data.append({ 公众号: competitor[name], 分析周期: f{days}天, 文章数量: len(articles), 平均阅读量: metrics[avg_read], 平均点赞率: metrics[avg_like_ratio], 最佳发布时间: metrics[best_time] }) # 生成报告 df pd.DataFrame(report_data) report_file fcompetitor_report_{datetime.now().strftime(%Y%m%d)}.csv df.to_csv(report_file, indexFalse, encodingutf-8-sig) print(f✅ 报告已生成: {report_file}) return df场景二内容运营效果追踪功能特点追踪单篇文章的长期表现分析内容类型与互动关系优化发布时间策略class ContentPerformanceTracker: def __init__(self, storage_backendsqlite): self.storage self._init_storage(storage_backend) def track_article(self, article_url, interval_hours24): 定期追踪文章表现 import schedule import time def job(): stats self.get_current_stats(article_url) self.storage.save_tracking_data(article_url, stats) print(f已记录文章数据: {stats}) # 设置定时任务 schedule.every(interval_hours).hours.do(job) # 立即执行一次 job() # 保持运行 while True: schedule.run_pending() time.sleep(60)⚡ 性能优化与最佳实践1. 请求频率控制策略import time from collections import deque class RateLimiter: def __init__(self, max_requests10, time_window60): self.max_requests max_requests self.time_window time_window self.request_times deque() def wait_if_needed(self): 智能等待避免被封禁 current_time time.time() # 移除过期的请求记录 while (self.request_times and current_time - self.request_times[0] self.time_window): self.request_times.popleft() # 检查是否超过限制 if len(self.request_times) self.max_requests: sleep_time self.time_window - (current_time - self.request_times[0]) if sleep_time 0: print(f⚠️ 请求频率过高等待 {sleep_time:.1f} 秒...) time.sleep(sleep_time) # 记录本次请求 self.request_times.append(current_time)2. 错误处理与重试机制import logging from functools import wraps def retry_on_failure(max_retries3, delay5): 装饰器失败重试机制 def decorator(func): wraps(func) def wrapper(*args, **kwargs): for attempt in range(max_retries): try: return func(*args, **kwargs) except Exception as e: if attempt max_retries - 1: wait_time delay * (2 ** attempt) # 指数退避 logging.warning( f第 {attempt 1} 次尝试失败{wait_time} 秒后重试: {e} ) time.sleep(wait_time) else: logging.error(f所有 {max_retries} 次尝试均失败) raise return None return wrapper return decorator # 使用示例 retry_on_failure(max_retries3, delay5) def safe_get_article_data(url): return articles_info.get_article_stats(url)3. 数据缓存与持久化import json import sqlite3 from datetime import datetime, timedelta class DataCache: 数据缓存管理器 def __init__(self, cache_dir./cache, ttl_hours24): self.cache_dir cache_dir self.ttl timedelta(hoursttl_hours) os.makedirs(cache_dir, exist_okTrue) def get_cached_data(self, cache_key): 获取缓存数据 cache_file os.path.join(self.cache_dir, f{cache_key}.json) if os.path.exists(cache_file): file_mtime datetime.fromtimestamp(os.path.getmtime(cache_file)) if datetime.now() - file_mtime self.ttl: with open(cache_file, r, encodingutf-8) as f: return json.load(f) return None def set_cached_data(self, cache_key, data): 设置缓存数据 cache_file os.path.join(self.cache_dir, f{cache_key}.json) with open(cache_file, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) 故障排除与常见问题问题1参数获取失败症状无法获取有效的 cookie、token 或 appmsg_token解决方案确认已登录正确的微信账号检查网络代理设置尝试关闭代理清除浏览器缓存后重新登录确保使用最新版本的抓包工具问题2请求频率过高被封症状请求返回错误或无法获取数据应对策略降低请求频率至每5-10秒一次使用代理IP轮换等待5-10分钟后重试检查参数是否过期需要重新获取问题3数据不完整或为空排查步骤确认已关注目标公众号验证文章链接是否正确检查参数是否针对正确的公众号尝试使用不同的获取方式PC端/移动端 数据存储与分析建议数据库设计示例import sqlite3 from contextlib import contextmanager class WechatDatabase: 微信公众号数据存储管理 def __init__(self, db_pathwechat_data.db): self.db_path db_path self._init_database() def _init_database(self): 初始化数据库表结构 with self._get_connection() as conn: conn.execute( CREATE TABLE IF NOT EXISTS articles ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, url TEXT UNIQUE NOT NULL, publish_time TIMESTAMP, read_num INTEGER, like_num INTEGER, comment_count INTEGER, biz TEXT, author TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) conn.execute( CREATE TABLE IF NOT EXISTS comments ( id INTEGER PRIMARY KEY AUTOINCREMENT, article_id INTEGER, content TEXT, like_count INTEGER, reply_count INTEGER, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (article_id) REFERENCES articles (id) ) ) contextmanager def _get_connection(self): 获取数据库连接 conn sqlite3.connect(self.db_path) try: yield conn conn.commit() finally: conn.close()数据分析示例import pandas as pd import matplotlib.pyplot as plt class DataAnalyzer: 微信公众号数据分析器 def __init__(self, db_pathwechat_data.db): self.db_path db_path def generate_insights(self): 生成数据洞察报告 # 连接数据库 conn sqlite3.connect(self.db_path) # 读取数据 df pd.read_sql_query(SELECT * FROM articles, conn) # 基础统计 insights { total_articles: len(df), avg_read: df[read_num].mean(), avg_like: df[like_num].mean(), total_comments: df[comment_count].sum(), top_articles: df.nlargest(5, read_num)[[title, read_num, like_num]] } # 时间趋势分析 if publish_time in df.columns: df[publish_hour] pd.to_datetime(df[publish_time]).dt.hour hour_distribution df[publish_hour].value_counts().sort_index() insights[best_publish_hours] hour_distribution conn.close() return insights 扩展功能与生态系统1. 参数自动化获取虽然当前版本需要手动获取参数但可以考虑以下自动化方案浏览器自动化使用 Selenium 自动登录并获取参数参数管理平台开发 Web 界面管理多个账号参数参数过期提醒设置监控任务参数过期时自动提醒2. 功能扩展方向数据采集扩展文章转发数统计粉丝增长趋势分析内容类型识别图文/视频/音频分析功能增强情感分析评论情感倾向关键词提取文章主题识别阅读转化率计算3. 部署与集成云部署方案# docker-compose.yml 示例 version: 3 services: wechat-crawler: build: . environment: - REDIS_HOSTredis - DATABASE_URLpostgresql://user:passdb/wechat volumes: - ./data:/app/data depends_on: - redis - db redis: image: redis:alpine db: image: postgres:13 environment: - POSTGRES_PASSWORDpasswordAPI 服务化from flask import Flask, request, jsonify app Flask(__name__) app.route(/api/articles, methods[POST]) def get_articles(): 获取公众号文章数据API data request.json nickname data.get(nickname) biz data.get(biz) # 调用爬虫逻辑 articles crawler.get_articles(nickname, biz) return jsonify({ success: True, data: articles, count: len(articles) }) 商业应用价值1. 市场研究与竞品分析通过 wechat_articles_spider企业可以监控竞品动态实时追踪竞争对手的发布频率和内容策略分析用户偏好了解目标用户喜欢的内容类型和话题优化发布策略基于数据分析确定最佳发布时间和内容形式2. 内容运营优化内容团队可以利用数据评估内容效果量化每篇文章的传播效果识别爆款模式分析高互动文章的共同特征优化标题策略测试不同标题对阅读量的影响3. 投资决策支持投资者可以通过公众号数据评估品牌影响力通过互动数据量化品牌影响力监测行业趋势追踪特定行业的内容变化趋势发现新兴机会识别快速增长的内容领域 学习资源与进阶指南官方文档与示例核心模块文档docs/source/wechatarticles.rst测试示例代码test/ 目录下的各种测试文件参数获取指南docs/get_cookie_token.md进阶学习路径基础掌握运行 test 目录下的示例代码参数理解深入学习微信认证机制源码分析阅读 wechatarticles 模块源码定制开发根据业务需求扩展功能性能优化实现分布式采集和缓存机制社区与支持问题反馈仔细阅读文档和源码后提问贡献代码欢迎提交 Pull Request 改进项目最佳实践分享你的使用经验和优化方案 总结与展望wechat_articles_spider 作为一个成熟的微信公众号爬虫工具为开发者提供了强大的数据采集能力。通过本文的详细介绍你应该已经掌握了✅核心功能文章链接获取、数据采集、内容下载✅部署方法环境配置、参数获取、快速启动✅实战技巧竞品分析、内容优化、数据存储✅性能优化请求控制、错误处理、缓存机制✅商业应用市场研究、运营优化、投资决策未来发展方向智能化升级集成机器学习算法进行内容分类和趋势预测可视化增强开发数据看板和实时监控界面生态扩展构建插件系统支持更多数据源和输出格式合规优化完善数据采集的合规性和隐私保护记住技术工具的价值在于合理使用。请遵守相关法律法规和平台规则仅将 wechat_articles_spider 用于合法合规的数据分析和个人学习目的。开始你的微信公众号数据分析之旅吧【免费下载链接】wechat_articles_spider微信公众号文章的爬虫项目地址: https://gitcode.com/gh_mirrors/we/wechat_articles_spider创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Vue-ECharts:终极Vue数据可视化组件完整指南

Vue-ECharts:终极Vue数据可视化组件完整指南

Vue-ECharts:终极Vue数据可视化组件完整指南 【免费下载链接】vue-echarts Vue.js component for Apache ECharts™. 项目地址: https://gitcode.com/gh_mirrors/vu/vue-echarts Vue-ECharts是专为Vue.js开发者设计的强大数据可视化组件,基于Apac…

2026/9/26 3:38:30 阅读更多 →
三步解锁智能黑苹果配置:OpCore-Simplify如何让复杂硬件兼容性验证变得简单

三步解锁智能黑苹果配置:OpCore-Simplify如何让复杂硬件兼容性验证变得简单

三步解锁智能黑苹果配置:OpCore-Simplify如何让复杂硬件兼容性验证变得简单 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾因黑苹…

2026/10/14 17:35:41 阅读更多 →
Ultimate SD Upscale完整指南:如何在ComfyUI中实现高质量图像超分辨率

Ultimate SD Upscale完整指南:如何在ComfyUI中实现高质量图像超分辨率

Ultimate SD Upscale完整指南:如何在ComfyUI中实现高质量图像超分辨率 【免费下载链接】ComfyUI_UltimateSDUpscale ComfyUI nodes for the Ultimate Stable Diffusion Upscale script by Coyote-A. 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_Ultimat…

2026/10/13 21:30:33 阅读更多 →

最新新闻

企业微信外部群机器人如何实现消息处理结果自动返回群聊

企业微信外部群机器人如何实现消息处理结果自动返回群聊

在企业微信异步解耦的中台架构中,内网的 ERP 或大模型处理完客户的诉求后,如何跨越内外网的物理隔离,让潜伏在数百个外部群中的机器人准确无误地把结果“说”给对应的客户听? 这不仅仅是调用一个发送接口那么简单。在多租户、高并…

2026/10/15 3:02:35 阅读更多 →
企业微信API如何接入现有系统?接口层与业务层怎么划分

企业微信API如何接入现有系统?接口层与业务层怎么划分

很多企业研发团队在初次对接企业微信 API 时,为了赶进度,习惯性地采用“直连模式”:在 Webhook 的接收函数里直接写 if-else 业务判断,甚至直接连上内部 CRM 的数据库执行 SQL。 这种“烟囱式”的强耦合代码,在初期或…

2026/10/15 3:02:35 阅读更多 →
Rope 模型加载失败终极指南:从报错定位到修复验证的完整教程

Rope 模型加载失败终极指南:从报错定位到修复验证的完整教程

Rope 模型加载失败终极指南:从报错定位到修复验证的完整教程 【免费下载链接】Rope GUI-focused roop 项目地址: https://gitcode.com/GitHub_Trending/ro/Rope Rope 模型加载失败可能是你初装这个工具时最常碰上的问题——Rope 是一个基于 insightface insw…

2026/10/15 3:02:35 阅读更多 →
企业微信外部群机器人开发:群内@消息应该如何单独处理

企业微信外部群机器人开发:群内@消息应该如何单独处理

在企业微信外部群的日常运营中,群聊环境极其嘈杂。如果你的机器人处于“全量监听”状态,群里每发一句闲聊,网关都会去查一次库或者请求一次大模型,不仅服务器的算力会瞬间被榨干,机器人还极易因为“乱插嘴”引发客户反…

2026/10/15 3:02:35 阅读更多 →
企业微信二次开发实战:如何把客户会话接入自己的业务后台

企业微信二次开发实战:如何把客户会话接入自己的业务后台

在私域流量的精细化运营时代,企业微信已经成为链接客户的标配触角。然而,真正的客户画像、历史工单、消费评级等核心资产,其实都沉淀在企业自有的 CRM 或 ERP 系统中。 如果仅仅停留在使用企微客户端打字聊天,或者使用粗糙的“直…

2026/10/15 3:02:35 阅读更多 →
HarmonyOS 7的API 26 破坏性变更与迁移

HarmonyOS 7的API 26 破坏性变更与迁移

我们维护的 3DGS 商品展示应用跑在 API 25 上半年了,存量代码 8000 多行。HarmonyOS 7(API 26)发布后,IDE 提示 Spatial Recon Kit 有更新,我们顺手把 compileSdkVersion 改成 26,结果编译报 47 个错。不是…

2026/10/15 3:01:35 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →