我想为实验制作一个基于Java的网络爬虫。我听说如果这是你第一次使用Java制作一个Web爬虫是可行的方法。但是,我有两个重要的问题。
我的程序如何“访问”或“连接”到网页?请简要说明一下。 (我理解从硬件到软件的抽象层的基础知识,这里我对Java抽象感兴趣)
我应该使用哪些库?我想我需要一个用于连接网页的库,一个用于HTTP / HTTPS协议的库,以及一个用于HTML解析的库。
答案 0 :(得分:11)
Crawler4j是最适合您的解决方案,
Crawler4j是一个开源Java爬虫,它提供了一个用于爬网的简单界面。您可以在5分钟内设置多线程Web爬虫!
还有visit.更多基于Java的网络抓取工具和每个工具的简要说明。
答案 1 :(得分:8)
这是您的程序“访问”或“连接”网页的方式。
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解析,请参阅this
答案 2 :(得分:4)
对于解析内容,我使用的是Apache Tika。
答案 3 :(得分:4)
现在有一个包含许多基于java的HTML解析器,支持访问和解析HTML页面。
Here's基本比较的HTML解析器的完整列表。
答案 4 :(得分:2)
我建议您使用HttpClient library。您可以找到示例here。
答案 5 :(得分:2)
我更喜欢crawler4j。 Crawler4j是一个开源Java爬虫,它为爬网提供了一个简单的界面。您可以在几个小时内设置多线程Web爬网程序。
答案 6 :(得分:1)
如果您想了解如何完成这些工作,请看一下这些现有项目:
典型的搜寻器过程是一个循环,包括获取,解析,链接提取和处理输出(存储,索引)。尽管细节决定成败,但如何做到“礼貌”并尊重robots.txt
,元标记,重定向,速率限制,URL规范化,无限深度,重试,重访等。
流程图由Norconex HTTP Collector提供。
答案 7 :(得分:0)
你可以探索.apache droid或apache nutch以获得基于java的爬虫的感觉
答案 8 :(得分:0)
虽然主要用于单元测试Web应用程序,但HttpUnit遍历网站,单击链接,分析表格和表单元素,并为您提供有关所有页面的元数据。我用它来进行Web爬行,而不仅仅是单元测试。 - http://httpunit.sourceforge.net/
答案 9 :(得分:0)
我认为jsoup比其他人更好,jsoup在Java 1.5及更高版本,Scala,Android,OSGi和Google App Engine上运行。
答案 10 :(得分:0)
答案 11 :(得分:0)
我想出了另一种解决方案,提议没有人提及。有一个名为Selenum的库,它是一个开放源代码的自动化测试工具,用于出于测试目的自动执行Web应用程序,但当然不仅限于此。您可以编写Web爬网程序,并像人类一样从此自动化测试工具中受益。
作为说明,我将向您提供快速教程,以更好地了解其工作原理。如果您无聊阅读这篇文章,请看一下Video,以了解该库可以提供哪些功能来抓取网页。
首先,Selenium由在一个独特的过程中共存并在Java程序上执行其动作的各种组件组成。此主要组件称为Webdriver,必须将其包含在程序中才能使其正常运行。
在此处转到以下site并下载适用于您的计算机操作系统(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所提供的功能,并使其与迄今为止在本文中提出的其他解决方案相比成为唯一的选择。