用 Python 爬取 Hacker News 头条:python-mini-projects 之 Scrape_Hacker_News 脚本全解析
示例工程【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址https://gitcode.com/gh_mirrors/py/python-mini-projects点击查看免费下载导读本文围绕 python-mini-projects 仓库中的 Scrape_Hacker_News 项目 展开深入讲解如何使用一个纯 Python 脚本批量抓取 Hacker Newsnews.ycombinator.com多页头条新闻并将其标题、排名、来源、作者、得分与发布时间等字段整理为本地文本文件。读完本文你将掌握基于requestsBeautifulSoup的轻量爬虫写法、SoupStrainer解析性能优化技巧以及一个带输入校验与异常兜底的命令行爬虫的完整实现思路。一、项目定位与文档导读Hacker News 是知名技术社区其首页按热度聚合了大量技术新闻与讨论帖。手动翻页复制信息效率低下因此该仓库中的 Scrape_Hacker_News 项目提供了一个极简脚本让用户一次抓取多页首页内容并落地为结构化文本。关联文档 明确指出两点核心信息项目功能A script that scrapes a number of pages from HackerNews即“抓取 Hacker News 的若干页面”运行方式run python main.pyin commandline即进入项目目录后在命令行直接执行python main.py。整个项目只有两个文件README.md 与 main.py结构极其精简非常适合作为入门级网页抓取示例来阅读。仓库根目录的 README.md 项目索引中也将该项目列为 HackerNews Scrapper由作者 Javokhirbek 贡献。二、环境准备与依赖安装脚本依赖两个第三方库依赖仓库锁定的版本见 requirementsALL.txt作用requests2.23.0发起 HTTP 请求获取 Hacker News 页面 HTMLbeautifulsoup44.9.1解析 HTML提取新闻条目字段项目目录下未单独提供requirements.txt可参考仓库根目录的 requirementsALL.txt 安装pip install requests beautifulsoup4建议在 Python 3 环境下运行。由于脚本会向https://news.ycombinator.com/发起请求运行环境需要具备正常的外网访问能力若处于受限网络请求会失败并触发下文介绍的异常处理逻辑。三、运行方法与交互流程3.1 基本运行按文档说明进入项目目录后直接运行cd projects/Scrape_Hacker_News python main.py程序启动后会进入一个交互式命令行循环main.py依次询问两个问题Enter number of pages that you want the HackerNews for (max 20):—— 输入要抓取的页数最大值 20Want verbose output y/[n] ?—— 是否开启详细输出模式输入y开启回车或输入其他内容默认不开启v.lower().startswith(y)判断因此Y、Yes等以y开头的输入也会被接受。3.2 输入校验机制脚本对用户输入做了双重保护页数上限钳制无论用户输入多大的数字程序都会先打印提示A maximum of only 20 pages can be fetched然后通过pages min(pages, 20)将实际抓取页数钳制在 20 页以内避免对目标站点造成过大请求压力非整数输入兜底若输入的不是正整数int()会抛出ValueError被外层while循环捕获并打印Invalid input, probably not a positive integer随后continue重新询问而不是直接崩溃退出。3.3 执行与输出确认输入后脚本以for page_no in range(1, pages 1)的顺序逐页调用fetch(page_no, verbose)main.py。开启 verbose 时每一页开始抓取前会在控制台打印Fetching Page N...。所有结果写入当前工作目录下的HackerNews/文件夹每个页面生成一个独立文件命名格式为NewsPage{页码}.txtmain.py。目录不存在时会自动创建main.pyif not os.path.exists(os.path.join(os.getcwd(), HackerNews)): os.makedirs(os.path.join(os.getcwd(), HackerNews))因此运行结束后目录结构大致如下Scrape_Hacker_News/ ├── README.md ├── main.py └── HackerNews/ ├── NewsPage1.txt ├── NewsPage2.txt └── ...四、源码级解析fetch函数如何工作核心抓取逻辑全部封装在fetch(page_no, verboseFalse)函数中main.py按以下步骤执行4.1 参数校验与 URL 构造if page_no 0: raise ValueError(Number of Pages must be greater than zero) page_no min(page_no, 20)函数入口先做防御性校验页码必须大于 0且再次钳制到 20。随后构造请求 URLres requests.get(https://news.ycombinator.com/?p str(i))Hacker News 的首页分页参数为?pN第 1 页即https://news.ycombinator.com/?p1。从源码结构看该设计将“页码”作为唯一入参作者在注释中也明确说明这是为将来加入多进程multiprocess支持预留的接口main.py即每个页面天然可以并行抓取。4.2 用SoupStrainer缩小解析范围only_td SoupStrainer(td) soup BeautifulSoup(res.content, html.parser, parse_onlyonly_td)这是本脚本最有价值的一个性能细节SoupStrainer(td)告诉 BeautifulSoup只解析 HTML 中的td表格单元格标签其余节点全部丢弃。因为 Hacker News 的页面布局基于表格table/tbody/tr/td新闻条目内容全部位于td中所以这样既保留了所需信息又显著减少了构建解析树的开销是应对大 HTML 文档的常用优化手段。4.3 字段提取与页面结构对应脚本通过两组 CSS 类名定位新闻条目main.py提取目标选择器说明排名td.title[alignright]下的span.rank形如 1.输出时会被去除句点标题td.title下的a.storylink新闻标题文本链接a.storylink的href目标网址来源站点span.sitestr标题旁的域名如github.com得分span.score如 120 points发布时间span.age如 2 hours ago作者a.hnuser提交者用户名值得注意的两个实现细节标题与排名的去重页面中td.title既包含新闻标题也包含排名单元格td.title[alignright]脚本通过列表推导[t for t in tdtitle if t not in tdrank]将排名单元格从标题列表中剔除只保留真正的标题tdmain.py相对链接补全Hacker News 条目分站外链接与站内链接两类。脚本对href做判断——以https开头的直接使用否则拼接为https://news.ycombinator.com/ hrefmain.py确保所有链接都是可访问的完整 URL。4.4 输出文件格式每个新闻条目的落盘格式如下main.py------------------------------------------------------------------------------- Article Number: 1 Article Title: 标题 Source Website: 域名或 news.ycombinator.com Source URL: 完整链接 Article Author: 用户名 Article Score: 得分 Posted: 相对时间 -------------------------------------------------------------------------------文件开头会先写入一行-组成的 80 字符分隔线与Page N标识main.py。所有字段均做了空值兜底——当某个字段无法解析到时会输出Could not get article number、Not Scored等占位文案而不是抛出异常保证单条数据缺失不影响整页结果落盘。五、异常处理与稳定性设计网络爬虫最容易遇到的就是请求失败脚本对此做了分级兜底main.pyexcept (requests.ConnectionError, requests.packages.urllib3.exceptions.ConnectionError) as e: print(Connection Failed for page {}.format(i)) except requests.RequestException as e: print(Some ambiguous Request Exception occurred. The exception is str(e))连接级异常如 DNS 解析失败、连接被拒绝单独捕获打印Connection Failed for page N更宽泛的requests.RequestException作为第二道防线打印具体异常信息兜住超时、HTTP 状态错误等其他请求异常。值得注意的是异常处理发生在函数内部而非调用处因此某一页抓取失败不会中断后续页面的抓取流程其余页面仍会正常完成体现了一个小型爬虫应有的容错意识。六、局限性与扩展方向从源码结构看分页上限硬编码min(page_no, 20)的 20 页上限写死在两处函数内与交互输入处若需抓取更多页需修改源码中的常量输出格式固定当前以纯文本txt形式落盘字段间用固定文案分隔后续可扩展为 CSV/JSON 以便数据分析未引入限速与重试脚本未实现请求间隔控制与自动重试批量抓取大规模页面时建议自行补充time.sleep与重试策略以遵守目标站点的访问规范并发预留正如源码注释所述fetch以页码为唯一入参天然适合用concurrent.futures或multiprocessing改造为并行抓取这是该项目最有价值的扩展点。七、相关文件索引项目说明文档运行方式与作者信息核心实现 main.py完整的抓取、解析、落盘与异常处理逻辑仓库依赖清单 requirementsALL.txtrequests与beautifulsoup4的锁定版本仓库项目索引python-mini-projects 中 HackerNews Scrapper 的条目位置结语Scrape_Hacker_News 是一个麻雀虽小、五脏俱全的爬虫示例它用不到一百行代码完整演示了「请求页面 → 按需解析 → 字段抽取 → 本地落盘 → 异常兜底」的标准流程其中的SoupStrainer局部解析与页面元素定位思路可以直接迁移到其他表格型布局的站点抓取任务中。对照 main.py 逐行阅读是快速建立网页抓取实战感的高性价比方式。赞分享示例工程【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址https://gitcode.com/gh_mirrors/py/python-mini-projects点击查看免费下载相关推荐python-mini-projects 之 Compute_IoU手写 Intersection over Union 计算脚本实战python mini projects 之 Compute_IoU手写 Intersection over Union 计算脚本实战 IoUInterse示例工程python-mini-projects 实战用 Python xmltodict 将 XML 高效转换为 JSONConvert_XML_To_JSON 全解析python mini projects 实战用 Python xmltodict 将 XML 高效转换为 JSONConvert_XML_To_JSO示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

构建开放研究工作流:从选题到发布的开源工具指南

构建开放研究工作流:从选题到发布的开源工具指南

“OpenResearch”这个词,我问了身边好几个做科研的朋友,第一反应都是“哦,开放研究嘛,就是论文开源、数据公开”。但如果你真的动手去搭过一套开放研究的工作流,就会知道事情远没那么简单:文献从哪管理、数…

2026/9/21 1:40:54 阅读更多 →
OpenClaw、Claude Code、Codex CLI、Hermes Agent四款AI Agent横评与选型指南

OpenClaw、Claude Code、Codex CLI、Hermes Agent四款AI Agent横评与选型指南

最近我手上的活儿几乎都变成了同一个模式:先让 Agent 跑一遍,我再接手改。AI 编程工具和个人助手 Agent 爆发的速度太快,后台问得最多的就是 OpenClaw、Hermes Agent、Claude Code、Codex CLI 这四款到底该用哪个。这篇文章就来自我这几个月实…

2026/9/21 1:39:53 阅读更多 →
lightweight-charts 调试沙箱完全指南:基于 debug 目录搭建本地开发与试验环境

lightweight-charts 调试沙箱完全指南:基于 debug 目录搭建本地开发与试验环境

lightweight-charts 调试沙箱完全指南:基于 debug 目录搭建本地开发与试验环境 【免费下载链接】lightweight-charts Performant financial charts built with HTML5 canvas 项目地址: https://gitcode.com/gh_mirrors/li/lightweight-charts 本文围绕 debug/…

2026/9/21 1:39:53 阅读更多 →

最新新闻

Android性能优化实战:冷启动、内存与卡顿排查全解析

Android性能优化实战:冷启动、内存与卡顿排查全解析

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

2026/9/21 3:01:39 阅读更多 →
Roc 快照测试剖析:格式化器如何保留记录字段注解中的 var 关键字

Roc 快照测试剖析:格式化器如何保留记录字段注解中的 var 关键字

Roc 快照测试剖析:格式化器如何保留记录字段注解中的 var 关键字 【免费下载链接】roc A fast, friendly, functional language. 项目地址: https://gitcode.com/GitHub_Trending/ro/roc 本篇以 Roc 编译器仓库中的快照测试文件 fmt_var_in_record_field.md …

2026/9/21 3:01:39 阅读更多 →
gatsby-source-wordpress 预览(Preview)机制完全指南:配置、运行原理与源码级解析

gatsby-source-wordpress 预览(Preview)机制完全指南:配置、运行原理与源码级解析

前端静态站点Web框架 【免费下载链接】gatsby React-based framework with performance, scalability, and security built in. 项目地址: https://gitcode.com/gh_mirrors/ga/gatsby 点击查看 免费下载 导读 本文基于 packages/gatsby-source-wordpress/src/step…

2026/9/21 3:01:39 阅读更多 →
Gatsby 中的 JavaScript 数据源实践:使用 gatsby-transformer-javascript-frontmatter 构建混合内容站点

Gatsby 中的 JavaScript 数据源实践:使用 gatsby-transformer-javascript-frontmatter 构建混合内容站点

Gatsby 中的 JavaScript 数据源实践:使用 gatsby-transformer-javascript-frontmatter 构建混合内容站点 【免费下载链接】gatsby React-based framework with performance, scalability, and security built in. 项目地址: https://gitcode.com/gh_mirrors/ga/ga…

2026/9/21 3:01:39 阅读更多 →
Sails HTTP 核心钩子(Core Hook)深入解析:HTTP 服务器启动、中间件栈绑定与配置

Sails HTTP 核心钩子(Core Hook)深入解析:HTTP 服务器启动、中间件栈绑定与配置

Sails HTTP 核心钩子(Core Hook)深入解析:HTTP 服务器启动、中间件栈绑定与配置 【免费下载链接】sails Realtime MVC Framework for Node.js 项目地址: https://gitcode.com/gh_mirrors/sa/sails Sails 是一个面向 Node.js 的实时&am…

2026/9/21 3:01:38 阅读更多 →
3招搞定电商图片助手源码下载让官网流量翻3倍

3招搞定电商图片助手源码下载让官网流量翻3倍

3招搞定电商图片助手源码下载让官网流量翻3倍 网站做好了没人访问,这简直是每个建站项目上线后的噩梦。你花了几万块做的精美页面,打开一看,后台数据一片惨淡,访客量个位数。别急,这通常不是设计问题,而是你没给搜索引擎递对“投名状”。…

2026/9/21 3:01:38 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →