尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
公众号历史文章归档:Python抓取+静态博客+全文检索实战
1. 从“翻历史文章翻到崩溃”说起这个博客到底解决了什么问题关注了几百个公众号的人应该都有这种体验某天突然想起半年前看过一篇特别好的文章想找出来重新读一遍结果打开公众号历史消息手指往下滑了五分钟加载转圈圈滑到一半还闪退了。再想精确找到某一天的文章基本等于大海捞针。公众号自带的搜索功能只能搜标题关键词而且搜索结果的排序逻辑一直是个谜搜出来的东西经常驴唇不对马嘴。我搭这个博客的出发点特别朴素把公众号的历史文章全部抓下来转成静态页面部署到自己的服务器上然后加一个按日期检索的功能。这样我想看哪天的文章直接选日期或者输入关键词一秒定位不用再跟那个卡顿的历史消息列表较劲。这个项目适合什么人参考如果你有基本的命令行操作能力懂一点 Python 或者 Shell 脚本有自己的服务器或者能跑 Docker 的环境那就可以直接抄作业。如果你完全不懂技术也没关系我会把每一步的原理和操作都讲清楚你照着做也能跑起来。核心关键词就几个博客搭建、脚本抓取、Excel 整理、PDF 备份、批量下载整条链路我都会拆开讲。需要提前说明的是这个方案的本质是“个人阅读归档”抓下来的内容只放在自己的服务器上自己看不要公开传播这一点后面还会反复强调。2. 整体方案设计与技术选型为什么不用现成的工具2.1 为什么选择“自建博客”而不是“收藏夹笔记软件”市面上做文章收藏的工具不少笔记软件、稍后读应用、浏览器书签我都试过。它们的问题在于第一数据不在自己手里哪天服务停了或者开始收费你收藏的东西就悬了第二检索能力有限大部分工具只能按标题搜没法按“发布日期关键词”组合筛选第三排版还原度差公众号文章里的图片、代码块、表格复制到笔记软件里经常乱掉。自建博客的好处是数据完全本地化检索逻辑自己定排版想怎么调就怎么调。而且静态博客的加载速度极快几千篇文章的索引也就几百 KB搜索响应基本在毫秒级。代价就是前期要花点时间搭环境、写脚本但这是一次性投入后面就是纯享受。2.2 技术栈选型Python 静态站点生成器 轻量检索整个链路我拆成了四段抓取、清洗、生成、检索。抓取环节用 Python 写脚本因为 Python 的 requests 和 BeautifulSoup 处理 HTML 解析最顺手社区资料也多遇到问题好查。清洗环节把抓下来的 HTML 去掉广告、推荐阅读、二维码这些噪音只保留正文、图片和代码块。生成环节用静态站点生成器把清洗后的内容渲染成 HTML 页面我选的是轻量级的方案不依赖数据库纯文件驱动。检索环节用客户端 JavaScript 做全文索引配合日期筛选不需要后端服务。为什么不直接爬下来存成 PDF 就完事因为 PDF 的检索体验太差了你没法在 PDF 里做跨文章的全文搜索也没法按日期快速跳转。PDF 适合做冷备份日常阅读还是网页体验最好。所以我的方案是网页做日常检索阅读PDF 做归档备份Excel 做元数据管理三者各司其职。2.3 数据存储结构Excel 做索引文件夹做内容抓下来的每篇文章我会在 Excel 里记一行元数据标题、发布日期、原文链接、本地路径、字数、是否含代码块。这个 Excel 文件就是整个博客的“总目录”后面生成检索索引、做统计分析、批量导出 PDF全都依赖它。内容文件按日期分文件夹存放比如2024/03/15/文章标题.html这样即使不用检索功能直接翻文件夹也能按时间线找到文章。图片单独放在assets目录下用文章 ID 做前缀避免重名。提示Excel 里的日期字段一定要统一格式建议用YYYY-MM-DD否则后面做排序和筛选的时候会出各种幺蛾子。我一开始用了2024/3/5这种格式结果排序全乱了后来批量替换才修好。3. 核心环节实操从抓取到生成博客的完整流程3.1 抓取脚本怎么写请求头、分页、去重三个关键点抓取公众号历史文章核心是拿到文章列表和每篇文章的正文。列表页通常是分页加载的每页大概 10 到 20 条需要循环请求直到没有更多数据。这里有几个坑我踩过直接说结论。第一请求头必须带User-Agent和Referer否则服务器直接返回 403。第二分页请求之间要加延时我设的是 2 到 3 秒随机太快了会被限流太慢了抓几千篇要等到天荒地老。第三去重逻辑要做在写入之前用文章的唯一 ID 或者标题日期做哈希已经抓过的直接跳过这样脚本中断后可以断点续抓。下面是一个简化的抓取脚本骨架用 Python 写的import requests import time import random import hashlib import os from bs4 import BeautifulSoup HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Referer: https://mp.weixin.qq.com/ } def fetch_page(url): resp requests.get(url, headersHEADERS, timeout15) resp.raise_for_status() return resp.text def parse_article_list(html): soup BeautifulSoup(html, html.parser) items [] for link in soup.select(.article-list-item): title link.select_one(.title).get_text(stripTrue) href link.get(href) date link.select_one(.date).get_text(stripTrue) items.append({title: title, url: href, date: date}) return items def save_article(article): uid hashlib.md5(article[url].encode()).hexdigest()[:12] path fcontent/{article[date].replace(-, /)}/{uid}.html if os.path.exists(path): return False html fetch_page(article[url]) soup BeautifulSoup(html, html.parser) body soup.select_one(#js_content) if not body: return False os.makedirs(os.path.dirname(path), exist_okTrue) with open(path, w, encodingutf-8) as f: f.write(str(body)) return True def main(): page 1 while True: url fhttps://mp.weixin.qq.com/mp/profile_ext?actionhomepage{page} html fetch_page(url) articles parse_article_list(html) if not articles: break for art in articles: saved save_article(art) if saved: print(f已保存: {art[title]}) time.sleep(random.uniform(2, 3)) page 1 if __name__ __main__: main()这个脚本只是骨架实际运行需要根据具体的页面结构调整选择器。重点是理解逻辑列表分页循环、每篇延时、写入前去重。3.2 内容清洗去掉广告和推荐只留正文抓下来的 HTML 里混着大量噪音文末的推荐阅读、公众号二维码、广告卡片、关注引导。这些东西如果不清理生成出来的博客页面会非常臃肿检索的时候也会把广告文案搜出来干扰结果。我的清洗策略是“白名单”思路只保留正文容器内的p、img、pre、code、table、blockquote这些标签其他一律删掉。图片的src要替换成本地路径同时把图片文件下载到assets目录。代码块要保留原有的class属性这样语法高亮才能正常工作。清洗完之后我会把纯文本内容提取出来算一个字数写进 Excel 的元数据里。这个字数后面做统计分析和检索排序都用得上。3.3 生成静态博客模板渲染与日期归档清洗后的 HTML 是“裸”的需要套上博客的模板才能变成完整的页面。我用的是简单的模板替换方案每个文章页面套同一个模板变量包括标题、日期、正文、原文链接。首页生成一个按日期倒序的文章列表侧边栏放日期归档和搜索框。日期归档的逻辑是遍历 Excel 里所有文章的日期按年月分组生成/archive/2024/03/这样的路径每个路径下列出该月所有文章。这样用户想找某个月的文章直接点归档链接就行不需要搜索。生成过程用 Python 脚本跑一遍几千篇文章大概几十秒就能全部渲染完。生成的静态文件直接扔到 Nginx 的目录下或者用 Docker 跑一个轻量 Web 服务器访问速度飞快。3.4 检索功能实现客户端全文索引检索是这个博客的核心价值。我的实现方案是在生成阶段把所有文章的标题、日期、纯文本内容提取出来生成一个 JSON 索引文件大概每篇文章占 1 到 2 KB几千篇文章的索引也就几 MB。前端页面加载这个 JSON用 JavaScript 做全文匹配。匹配逻辑支持三种模式按日期精确筛选、按关键词模糊搜索、两者组合。关键词搜索用的是简单的包含匹配加权重排序标题命中的权重高于正文命中日期越新的权重略高。虽然没有 Elasticsearch 那么强大但对于个人博客几千篇文章的规模完全够用而且零后端依赖部署极其简单。注意索引文件不要包含全文只包含标题和摘要就够了否则 JSON 文件会太大首次加载变慢。我的做法是正文只取前 200 字做摘要完整内容在点击结果后再加载。4. 批量下载与 PDF 归档Excel 和脚本的配合打法4.1 用 Excel 管理下载队列抓取和清洗完成后Excel 里已经有了完整的文章清单。接下来做 PDF 归档我的做法是在 Excel 里加一列“PDF状态”标记哪些已经导出、哪些还没导。然后用 Python 脚本读取 Excel遍历未导出的文章逐篇生成 PDF。Excel 在这里的作用是“任务队列”和“进度看板”。你可以随时打开 Excel 看进度也可以手动调整某些文章的优先级比如把重要的文章标成“优先导出”脚本就会先处理这些。4.2 PDF 生成方案从 HTML 到 PDF 的转换HTML 转 PDF 我试过几种方案。浏览器打印方案效果最好但需要模拟浏览器环境资源占用大。wkhtmltopdf 轻量但对 CSS 的支持有限复杂的排版会乱。最后我选的是 Playwright 驱动 Chromium 做页面渲染再导出 PDF排版还原度最高代码块和表格都能正确显示。导出的时候要注意页面尺寸和边距设置。我用的是 A4 纸张上下边距 20mm左右 15mm页眉页脚关掉背景图形打开否则代码块的背景色会丢失。每篇文章导出大概需要 2 到 3 秒几千篇文章跑一晚上就差不多了。4.3 批量下载的通用思路队列、重试、日志批量下载这件事不管是下载文章、下载图片还是下载 PDF核心逻辑都是一样的任务队列 失败重试 日志记录。队列用 Excel 或者 CSV 维护脚本逐行读取成功就标记完成失败就记录错误原因下次运行自动跳过已完成的重试失败的。日志一定要写而且要写清楚时间、任务 ID、成功还是失败、失败原因。我一开始没写日志脚本跑了一半崩了完全不知道哪些成功了哪些没成功只能全部重跑浪费了好几个小时。后来加了日志每次运行完看一眼日志就知道情况省心很多。环节工具关键参数注意事项抓取Python requests延时 2-3 秒带 User-Agent 和 Referer清洗BeautifulSoup白名单标签图片要本地化生成模板引擎日期归档路径索引文件控制大小检索JavaScript标题权重高于正文摘要限 200 字PDFPlaywrightA4 纸张背景图形要打开队列Excel状态列日志必须写5. 常见问题与排查技巧实录5.1 抓取被限流怎么办最常见的报错就是请求返回 403 或者 429。403 通常是请求头不对检查User-Agent和Referer是否完整。429 是请求太频繁把延时调大或者换一个时间段再跑。我的经验是晚上跑比白天稳可能是因为晚上服务器负载低。如果连续多次被限流建议停几个小时再试不要硬刚。硬刚的结果可能是 IP 被临时封禁得不偿失。5.2 图片下载失败怎么处理图片下载失败的原因通常是图片链接有防盗链或者链接过期了。处理办法是在请求图片的时候也带上Referer并且把失败的图片链接记录下来后面单独重试。如果图片确实已经失效就在页面上留一个占位图不要因为一张图片导致整篇文章生成失败。5.3 检索结果不准确怎么调检索不准确通常是因为索引里混入了噪音比如广告文案、推荐阅读的标题。解决办法是在清洗阶段把噪音彻底去掉索引只基于正文内容生成。另外关键词匹配的时候可以做一下同义词扩展比如搜“脚本”也能匹配到“script”但这个要看具体需求不是必须的。5.4 脚本报错“无法将 npm 项识别为 cmdlet”怎么解决这个报错在 Windows 上很常见原因是 Node.js 没有装或者环境变量没配好。解决办法是重新安装 Node.js安装的时候勾选“Add to PATH”装完重启终端。如果还是不行手动把 Node.js 的安装路径加到系统环境变量的 Path 里。5.5 常见问题速查表问题现象可能原因解决办法请求返回 403请求头缺失补全 User-Agent 和 Referer请求返回 429请求太频繁增大延时换时间段图片显示裂图防盗链或链接过期带 Referer 请求失败重试检索结果含广告清洗不彻底白名单过滤只留正文PDF 排版错乱CSS 支持不足换 Playwright 渲染脚本中断后重跑慢没有去重写入前做哈希去重Excel 日期排序乱日期格式不统一统一用 YYYY-MM-DDnpm 命令找不到环境变量未配置重装 Node.js 并加 PATH6. 一些实操心得和后续扩展方向这个博客搭好之后我最大的感受是检索体验的提升是指数级的。以前找一篇文章要五分钟现在五秒钟。而且因为数据都在自己手里我可以随便做统计分析比如看看哪个月写得多、哪些关键词出现频率高这些都是现成工具给不了的。后续我打算加两个功能。一个是全文搜索的高亮显示现在搜索结果只显示标题和摘要点进去才能看到正文如果能在搜索结果里直接高亮关键词会更方便。另一个是自动生成年度归档 PDF把一年的文章合并成一个 PDF 文件方便离线阅读和长期保存。还有一个小心得脚本一定要模块化抓取、清洗、生成、导出各管各的不要写成一个几千行的大脚本。模块化的好处是哪个环节出问题就单独调试哪个环节不用每次都从头跑一遍。我一开始图省事写了一个大脚本结果调试的时候每次都要重新抓一遍浪费了大量时间。拆成模块之后清洗逻辑改了只需要重跑清洗生成逻辑改了只需要重跑生成效率高很多。最后说一句关于数据安全的事。抓下来的文章只放在自己的服务器上不要公开部署到公网不要分享给其他人。这个方案的定位是个人阅读归档自己看没问题传播出去性质就变了。这一点一定要记住。
RELATED

相关推荐

CMake 3.26.6 Windows x86_64 安装与配置实战指南

CMake 3.26.6 Windows x86_64 安装与配置实战指南

简介:本资源为 CMake 3.26.6 官方 Windows 64 位命令行工具完整安装包,面向 C/C 开发者、跨平台项目构建工程师及初学者,用于替代 Visual Studio 内置构建系统或配合 Ninja/MSVC 等后端生成构建脚本,解决多平台项目配置、依赖管理…

📅 2026/9/25 1:51:07
Spring Boot 2.6.13 + MySQL 8 + Flowable 6.8.1 集成部署与避坑实战

Spring Boot 2.6.13 + MySQL 8 + Flowable 6.8.1 集成部署与避坑实战

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

📅 2026/9/25 1:51:07
Console线选型与排障:CH340与FTDI芯片性能深度对比

Console线选型与排障:CH340与FTDI芯片性能深度对比

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

📅 2026/9/25 1:51:07
MORE NEWS

更多资讯

📰

基于企业微信API的Python智能聊天机器人开发实践指南

简介:这是一份基于Python的微信智能聊天机器人完整源码,适合Python开发者、AI应用爱好者及需要搭建个人/企业微信机器人的技术人员。项目整合了GPT-3.5、GPT-4、Claude、文心一言、讯飞星火等多款大模型,支持私聊与群聊多轮上下文记忆&#x…

📰

MoneyPrinterTurbo 使用指南:3 步部署,AI 短视频一键生成

MoneyPrinterTurbo 使用指南:3 步部署,AI 短视频一键生成 【免费下载链接】MoneyPrinterTurbo 利用 AI 大模型和自动化工作流,根据主题或关键词一键生成高清短视频。Generate HD short videos from a topic or keyword with an automated AI …

📰

Umi-OCR离线OCR:解压即用,免费图片转文字

Umi-OCR离线OCR:解压即用,免费图片转文字 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言…

📰

Django+vue3实现的webssh

实现功能:添加主机设备删除主机设备条件筛选设备更新主机设备进入webssh界面效果展示后端运行:1.创建虚拟环境python -m venv venv2.激活虚拟环境cd /venv/Script./activate3.安装依赖包pip install -r requirements.txt -i https://pypi.tuna.tsinghua.…

📰

安路TD与Modelsim联合仿真避坑指南:IP核编译与波形调试

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

📰

吴恩达机器学习作业实战指南:无答案版校准+答案版反向工程

简介:本资源是面向机器学习初学者与自学者的吴恩达《Machine Learning》课程配套实践套件,覆盖课程全部核心算法实验,助力系统掌握监督学习、无监督学习与降维等关键内容。压缩包共1028个文件,总计202.33MB,包含623个M…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬