[英]Java Web Crawler Libraries
我想为实验制作一个基于Java的网络爬虫。 我听说如果这是你第一次使用Java制作一个Web爬虫是可行的方法。 但是,我有两个重要问题。
我的程序如何“访问”或“连接”到网页? 请简要说明一下。 (我理解从硬件到软件的抽象层的基础知识,这里我对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 。
我建议你使用HttpClient库 。 你可以在这里找到例子。
我更喜欢crawler4j。 Crawler4j是一个开源Java爬虫,它为爬网提供了一个简单的界面。 您可以在几个小时内设置多线程Web爬网程序。
如果您想了解如何完成这些项目,请查看这些现有项目:
典型的爬虫过程是一个循环,包括提取,解析,链接提取和输出处理(存储,索引)。 虽然魔鬼在细节中,即如何“礼貌”并尊重robots.txt
,元标记,重定向,速率限制,URL规范化,无限深度,重试,重访等。
你可以探索.apache droid或apache nutch来获得基于java的爬虫的感觉
虽然主要用于单元测试Web应用程序,但HttpUnit遍历网站,单击链接,分析表格和表单元素,并为您提供有关所有页面的元数据。 我用它来进行Web爬行,而不仅仅是单元测试。 - http://httpunit.sourceforge.net/
我认为jsoup比其他人更好,jsoup在Java 1.5及更高版本,Scala,Android,OSGi和Google App Engine上运行。
我提出另一个解决方案,提出没有人提及。 有一个名为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提供了什么,并将其作为迄今为止在这篇文章中提出的其他解决方案的独特选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.