ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用 Python 爬取 Hacker News 头条:python-mini-projects 之 Scrape_Hacker_News 脚本全解析

用 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),仅供参考
返回列表