用 Java 抓取网页

我找不到任何好的基于 Java 的 web 抓取 API。我需要抓取的站点也没有提供任何 API; 我想使用一些 pageID迭代所有的网页,并在其 DOM 树中提取 HTML 标题/其他内容。

除了网页抓取还有其他方法吗?

141735 次浏览

提取标题并不困难,而且您有很多选项,在 Stack Overflow 中搜索“ Java HTML 解析器”。其中之一是

如果您知道页面结构,可以使用 DOM 导航页面,请参见 Http://jsoup.org/cookbook/extracting-data/dom-navigation

这是一个很好的图书馆,我在上一个项目中使用过它。

查看 HTML 解析器,如 TagSoup、 HTMLCleaner 或 NekoHTML。

您最好的选择是使用 SeleniumWebDriver,因为它

  1. 向编码人员提供可视化反馈(查看正在进行的抓取操作,查看其停止的位置)

  2. 精确和一致,因为它直接控制您使用的浏览器。

  3. 缓慢。不会像 HtmlUnit 那样打击网页,但有时你不想打击得太快。

    Htmlunit 很快,但是在处理 Javascript 和 AJAX 方面很糟糕。

HTMLUnit 可以用来做网页抓取,它支持调用页面,填写和提交表单。我已经在我的项目中使用了这个。这是一个很好的网页抓取 java 库。 点击此处查看更多信息

而且正如 Wadjy Essam 提到的,它使用 JSoup 作为 HMLT。是一个支持导航、表单提交和页面抓取的分级 HTTP/HTML 客户端。

Http://gistlabs.com/software/mechanize-for-java/ (这里是 gitHub 的 https://github.com/GistLabs/mechanize)

还有 JautJavaWeb 抓取和 JSON 查询 -http://jaunt-api.com

如果您希望自动抓取大量的页面或数据,那么您可以尝试 Gotz ETL

它完全是模型驱动的,就像一个真正的 ETL 工具。数据结构、任务工作流和需要抓取的页面是用一组 XML 定义文件定义的,不需要编码。可以使用带有 JSoup 的选择器或带有 HtmlUnit 的 XPath 编写查询。

你可以看看 Jwht-scraper

这是一个完整的 刮擦框架,拥有开发人员可以从 Web 刮刀中期望的所有特性:

它与(jwht-htmltopojo)[ https://github.com/whimtrip/jwht-htmltopojo ] lib 一起工作,lib 本身使用了这里其他几个人提到的 Jsoup。

它们将帮助您构建可怕的 Scraper,将 HTML 直接映射到 POJO,并在几分钟内绕过任何经典的 Scraper 问题!

希望这能帮到这里的一些人!

免责声明,我是谁开发了它,随时让我知道你的意见!

对于这种类型的任务,我通常使用 Crawller4j + Jsoup。

使用 Crawler4j,我从一个域下载页面,您可以使用正则表达式指定哪个 ULR。

使用 jsoup,我“解析”了您用 Crawler4j 搜索和下载的 html 数据。

通常您也可以使用 jsoup 下载数据,但是 Crawler4J 使得查找链接变得更加容易。 使用 Crawler4j 的另一个优点是它是多线程的,您可以配置并发线程的数量

Https://github.com/yasserg/crawler4j/wiki

通常我使用 selenium,它是用于测试自动化的软件。 你可以通过网络驱动控制浏览器,所以你不会有问题的 javascript 和它通常不会很检测,如果你使用完整的版本。可以更好地识别无头浏览器。

我是 WebScrapingAPI的一名工程师,我向您推荐我们的产品,因为我们提供了许多功能,如渲染 javascript,CSS 提取,ip 旋转,代理和其他许多你可以在这里找到,在我们的 医生。此外,我们还提供了对 Java 的支持,并且为了简化实现过程,我们的特性还提供了 Java 示例。

我们的 API 非常容易使用和初学者友好。以下面的示例为例,我们希望呈现 httpbin.org 的 javascript。可以这么简单:

HttpResponse<String> response = Unirest.get("https://api.webscrapingapi.com/v1?api_key=%7B%7Bapi_key%7D%7D&url=https%3A%2F%2Fhttpbin.org&render_js=1")
.asString();

或者一个使用住宅代理的例子:

HttpResponse<String> response = Unirest.get("https://api.webscrapingapi.com/v1?api_key=%7B%7Bapi_key%7D%7D&url=https%3A%2F%2Fhttpbin.org%2Fget&proxy_type=residential")
.asString();

最重要的是,如果您在实现方面遇到困难或遇到任何与我们的服务有关的问题,我们有一个非常有效的客户支持,随时准备介入并立即提供帮助。