
本文详细说明如何在 java 生态下基于 apache nutch 1.19 正确执行网页抓取、获取原始 html 内容,并解决常见“仅存 url 无 html”问题,涵盖注入、生成、抓取、解析与导出全流程。
本文详细说明如何在 java 生态下基于 apache nutch 1.19 正确执行网页抓取、获取原始 html 内容,并解决常见“仅存 url 无 html”问题,涵盖注入、生成、抓取、解析与导出全流程。
Apache Nutch 是一个成熟、可扩展的开源网络爬虫框架,适用于大规模、分布式网页采集任务。但需明确:Nutch 默认不会将 HTML 内容直接写入文件系统(如 crawl/segments/xxx/content/ 中仅存二进制序列化数据),而是以 Hadoop SequenceFile 格式持久化抓取结果(含 HTTP 响应头、状态码、原始字节流等)。因此,若只看到 URL 列表而未见 HTML,不是抓取失败,而是尚未执行「内容提取」步骤。
以下是以 https://nutch.apache.org/ 为例(适配你的目标站点 https://www.andersondouglas.com),在 Nutch 1.19 环境下获取真实 HTML 的标准流程:
✅ 正确执行七步抓取流水线
确保已完成基础配置(尤其 conf/nutch-site.xml 中设置合法 http.agent.name,否则多数网站会拒绝请求):
<property> <name>http.agent.name</name> <value>NutchSpider/1.19</value> </property>
随后在空工作目录中依次执行:
立即学习“前端免费学习笔记(深入)”;
-
准备种子文件
echo "https://www.andersondouglas.com" > seeds.txt
-
注入种子到 CrawlDB
bin/nutch inject crawldb seeds.txt
-
生成待抓取段(segment)
bin/nutch generate crawldb segments/ # 输出类似:segments/20240522143018/ ← 记录该时间戳目录名
-
执行抓取(关键!获取 HTTP 响应体)
bin/nutch fetch segments/20240522143018/
-
(推荐)解析页面(提取 HTML、链接、元数据)
bin/nutch parse segments/20240522143018/
⚠️ 注意:即使仅需 HTML,也建议执行 parse —— 它会解码响应体、处理 Content-Encoding(如 gzip)、规范化字符集,并为后续导出做好准备。
-
查看单页 HTML 内容(调试首选)
bin/nutch readseg -get segments/20240522143018/ https://www.andersondouglas.com
输出中 Content: 字段后即为原始 HTML(已自动解码并转为 UTF-8)。
-
批量导出全部 HTML 到文本文件
bin/nutch readseg -dump segments/20240522143018/ segdump -recode
执行后,HTML 内容将按 URL 路径结构写入 segdump/dump 文件(UTF-8 编码,每页以 URL: ... 分隔),可直接用 cat segdump/dump 查看或用脚本进一步清洗。
? 关于动态内容的重要提醒
Nutch 是服务端渲染(SSR)友好型爬虫,它仅获取服务器返回的初始 HTML 响应,无法执行 JavaScript 渲染。如果你的目标字段(如车辆价格、里程)由前端 JS 异步加载(例如通过 fetch() 请求 /api/vehicle/123 后插入 DOM),则 Nutch 默认无法捕获这些动态内容。
✅ 解决方案有二:
- 优先检查网页是否提供静态替代路径:查看 Network 面板,确认是否有直接返回 JSON 的 API 接口,可绕过 Nutch,改用 HttpClient 或 OkHttp 直接调用;
- 若必须渲染 JS:应切换技术栈,选用支持浏览器自动化的工具(如 Selenium + ChromeDriver、Playwright 或 Puppeteer),或集成无头浏览器到 Nutch(需自定义 HtmlParseFilter 并嵌入 JS 执行引擎,复杂度高,不推荐初学者)。
? 最佳实践总结
- 永远先运行 readseg -get 验证单页抓取质量,再批量导出;
- 使用 -recode 参数避免乱码,确保 nutch-site.xml 中 parser.character.encoding.default 设为 UTF-8;
- 对反爬严格站点,务必配置 robots.txt 策略(http.robots.agents)、合理设置 http.timeout, http.client.timeout, fetcher.server.delay;
- 日志是调试核心:启用 log4j.logger.org.apache.nutch=DEBUG 可追踪 HTTP 状态码与重定向链。
遵循上述流程,你将稳定获得目标网页的完整 HTML 源码,为后续使用 Jsoup、XPath 或正则提取价格、里程等结构化字段奠定可靠基础。


















