【入门】Java使用htmlutil进行数据爬取 {一篇文章让你了解爬虫技术栈}

数据爬取不光htmlutil可以做,我大大小小整合了十个技术栈,后面会一一介绍!

本篇文章讲解的是htmlutil模拟浏览器点击的内容:

最近公司有数据爬取的业务,我在网上看了好多文章,对于htmlutil技术栈介绍的文章都比较零散,自己做的时候分不清每种类对应的前端标签,所以准备分享一下这方面的知识!话不多说,上正文

先介绍一下所有技术栈的优点,总共实践了十种:

1.Heritrix:
排名第一的是赫特里克斯。它是一个开源的Java网络爬行库,具有很高的可扩展性,也是为网络归档而设计的。它还提供了一个非常易于使用的基于web的用户界面,可通过任何现代web浏览器访问,可用于操作控制和监控爬网。
其突出显示的功能包括:
各种可更换和可插拔模块。
一个易于使用的基于web的界面。
它还具有出色的可扩展性

2.Web-Harvest:
WebHarvest是另一个出色的开源java爬行工具。它提供了从选择性网页中收集有用数据的功能。为了成功实现这一点,它主要依靠XSLT、XQuery和正则表达式来搜索和过滤HTML和基于XML的网站中的内容。它还可以很容易地与自定义Java库集成,以进一步利用其提取功能。
它的最佳功能是:
强大的XML和文本操作处理器,用于处理和控制数据流。
它还附带了用于使用和存储变量的变量上下文。
还支持其他脚本语言,这些语言可以很容易地集成到scraper配置中

3.Apache Nutch:
ApacheNutch是一个独特的Java网络爬行工具,具有高度模块化的体系结构。它允许Java开发人员为媒体类型解析、数据检索、查询和集群等应用程序创建自定义插件。由于是可插拔的和模块化的,ApacheNutch提供了一个可扩展的接口来调整所有的自定义实现。
其主要优点是:
与其他工具相比,它是一个高度可扩展和可扩展的Java网络爬虫。
它遵循所有的文本规则。
Apache Nutch拥有庞大的社区和活跃的开发人员。
可插拔解析、协议、存储和索引等功能

4. Jaunt
这个java网页抓取工具是为网页抓取、网页自动化和JSON查询而设计的。它配备了一个快速、轻量级、无头的浏览器,提供了所有的网络抓取功能、对DOM的访问以及对每个HTTP请求/响应的控制。让Jaunt落后于其他工具的唯一一点是不支持JavaScript。
其突出显示的功能有:
它单独处理每个HTTP请求/响应。
易于使用的REST API接口
它提供对HTTP、HTTPS和基本身份验证的支持
它还提供了在DOM和JSON中启用RegEx的查询

5.StormCrawler
StormCrawler是一个成熟的Java网络爬虫。它提供了一组可重用的特性和组件,所有这些特性和组件大多是用Java编写的。它是最适合用Java构建低延迟、可扩展和优化的web爬网解决方案的工具之一,也是为爬网提供URL流的完美工具。
其独特功能包括:
它是一个高度可扩展的Java网络爬虫,可用于大规模递归爬虫。
使用额外的Java库可以很容易地进行扩展
它还提供了一个适当的线程管理系统,可以减少每次爬网的延迟

6.Gecco
Gecco是一个为Java网络爬行设计的完整框架。它是一个轻量级且易于使用的网络爬虫,完全用Java语言编写。Gecco框架之所以受到青睐,主要是因为其卓越的可扩展性。该框架主要基于开放和封闭设计的原则、修改封闭的规定以及开放的扩展而开发。
Gecco的主要优点是:
它支持网页中的异步Ajax请求。
它还为用于访问地理受限网站的下载代理服务器提供支持。
它允许使用Redis来实现分布式爬网

7. WebSPHINX
WebSPHINX(用于HTML信息提取的网站特定处理器)是一个出色的Java web爬网工具,作为Java类库和各种其他web爬网程序的交互式开发环境。WebSPHINX由两个主要部分组成:第一部分,Crawler工作台和WebSPHINX类库。它还提供了一个功能齐全的图形用户界面,用户可以配置和控制一个可定制的Java网络爬虫。
它的突出显示功能是:
WebSPHINX提供了一个用户友好的GUI。
还提供了广泛的定制级别。
它可以很好地添加到其他网络爬虫中

8. Jsoup
Jsoup是Java网络爬行库的另一个很好的选择。它允许Java开发人员浏览现实世界中的HTML。许多开发人员也更喜欢它,因为它提供了一个非常方便的API,可以通过使用DOM、CSS和类似jquery的方法来提取和操作所有收集的数据。
其优点是:
J汤提供了对CSS选择器的完全支持。
它净化了HTML。
Jsoup具有内置的代理支持。
它提供了一个API来遍历HTML DOM树,以从web中提取目标数据

9.HTMLUnit 【本篇要讲的】
它是一个更强大的Java网络爬行框架。它完全支持JavaScript,最突出的功能是,它甚至允许用户在抓取时模拟浏览器事件,如点击和表单提交。这在很大程度上增强了自动化过程,使得可以从某些网站上删除数据,这些数据要么非常困难和耗时,要么在不手动执行浏览器事件的情况下无法完成。与JSoup不同,HTMLUnit也支持基于XPath的解析。通过收集所有这些工具,它还可以用于web应用程序的单元测试。
其有前景的功能包括:
对模拟浏览器事件的支持。
提供JavaScript支持。
它提供了基于Xpath的解析。
它也可以作为单元测试的替代方案

10.Norconex HTTP Collector
Norconex是所有Java网络爬虫中最独特的,因为它针对的是用户的企业需求。这是一个很好的抓取工具,因为它允许用户抓取他们需要的任何类型的网络内容。它甚至可以用作功能齐全的收集器,或者用户可以将其嵌入到应用程序中。它几乎与所有操作系统都兼容。由于是一个大型工具,它可以在一台中等容量的服务器上抓取多达数百万个页面。
另请参阅:十大Java机器学习工具和库
Norconex的突出特点包括:
它具有高度的可扩展性,因为它可以抓取数百万个网页。
它还提供OCR支持来扫描图像和PDF文件中的数据。
您也可以配置爬行速度
还支持语言检测,允许用户废弃非英语网站

下面开始介绍一下htmlutil:

1.首先介绍一下要引入的jar包

<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.27</version>
</dependency>

这是我们要导入的jar包,在spring中可以直接引入

2.我们要在我们创建的类中创建WebCLient对象来启动htmlutil

WebClient wc = new WebClient(BrowserVersion.CHROME,ip,port);

注:BrowserVersion.CHROME这个参数是我们选择用那种浏览器来访问我们要爬取的网站

浏览器参数:

  1. CHROME
  2. Edge(Microsoft Edge)
  3. BEST_SUPPORTED
  4. FIREFOX_45
  5. FIREFOX_52
  6. INTERNET_EXPLORER

3.然后设置一下WebClient的参数

wc.getOptions().setJavaScriptEnabled(true); //启用JS解释器,默认为true
wc.getOptions().setThrowExceptionOnScriptError(false); //当JS执行出错的时候是否抛出异常, 这里选择不需要
wc.getOptions().setThrowExceptionOnFailingStatusCode(false); 当HTTP的状态非200时是否抛出异常, 这里选择不需要
wc.setJavaScriptTimeout(100000);//设置JS执行的超时时间
wc.getOptions().setCssEnabled(true); //禁用css支持
wc.getOptions().setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常
wc.getOptions().setTimeout(100000); //设置连接超时时间 ,这里是10S。如果为0,则无限期等待
wc.setAjaxController(new NicelyResynchronizingAjaxController());  //很重要,设置支持Ajax

这是我们要设置的参数,其中有些设置我在使用中打开的话会容易报错,比如:wc.getOptions().setThrowExceptionOnScriptError(false);这个参数打开的话js很容易报错,导致项目不能运行,应该是获取js时的一些错误,不过不打开不影响,能读取出数据,我也没管,大家有时间可以研究一下源码

4、下一步需要通过WebClient对象来传输url地址来获取页面

HtmlPage page = wc.getPage(url);

这里的url可以是域名也可以是IP地址,没有限制,他会自动解析,毕竟这是模拟浏览器,就是利用浏览器获取页面

注:大家可以先用百度的域名来试试

5.要放大招了:这里说一下上一步获取page的解析,以及通过page来获取页面中的标签

String s = page.asText();

这个是将页面输出为String字符串,输出的页面比较简短,只有标签内的数据,不会存在标签

如果想要标签的形式输出可以使用下面这种:

String s = page.asXml();

这只是页面中的数据获取出来了,下面我们开始获取页面中的某一个元素

首先我们先看看每个类对应的html元素:

form标签  - > HtmlForm

text类型的 Input  - >  HtmlTextInput

submit类型的 input  - >  HtmlSubmitInput

不介意类型的话 使用 input  ->  HtmlInput

a 标签  ->  HtmlAnchor

div元素  - >  HtmlDivision 

①:获取表单

HtmlForm htmlForm = page.getFormByName("name");

参数是表单的名称,有些网站为了防止被爬取,会不写name,下面我们讲一下没有name怎么获取

(1)通过id获取

HtmlForm htmlForm = page.getByXPath("//form[@id='form']");

//form[@id='form'] 这个参数里面@的内容可以根据实际form中有的内容进行判定

②:获取输入框

(1)通过name获取

HtmlTextInput input = htmlForm.getInputByName("wd");

(2)通过value获取

HtmlTextInput btn = htmlForm.getInputByValue("value");

③:获取提交框

HtmlSubmitInput btn = htmlForm.getInputByValue("百度一下");

注:提交框也是两种方式:name + value,和输入框一样,这里不再赘述

④:获取按钮

HtmlButton buttonByName = htmlform.getButtonByName("aa");

注:按钮也是两种方式:name + value,这里不再赘述

⑤:通过HtmlPage.getByPath();获取精准标签

List<HtmlForm> formList = page.getByXPath("//form[@id='form']");

通过这种方式可以获取页面中所有符合该id的form表单:

如果还想获取form下面的标签可以使用下面这种方式:

List<HtmlDivision> htmldivision = page.getByXPath("//form[@id='form']/div");

如果div下面还有标签需要获取,那么就再加一层

这个返回的是集合,需要遍历一下找到符合的标签

⑥:获取a标签

List<HtmlAnchor> htmlanchor= page.getByXPath("//form[@id='form']/a");

这样的话可以获取得到下面的a标签集合

总结

htmlutil可以解决大部分场景下的数据爬取,但是有一些网站安全性比较高的还是有点费劲,但是功能确实比较强大,基本上数据爬取都比较成功!

下一节预告:htmlutil和Jsoup整合获取页面数据

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值