??在Java中有很多开源的组件来支持各种各样方式的网页抓取,仅仅是使用Java做网页抓取还是比较容易的。主要的网页抓取技术:
HttpClient
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。
(1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
(2)支持自动转向
(3)支持 HTTPS 协议
(4)支持代理服务器
(5)支持自动的Cookies管理等
Jsoup
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
网页获取和解析速度飞快,推荐使用。
主要功能如下:
- 从一个URL,文件或字符串中解析HTML;
- 使用DOM或CSS选择器来查找、取出数据;
- 可操作HTML元素、属性、文本;
HtmlUnit
htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。这个没有界面的浏览器,运行速度也是非常迅速的。采用的是Rhinojs引擎。模拟js运行。
??说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行Javascript。
网页获取和解析速度较快,性能较好,推荐用于需要解析网页脚本的应用场景。
Watij
Watij(发音wattage)是一个使用Java开发的Web应用程序测试工具,鉴于Watij的简单性和Java语言的强大能力,Watij能够使您在真正的浏览器中完成Web应用程序的自动化测试。因为是调用本地浏览器,因此支持CSS渲染和JS执行。
网页获取速度一般,IE版本过低(6/7)时可能会引发内存泄露。
比较推荐使用HtmlUnit来进行网页抓取主要是因为:
- 对于使用java实现的网页爬虫程序,我们一般可以使用apache的HttpClient组件进行HTML页面信息的获取,HttpClient实现的http请求返回的响应一般是纯文本的document页面,即最原始的html页面。
- 对于一个静态的html页面来说,使用httpClient足够将我们所需要的信息爬取出来了。但是对于现在越来越多的动态网页来说,更多的数据是通过异步JS代码获取并渲染到的,最开始的html页面是不包含这部分数据的。
HtmlUnit是一个“Java程序的无gui浏览器”。它为HTML文档建模,并提供了一个API,允许您调用页面、填写表单、单击链接等等。就像你在“普通”浏览器中做的那样。它有相当好的JavaScript支持(不断改进),甚至可以使用相当复杂的AJAX库,根据所使用的配置来模拟Chrome、Firefox或Internet Explorer。它通常用于测试或从web站点检索信息。
Maven引入jar包:
<!-- 爬虫工具包 --> <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.30</version> </dependency> <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit-core-js</artifactId> <version>2.28</version> </dependency> <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit-cssparser</artifactId> <version>1.0.0</version> </dependency> //引入jsoup来对网页进行解析 <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.3</version> </dependency> <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>neko-htmlunit</artifactId> <version>2.30</version> </dependency>
下面是一个例子,创建了web客户端,并让它从某度加载主页。然后我们打印这个页面是否有正确的标题。getPage()可以根据返回的数据的内容类型返回不同类型的页面。在这种情况下,我们期望的是文本/html的内容类型,所以我们将结果转换为com.gargoylesoftware.htmlun.html.htmlpage。
很方便:
import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class Test { public void homPage() throws Exception { try (final WebClient webClient = new WebClient()) { final HtmlPage page = webClient.getPage("http://www.baidu.com"); System.out.println(page.getTitleText()); } } public static void main(String[] args) { try { new Test().homPage(); } catch (Exception e) { e.printStackTrace(); } } } 打印结果: 百度一下,你就知道 Process finished with exit code 0
具体的入门案例和Api可以参考官方提供的文档。
原文:https://www.cnblogs.com/keeya/p/9285042.html