【问题标题】:Java Httpconnection preprocess url content for jsoup or other parser用于 jsoup 或其他解析器的 Java Httpconnection 预处理 url 内容
【发布时间】:2015-07-16 22:40:18
【问题描述】:

我有一个程序,它使用 Java HttpConnection 连接到一个 Url。输入流由 jsoup 解析。我的问题是每个 URL 大约需要 1 秒。该网页有大约12000行代码,但我只需要一个特定区域(一个div内大约500行),所以我想知道我是否可以预处理输入流并将这部分代码交给jsoup进行解析。由于我有大约 100.000 页要爬网,我无法在一天内使用一台服务器处理它。我希望一种预处理可以降低解析时间。像 50-150 毫秒。我已经检查过 jsoup 解析是瓶颈,而不是互联网连接/下载。

我会很感激任何提示。

【问题讨论】:

  • 你用的是哪个版本的jsoup?
  • 尝试升级到最新版本:1.8.2
  • 嘿 Luiggi,不幸的是,这只是通过解析获得了大约 20ms 的好处......所以我从 1000ms 下降到 980ms :) 我会尝试其他解决方案。因为我有结果,所以我会在这里发布。对于任何进一步的提示,我很高兴

标签: java parsing web-crawler jsoup httpconnection


【解决方案1】:

是的,您的解决方案当然是在正确的轨道上。

但问题是 - InputStream 中的代码块从哪里开始? 这仅取决于 HTML 文档代码。

如果它非常具体,您可以从流中读取并丢弃与块开头不匹配的字节。

您可以读取所有输入流并使用indexOf 或一些RegExp 模式(正则表达式要慢得多)。

然后在<html><body> 前面加上</body></html> 到提取的String 后面,你就可以将它供JSoup 解析了

【讨论】:

  • 哦,很高兴知道,RegExp 比 indexOf 慢得多,这节省了我的时间。好的 indexOf 我可以想象,我试图找到 div 的 startindex 和 endindex,对吗?所以我必须使用两次 indexOf 来获得一个特定的块。但是为了直接读取流并丢弃不需要的字节,我只知道当我知道哪个字节是开始和结束字节时我可以做到这一点。但我不知道如何流式传输字节,直到一个特定的字符串(在这种情况下是一个 html ID)通过......你有一个例子吗?
【解决方案2】:

我认为对于您的用例 JSoup 可能是错误的工具。您可以查看 Java 中基于 SAX 的 XML/HTML 解析器库。

良好的实现应该与开始标签的“粗暴”字符串搜索一样快,这样做的好处是可以让您停留在 HTML 语法领域。

这完全取决于,如果您需要处理的 HTML 总是包含在同一个(字面意思)标签中,那么来自 @Xeon 的方法可能会快一点。如果标签发生了一些变化,您可能会发现使用基于 SAX 的解析器会得到更好的结果。

这里有一些:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多