我想为实验制作一个基于 Java 的网络爬虫。我听说如果这是您的第一次,那么用 Java 制作 Web Crawler 是不错的选择。但是,我有两个重要的问题。
我的程序将如何“访问”或“连接”到网页?请作简要说明。(我了解从硬件到软件的抽象层的基础知识,这里我对Java抽象感兴趣)
我应该使用哪些库?我假设我需要一个用于连接网页的库、一个用于 HTTP/HTTPS 协议的库和一个用于 HTML 解析的库。
我想为实验制作一个基于 Java 的网络爬虫。我听说如果这是您的第一次,那么用 Java 制作 Web Crawler 是不错的选择。但是,我有两个重要的问题。
我的程序将如何“访问”或“连接”到网页?请作简要说明。(我了解从硬件到软件的抽象层的基础知识,这里我对Java抽象感兴趣)
我应该使用哪些库?我假设我需要一个用于连接网页的库、一个用于 HTTP/HTTPS 协议的库和一个用于 HTML 解析的库。
这就是您的程序“访问”或“连接”到网页的方式。
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 解析,请参阅此
对于解析内容,我使用的是Apache Tika。
如果您想了解如何完成,请查看这些现有项目:
典型的爬虫过程是一个循环,包括获取、解析、链接提取和输出处理(存储、索引)。虽然魔鬼在细节中,即如何“礼貌”和尊重robots.txt
、元标记、重定向、速率限制、URL 规范化、无限深度、重试、重访等。
流程图由Norconex HTTP 收集器提供。
我想出了另一种解决方案,建议没有人提及。有一个名为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。第一步是创建一个 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();
当你使用这个库时,你可以实现太多的功能,例如,假设你使用的是 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 必须提供什么,并使其成为与迄今为止在这篇文章中提出的其他解决方案相比的独特选择。
我建议您使用HttpClient 库。您可以在此处找到示例。
我更喜欢 crawler4j。Crawler4j 是一个开源的 Java 爬虫,它提供了一个简单的 Web 爬虫界面。您可以在几个小时内设置一个多线程网络爬虫。
我认为jsoup比其他的更好,jsoup 可以在 Java 1.5 及更高版本、Scala、Android、OSGi 和 Google App Engine 上运行。
你可以 explore.apache droid 或 apache nutch 来感受一下基于 java 的爬虫
虽然主要用于单元测试 Web 应用程序,但 HttpUnit 会遍历网站、单击链接、分析表格和表单元素,并为您提供有关所有页面的元数据。我将它用于 Web Crawling,而不仅仅是用于单元测试。- http://httpunit.sourceforge.net/