21

我想为实验制作一个基于 Java 的网络爬虫。我听说如果这是您的第一次,那么用 Java 制作 Web Crawler 是不错的选择。但是,我有两个重要的问题。

  1. 我的程序将如何“访问”或“连接”到网页?请作简要说明。(我了解从硬件到软件的抽象层的基础知识,这里我对Java抽象感兴趣)

  2. 我应该使用哪些库?我假设我需要一个用于连接网页的库、一个用于 HTTP/HTTPS 协议的库和一个用于 HTML 解析的库。

4

12 回答 12

15

Crawler4j 是最适合您的解决方案,

Crawler4j是一个开源的 Java 爬虫,它提供了一个简单的 Web 爬虫界面。5分钟搞定一个多线程网络爬虫!

参观。了解更多基于 Java 的网络爬虫工具和每个工具的简要说明。

于 2012-11-18T01:46:19.430 回答
11

这就是您的程序“访问”或“连接”到网页的方式。

    URL url;
    InputStream is = null;
    DataInputStream dis;
    String line;

    try {
        url = new URL("http://stackoverflow.com/");
        is = url.openStream();  // throws an IOException
        dis = new DataInputStream(new BufferedInputStream(is));

        while ((line = dis.readLine()) != null) {
            System.out.println(line);
        }
    } catch (MalformedURLException mue) {
         mue.printStackTrace();
    } catch (IOException ioe) {
         ioe.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException ioe) {
            // nothing to see here
        }
    }

这将下载html页面的源代码。

对于 HTML 解析,请参阅

还要看看jSpiderjsoup

于 2012-07-01T13:51:35.860 回答
6

现在包含许多基于 Java 的 HTML 解析器,支持访问和解析 HTML 页面。

这是带有基本比较的 HTML 解析器的完整列表。

于 2014-11-24T07:40:19.060 回答
4

对于解析内容,我使用的是Apache Tika

于 2012-12-10T14:37:22.487 回答
4

如果您想了解如何完成,请查看这些现有项目:

典型的爬虫过程是一个循环,包括获取、解析、链接提取和输出处理(存储、索引)。虽然魔鬼在细节中,即如何“礼貌”和尊重robots.txt、元标记、重定向、速率限制、URL 规范化、无限深度、重试、重访等。

Norconex HTTP 收集器流程图

流程图由Norconex HTTP 收集器提供。

于 2018-09-05T09:25:23.477 回答
3

我想出了另一种解决方案,建议没有人提及。有一个名为Selenum的库,它是一个开源自动化测试工具,用于自动化 Web 应用程序以进行测试,但当然不仅限于此。您可以编写一个网络爬虫,并像人类一样从这个自动化测试工具中受益。

作为说明,我将为您提供一个快速教程,以更好地了解它是如何工作的。如果您对阅读这篇文章感到无聊,请观看此视频以了解该库可以提供哪些功能来抓取网页。

硒成分

首先,Selenium 由各种组件组成,这些组件共存于一个独特的进程中,并在 java 程序上执行它们的操作。这个主要组件称为 Webdriver,它必须包含在您的程序中才能使其正常工作。

在此处访问以下站点并下载适用于您的计算机操作系统(Windows、Linux 或 MacOS)的最新版本。它是一个包含 chromedriver.exe 的 ZIP 存档。将其保存在您的计算机上,然后将其解压缩到一个方便的位置,就像C:\WebDrivers\User\chromedriver.exe我们稍后将在 java 程序中使用这个位置。

下一步是引入 jar 库。假设您正在使用 maven 项目来构建 java 程序,您需要将以下依赖项添加到您的 pom.xml

<dependency>
 <groupId>org.seleniumhq.selenium</groupId>
 <artifactId>selenium-java</artifactId>
 <version>3.8.1</version>
</dependency>

Selenium Web 驱动程序设置

让我们开始使用 Selenium。第一步是创建一个 ChromeDriver 实例:

System.setProperty("webdriver.chrome.driver", "C:\WebDrivers\User\chromedriver.exe);
WebDriver driver = new ChromeDriver();

现在是深入研究代码的时候了。以下示例显示了一个简单的程序,它打开一个网页并提取一些有用的 Html 组件。这很容易理解,因为它的注释清楚地解释了这些步骤。请看一下以了解如何捕获对象

//Launch website
      driver.navigate().to("http://www.calculator.net/");

      //Maximize the browser
      driver.manage().window().maximize();

      // Click on Math Calculators
      driver.findElement(By.xpath(".//*[@id = 'menu']/div[3]/a")).click();

      // Click on Percent Calculators
      driver.findElement(By.xpath(".//*[@id = 'menu']/div[4]/div[3]/a")).click();

      // Enter value 10 in the first number of the percent Calculator
      driver.findElement(By.id("cpar1")).sendKeys("10");

      // Enter value 50 in the second number of the percent Calculator
      driver.findElement(By.id("cpar2")).sendKeys("50");

      // Click Calculate Button
      driver.findElement(By.xpath(".//*[@id = 'content']/table/tbody/tr[2]/td/input[2]")).click();


      // Get the Result Text based on its xpath
      String result =
         driver.findElement(By.xpath(".//*[@id = 'content']/p[2]/font/b")).getText();


      // Print a Log In message to the screen
      System.out.println(" The Result is " + result);

完成工作后,可以使用以下命令关闭浏览器窗口:

driver.quit();

Selenium 浏览器选项

当你使用这个库时,你可以实现太多的功能,例如,假设你使用的是 chrome,你可以在你的代码中添加

ChromeOptions options = new ChromeOptions();

看看我们如何使用 WebDriver 使用 ChromeOptions 打开 Chrome 扩展

options.addExtensions(new File("src\test\resources\extensions\extension.crx"));

这是为了使用隐身模式

options.addArguments("--incognito");

这个用于禁用 javascript 和信息栏

options.addArguments("--disable-infobars");
options.addArguments("--disable-javascript");

如果您想让浏览器静默抓取并在后台隐藏浏览器抓取,则此选项

options.addArguments("--headless");

一旦你完成了它

WebDriver driver = new ChromeDriver(options);

总而言之,让我们看看 Selenium 必须提供什么,并使其成为与迄今为止在这篇文章中提出的其他解决方案相比的独特选择。

  • 语言和框架支持
  • 开源可用性
  • 多浏览器支持
  • 跨各种操作系统的支持
  • 易于实施
  • 可重用性和集成
  • 并行测试执行和更快的上市
  • 易于学习和使用
  • 不断更新
于 2019-08-03T11:56:18.367 回答
2

我建议您使用HttpClient 库您可以在此处找到示例。

于 2012-07-01T13:58:45.310 回答
2

我更喜欢 crawler4j。Crawler4j 是一个开源的 Java 爬虫,它提供了一个简单的 Web 爬虫界面。您可以在几个小时内设置一个多线程网络爬虫。

于 2014-02-22T01:02:43.367 回答
1

我认为jsoup比其他的更好,jsoup 可以在 Java 1.5 及更高版本、Scala、Android、OSGi 和 Google App Engine 上运行。

于 2015-01-03T12:19:42.820 回答
0

你可以 explore.apache droid 或 apache nutch 来感受一下基于 java 的爬虫

于 2012-07-01T18:06:08.843 回答
0

虽然主要用于单元测试 Web 应用程序,但 HttpUnit 会遍历网站、单击链接、分析表格和表单元素,并为您提供有关所有页面的元数据。我将它用于 Web Crawling,而不仅仅是用于单元测试。- http://httpunit.sourceforge.net/

于 2014-02-18T17:50:25.587 回答
0

以下是可用爬虫的列表:

https://java-source.net/open-source/crawlers

但我建议使用Apache Nutch

于 2017-01-26T07:04:27.610 回答