从0到1写爬虫:爬取博客园文章标题+链接,BeautifulSoup解析超详细
摘要本文面向零基础读者以爬取博客园文章列表页的“标题链接”为实战目标手把手带你走完爬虫全流程。重点拆解 BeautifulSoup 的核心API与调试技巧附带DOM结构分析图、完整可运行代码及常见踩坑解决方案。不讲玄学只讲能复用的方法论。一、 为什么选博客园做第一个爬虫项目在CSDN上搜“爬虫入门”示例站点五花八门但很多并不适合新手动态渲染页面如SPA需要Selenium/Playwright门槛过高反爬严格的站点如某宝、某点评容易触发封禁挫败感强结构过于简单的站点学不到东西换个站就不会了博客园是难得的“黄金练习场”优势说明服务端渲染HTML直出requests即可获取完整内容结构规范class命名语义化CSS选择器友好反爬温和合理频率下不会封IP适合反复调试数据有价值真实技术文章爬完可直接用于RSS/知识库核心理念入门阶段的目标不是“爬到多少数据”而是建立“观察→解析→验证”的肌肉记忆。博客园恰好能让这个循环转起来。二、 动手之前先学会“看”网页90%的新手爬虫失败不是因为代码写错而是因为没看清HTML结构就急着写选择器。请务必养成“先审查后编码”的习惯。2.1 浏览器开发者工具使用要点打开博客园首页或任意分类页如https://www.cnblogs.com/按F12打开DevToolsElements面板→ 鼠标悬停文章标题观察其DOM层级Network面板→ 刷新页面确认请求是HTML文档而非JSON APIConsole面板→ 输入document.querySelectorAll(.post-item-title)预验证选择器2.2 博客园文章列表DOM结构分析经过观察博客园文章列表的典型结构如下已简化div.post-listdiv.post-itemh2.post-item-titlea[href] 文章标题文本div.post-item-summarydiv.post-item-footer关键发现每篇文章包裹在div.post-item中标题位于h2.post-item-title a标签内链接地址在a标签的href属性中该结构在首页、分类页、搜索结果页高度一致⚠️注意网站可能随时改版。本文基于2026年7月的页面结构编写若你运行时选择器失效请重新执行上述审查步骤。“会审查”比“记住选择器”重要一万倍。三、 BeautifulSoup核心API速查表BS4的API不多但新手常混淆。下面这张表覆盖了95%的使用场景方法/属性用途返回值典型用法find()查找第一个匹配节点Tag / Nonesoup.find(h2, class_title)find_all()查找所有匹配节点ResultSet (list)soup.find_all(a, hrefTrue)select()CSS选择器查找listsoup.select(div.post-item h2 a)select_one()CSS选择器查找首个Tag / Nonesoup.select_one(.title a).text/.get_text()获取标签内纯文本strtag.get_text(stripTrue)[attr]获取属性值str / Nonetag[href].get(attr, default)安全获取属性str / defaulttag.get(href, )3.1findvsselect如何选择简单条件单标签class/id→ 用find/find_all语义直观复杂层级后代、兄弟、属性组合→ 用select表达力强性能敏感→find略快无需CSS解析器但差异可忽略本文推荐统一使用select/select_one。CSS选择器是可迁移技能换了lxml/parsel也能直接用。四、 完整代码实现逐行精讲4.1 环境准备pipinstallrequests beautifulsoup4 lxmllxml作为BS4的解析后端比内置的html.parser快3-5倍且容错性更好。永远指定解析器避免警告和隐式行为。4.2 完整代码importtimeimportrandomimportrequestsfrombs4importBeautifulSoup# 配置区 TARGET_URLhttps://www.cnblogs.com/HEADERS{User-Agent:(Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36),}OUTPUT_FILEcnblogs_articles.txt# deffetch_html(url:str)-str|None: 安全获取页面HTML 返回None表示请求失败调用方需处理 try:resprequests.get(url,headersHEADERS,timeout10)resp.raise_for_status()# 非2xx状态码抛异常resp.encodingresp.apparent_encoding# 自动检测编码returnresp.textexceptrequests.RequestExceptionase:print(f[ERROR] 请求失败:{url}{e})returnNonedefparse_articles(html:str)-list[dict]: 解析文章标题与链接 核心CSS选择器 防御性取值 soupBeautifulSoup(html,lxml)articles[]# CSS选择器定位所有文章条目中的标题链接linkssoup.select(div.post-item h2.post-item-title a)fortaginlinks:titletag.get_text(stripTrue)# stripTrue去除首尾空白hreftag.get(href,)# 安全取值避免KeyErroriftitleandhref:# 过滤空数据articles.append({title:title,link:href,})returnarticlesdefsave_to_file(articles:list[dict],filepath:str):保存为可读文本格式withopen(filepath,w,encodingutf-8)asf:forartinarticles:f.write(f{art[title]}\n{art[link]}\n{-*60}\n)print(f[OK] 已保存{len(articles)}条记录至{filepath})defmain():print(f 目标:{TARGET_URL})htmlfetch_html(TARGET_URL)ifhtmlisNone:print(❌ 获取页面失败退出)returnarticlesparse_articles(html)print(f 解析到{len(articles)}篇文章)ifarticles:save_to_file(articles,OUTPUT_FILE)else:print(⚠️ 未解析到任何文章请检查页面结构是否变化)if__name____main__:main()4.3 三个容易被忽视的细节①resp.apparent_encoding而非resp.encodingrequests默认的resp.encoding仅根据HTTP头推断博客园有时返回ISO-8859-1导致中文乱码。apparent_encoding通过内容特征检测准确率远高于前者。这一行代码能消灭80%的乱码问题。②get_text(stripTrue)而非.text.strip()两者结果相同但get_text()还支持separator参数如get_text( , stripTrue)将多个子节点文本用空格连接。当标题内含span等嵌套标签时.text可能产生意外拼接。养成用get_text()的习惯未来少踩坑。③ 选择器写在独立函数中parse_articles函数的全部价值就是“把HTML变成结构化数据”。如果明天博客园改了class名你只需修改这一个函数里的选择器字符串fetch_html和save_to_file完全不动。这就是单一职责原则在爬虫中的落地。五、 调试实战选择器找不到元素怎么办这是新手最高频的问题。按以下流程图排查否是否是否是否是select返回空列表打印html[:500]确认内容非空?请求失败或被拦截检查headers/状态码DevTools中同一选择器有结果?选择器写错了重新审查DOM结构requests获取的HTML与浏览器一致?页面依赖JS渲染改用Selenium或找API编码是否正确?打印soup.prettify()检查修正encoding检查是否有iframe/shadow DOM等特殊结构实用调试技巧# 技巧1保存原始HTML到本地离线调试withopen(debug.html,w,encodingutf-8)asf:f.write(html)# 技巧2逐步缩小选择器范围print(soup.select(div.post-item))# 第1步容器是否存在print(soup.select(div.post-item h2))# 第2步h2是否存在print(soup.select(div.post-item h2 a))# 第3步a是否存在# 技巧3打印Tag对象而非仅文本观察完整属性fortaginsoup.select(div.post-item h2 a)[:3]:print(repr(tag))# repr显示完整标签包括隐藏属性黄金法则永远不要假设HTML长什么样永远用实际获取的内容验证选择器。浏览器看到的 ≠ requests拿到的这是两个完全不同的世界。六、 进阶方向从“能用”到“好用”当你跑通基础版本后可以按需叠加以下能力方向技术方案适用场景多页抓取URL分页参数 循环 随机sleep分类页、搜索结果增量去重SQLite/set记录已爬URL定时任务、长期监控异步加速aiohttp asyncio百页以上大规模抓取数据持久化pandas.to_csv / SQLAlchemy后续分析、可视化代理池requests proxies参数高频抓取防封⚠️重要提醒爬取前务必阅读博客园的 robots.txt 和使用条款。控制请求频率建议≥2秒/次仅用于个人学习研究不对服务器造成负担。合规是爬虫工程师的第一素养。七、 总结爬虫入门的正确姿势回顾全文我们实际上只做了一件事把“人眼看到的信息”翻译成“程序能提取的结构”。BeautifulSoup只是翻译工具真正的核心能力是观察力能从混乱的HTML中识别出稳定的数据模式验证习惯每一步都有据可查不靠猜测写代码工程意识代码分层、防御性编程、错误可追溯这三项能力无论你将来用BS4、parsel、lxml还是Scrapy都是通用的。别急着学框架先把一个页面吃透。当你能在10分钟内完成“审查→选择器→验证→提取”的完整闭环时你就已经入门了。参考资料BeautifulSoup官方文档requests编码处理机制详解博客园robots.txt免责声明本文代码仅供学习交流请严格遵守目标网站的使用条款和相关法律法规。作者不对任何因使用本文代码而产生的法律后果负责。如果这篇帮你理清了BS4的使用思路欢迎点赞收藏。遇到选择器问题可以在评论区贴出你的HTML片段和目标数据我会帮你分析。

相关新闻

排序算法大全:从冒泡到快排,LeetCode排序题高效解法

排序算法大全:从冒泡到快排,LeetCode排序题高效解法

排序算法大全:从冒泡到快排,LeetCode排序题高效解法 【免费下载链接】leetcode python 数据结构与算法 leetcode 算法题与书籍 刷算法全靠套路与总结!Crack LeetCode, not only how, but also why. 项目地址: https://gitcode.com/gh_mirro…

2026/10/15 19:37:37 阅读更多 →
量化回测到底卡在哪?换了本地数据之后我算明白了

量化回测到底卡在哪?换了本地数据之后我算明白了

做量化两年多了,策略写得越来越快,但回测速度反而成了瓶颈。不是策略复杂度的问题,是数据获取这个环节太拖后腿了。之前用在线API做回测,5000多只A股跑一轮日线策略,光等数据返回就要二十多分钟。遇到QPS限制更烦&…

2026/10/15 0:43:22 阅读更多 →
Logux Client与传统AJAX/GraphQL的对比:为什么选择操作日志同步?

Logux Client与传统AJAX/GraphQL的对比:为什么选择操作日志同步?

Logux Client与传统AJAX/GraphQL的对比:为什么选择操作日志同步? 【免费下载链接】client Logux base components to build web client 项目地址: https://gitcode.com/gh_mirrors/client4/client Logux Client 是构建Web客户端的Logux基础组件&a…

2026/10/15 19:54:47 阅读更多 →

最新新闻

AI科技风PPT模板:工程师的技术表达结构化接口

AI科技风PPT模板:工程师的技术表达结构化接口

简介:本资源是一份专为科技类汇报、AI主题演讲及数字化办公场景设计的高质量PPT模板,面向产品经理、技术讲师、高校师生及企业培训师等需高频制作专业演示文稿的用户,有效解决科技风视觉统一性弱、AI主题素材匮乏、内容排版效率低等痛点。压缩…

2026/10/17 13:48:47 阅读更多 →
上下文工程:比提示词工程更重要的事

上下文工程:比提示词工程更重要的事

个人主页&#xff1a;> for_ever_love__ <&#xff08;欢迎各位大佬莅临&#x1f60a;&#xff09; 其他栏目: > 大模型开发从0到1 < 其他栏目: > iOS项目总结大全 < 其他栏目: > 我想学python了 < 其他栏目: > iOS UI < 文章目录上下文工程&…

2026/10/17 13:48:47 阅读更多 →
Linux权限类项目

Linux权限类项目

项目一 在opt目录下创建嵌入式目录&#xff0c;用于安装嵌入式框架。所有者为嵌入式部门的领导张总&#xff0c;所属组为嵌入式部门&#xff0c;张总有全部的权限&#xff0c;部门其他开发有读和执行的权限&#xff0c;其他人只有读的权限。 1.创建张总账号 密码123456 赋予sud…

2026/10/17 13:48:47 阅读更多 →
yuzu Switch 模拟器 PC 安装配置完整指南:10 分钟跑通第一盘

yuzu Switch 模拟器 PC 安装配置完整指南:10 分钟跑通第一盘

yuzu Switch 模拟器 PC 安装配置完整指南&#xff1a;10 分钟跑通第一盘 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding yuzu 是一款在 PC 上运行任天堂 Switch 游戏的模…

2026/10/17 13:48:47 阅读更多 →
Chatbox从零上手:提示词技巧、插件配置与避坑指南

Chatbox从零上手:提示词技巧、插件配置与避坑指南

简介&#xff1a;面向AI对话系统初学者的Chatbox实战指南&#xff0c;以从零到进阶的完整路径帮助读者快速掌握智能对话工具&#xff0c;覆盖日常问答、创意文案、学习辅导等常见场景。文档系统拆解了注册登录、提问黄金法则、常用插件调用、个性化助手训练等核心环节&#xff…

2026/10/17 13:48:47 阅读更多 →
用Canvas实现地图中心发散曲线动画特效

用Canvas实现地图中心发散曲线动画特效

在各类数据大屏、数字孪生演示、物流配送可视化项目里&#xff0c;你一定见过这样的画面&#xff1a;地图上某个城市坐标像心脏一样脉动&#xff0c;无数条曲线从它身上向四周延展&#xff0c;像血管扩张、像信号辐射。这个效果看着唬人&#xff0c;但实现起来没有想象中复杂—…

2026/10/17 13:47:46 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介&#xff1a;《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南&#xff0c;重点围绕V3与R1两款模型的能力差异与适用场景展开&#xff0c;帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件&#xff0c;压缩包大小约311KB&#xff0c;篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介&#xff1a;这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档&#xff0c;共收录两百余条可直接套用的润色指令&#xff0c;涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度&#xff0c;并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介&#xff1a;本资源是一份基于OpenCV的本科课程设计完整报告&#xff0c;面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生&#xff0c;解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →