我打算编写一个简单的 J2SE 应用程序来聚合来自多个 Web 源的信息。
我认为,最困难的部分是从网页中提取有意义的信息,如果它不能作为 RSS 或 Atom 提要提供的话。例如,我可能想从 stackoverflow 中提取问题列表,但我绝对不需要那个巨大的标签云或导航栏。
你会建议什么技术/图书馆?
更新/备注
- 速度并不重要——只要它可以在 10 分钟内解析大约 5MB 的 HTML。
- 这真的很简单。
我打算编写一个简单的 J2SE 应用程序来聚合来自多个 Web 源的信息。
我认为,最困难的部分是从网页中提取有意义的信息,如果它不能作为 RSS 或 Atom 提要提供的话。例如,我可能想从 stackoverflow 中提取问题列表,但我绝对不需要那个巨大的标签云或导航栏。
你会建议什么技术/图书馆?
更新/备注
您可以结合使用 HTMLParser ( http://htmlparser.sourceforge.net/ ) 和 URL#getInputStream() 来解析托管在 Internet 上的 HTML 页面的内容。
你可以看看 httpunit 是如何做到的。他们使用了几个不错的 html 解析器,一个是 nekohtml。至于获取数据,您可以使用 jdk (httpurlconnection) 内置的内容,或使用 apache
如果您想利用任何结构或语义标记,您可能想探索将 HTML 转换为 XML 并使用 XQuery 以标准形式提取信息。查看IBM developerWorks 文章中的一些典型代码,摘录如下(它们输出的是 HTML,当然,这不是必需的):
<table>
{
for $d in //td[contains(a/small/text(), "New York, NY")]
for $row in $d/parent::tr/parent::table/tr
where contains($d/a/small/text()[1], "New York")
return <tr><td>{data($row/td[1])}</td>
<td>{data($row/td[2])}</td>
<td>{$row/td[3]//img}</td> </tr>
}
</table>
您可以使用nekohtml来解析您的 html 文档。您将获得一个 DOM 文档。您可以使用 XPATH 来检索您需要的数据。
您是否考虑过利用 RSS/Atom 提要?当内容通常以可消耗的格式提供给您时,为什么要抓取内容?有一些库可用于以您能想到的任何语言使用 RSS,与尝试抓取内容相比,它对页面标记的依赖要少得多。
如果您绝对必须抓取内容,请在标记中查找微格式,大多数博客(尤其是基于 WordPress 的博客)默认都有此功能。还有一些库和解析器可用于从网页中定位和提取微格式。
最后, Yahoo Pipes等聚合服务/应用程序可以为您完成这项工作,而无需重新发明轮子。
简而言之,您可以解析整个页面并选择您需要的东西(为了速度,我建议查看 SAXParser)或通过修剪所有 HTML 的正则表达式运行 HTML ...您也可以将其全部转换为 DOM,但这会很昂贵,尤其是如果您希望获得不错的吞吐量。
你似乎想要屏幕刮。您可能希望通过每个源站点的适配器/插件编写一个框架(因为每个站点的格式会有所不同),您可以解析 html 源并提取文本。您可能会使用 java 的 io API 连接到 URL 并通过 InputStreams 流式传输数据。
如果你想用老式的方式来做,你需要用一个套接字连接到网络服务器的端口,然后发送以下数据:
GET /file.html HTTP/1.0
Host: site.com
<ENTER>
<ENTER>
然后使用Socket#getInputStream
, 然后使用 BufferedReader 读取数据,并使用您喜欢的任何内容解析数据。
如果您的“网络资源”是使用 HTML 的常规网站(而不是像 RSS 这样的结构化 XML 格式),我建议您查看HTMLUnit。
这个库虽然是针对测试的,但实际上是一个通用的“Java 浏览器”。它建立在 Apache httpclient、Nekohtml 解析器和 Rhino 之上,以支持 Javascript。它为网页提供了一个非常好的 API,并允许轻松地遍历网站。
看看这个http://www.alchemyapi.com/api/demo.html
他们返回了相当不错的结果,并且有一个适用于大多数平台的 SDK。不仅是文本提取,它们还进行关键字分析等。