网页抓取类需求非常常见,但真正能交付的脚本不能只在开发者电脑上偶尔成功一次。它至少要回答四个问题:抓哪些页面、是否允许访问、失败后如何记录、客户怎么重复运行。
我把这类需求整理成了一份公开可运行的最小样品:
- 源码与说明:https://github.com/jhhjwei/codex-runner/tree/main/demos/public-web-text-scraper
- 面向公开、无需登录的普通网页
- 检查
robots.txt - 默认只跟随同域链接
- 可配置最大页数、访问间隔和超时时间
- 输出 URL、标题、正文、状态和错误到 CSV/JSON
一、先限制范围,再开始抓取
很多抓取脚本的问题不是解析失败,而是边界没有定义。一个起始页面可能包含外部链接、下载链接、登录页和无限分页。如果程序见链接就跟,很容易跑出预期范围。
样品使用 JSON 配置明确约束:
{"start_urls":["https://example.com/"],"same_domain_only":true,"max_pages":5,"delay_seconds":1.0,"timeout_seconds":20}same_domain_only防止爬虫跳到外部站点,max_pages提供明确停止条件,访问间隔则避免在短时间内向目标站点发送过多请求。真实项目还可以加入路径白名单,例如只允许/docs/或/help/下的页面。
二、把站点规则当成程序输入
公开可访问不等于可以无限制抓取。程序会根据目标域名读取robots.txt,若规则不允许当前 User-Agent 访问某个 URL,就记录为blocked_by_robots,而不是尝试绕过。
待访问 URL -> 检查协议与域名 -> 查询 robots.txt -> 获取 HTML -> 校验 Content-Type -> 提取标题、正文和链接 -> 写入结果或错误记录这份样品不处理登录、验证码、付费墙或访问控制。需要身份验证的数据,只能在客户明确拥有权限并提供合规测试环境时另行设计。
三、正文提取不能把脚本和样式一起保存
直接读取 HTML 的全部文本,经常会混入 JavaScript、CSS、导航噪声和隐藏内容。样品基于 Python 标准库的HTMLParser,跳过script、style、noscript和svg等标签,并合并可见文本。
每个页面最终产生一条结构化记录:
{"url":"https://example.com/guide","title":"Getting Started","text":"...","status":"ok","error":""}若页面超时、返回非 HTML 内容或解析失败,程序仍保留 URL、状态和错误原因。这样客户能区分“页面没有内容”和“程序没有成功访问”。
四、用离线测试验证核心逻辑
网络测试容易受外部站点波动影响,因此样品的自动测试不访问互联网,而是验证两部分确定性逻辑:
- HTML 中的标题、正文和链接是否正确提取;
- 同域限制、协议过滤和 URL 标准化是否正确。
运行方式:
cddemos/public-web-text-scraper python-munittest-v真正交付前,还应在客户允许的目标站点上做小样本验收,并确认字符编码、分页方式、字段完整率和重复数据处理方式。
五、真实项目可以怎样扩展
基于这份骨架,常见扩展包括:
- 指定 CSS/XPath 字段;
- 下载 PDF 与文本附件;
- 增量抓取与内容去重;
- JavaScript 渲染页面支持;
- Windows 图形界面或可执行文件;
- 定时运行、结构化日志和有限重试;
- 输出到数据库、Excel 或内部 API。
报价前,需要客户提供目标 URL、字段清单、预计页数、运行频率和验收样例。对于公开、范围清晰的小任务,可以先做 3–5 个页面的最小验证,再扩展到完整范围。
需要类似工具,可以通过下面的入口提交公开 URL、脱敏样例和期望输出,我会先免费判断可行性:
https://github.com/jhhjwei/codex-runner/issues/new?template=code-fix-request.yml
📌 本文从范围限制、站点规则、正文提取和离线测试四个方面,搭建了公开网页文本抓取器的可交付骨架。
💬 你在网页文本采集中,最常遇到的是分页、动态渲染、字段变化还是内容去重问题?
👉 关注《Python 自动化接单实战》,下一篇继续处理 PDF 文本与表格提取中的版式边界。
参考来源
- Dev.to|6 Open Source Tools That Give You the Web Back
- Hacker News|Removing React.js and adapting htmx