HtmlUnit(基于java)网络爬虫总结

2 篇文章 0 订阅

HtmlUnit(基于java)网络爬虫总结

简介
HtmlUnit是一个没有界面的第三方爬虫框架,它模拟浏览器,在后台创建一个开发者想要的浏览器类型,与远程地址发起请求,并且自带js解析等功能,非常好用。下面我就说说HtmlUnit的基本使用和过程中可能会出现的问题。
一、环境引入
因为我是在我自己的spring boot项目在引入的,所以我在pom文件中加入依赖就行了


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

如果你只是爬取一个js不多的网站我建议换下面这个依赖


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

两者的区别我后面会讲,当然如果你不是用的maven工程(没有pom),可以去官网下载源代码库
二、使用
HtmlUnit使用起来非常简单,在使用时可以去官网手册查看语法事实上手册仅仅是入门讲解,听我下面讲也够了;
1、创建客户端和配置客户端`

		
         final String url ="https:****";//大家这可以填自己爬虫的地址
        WebClient webClient = new WebClient(BrowserVersion.FIREFOX_68);//创建火狐浏览器 2.23版本是FIREFOX_45 new不写参数是默认浏览器
        webClient.getOptions().setCssEnabled(false);//(屏蔽)css 因为css并不影响我们抓取数据 反而影响网页渲染效率
        webClient.getOptions().setThrowExceptionOnScriptError(false);//(屏蔽)异常
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//(屏蔽)日志
        webClient.getOptions().setJavaScriptEnabled(true);//加载js脚本
        webClient.getOptions().setTimeout(50000);//设置超时时间
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());//设置ajax
        HtmlPage htmlPage = webClient.getPage(url);//将客户端获取的树形结构转化为HtmlPage
        Thread.sleep(10000);//主线程休眠10秒 让客户端有时间执行js代码 也可以写成webClient.waitForBackgroundJavaScript(1000)

这里有个等待js执行,2.41.0很好兼容js多的情况,2.3却老是出问题,无法刷新网页,2.41.0打印的也很详细,执行过程也比较慢,可能慢工出细活
这里差多就获取了远程地址页面,现在要做的就是解析dom节点 填写数据模拟点击等事件。如果你要将他打印输出 htmlPage.asText()输出htmlPage节点的文本 htmlPage.asXml()输出htmlPage节点的xml代码
2、节点的获取
在此环节建议预备一点前端的知识
HtmlUnit给出两种节点获取方式
XPath查询:

 final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");

        //get list of all divs
        final List<?> divs = htmlPage .getByXPath("//div");

        //get div which has a 'name' attribute of 'John'
        final HtmlDivision div = (HtmlDivision) htmlPage .getByXPath("//div[@name='John']").get(0);

css选择器:(我更加钟爱)

  final DomNodeList<DomNode> divs = htmlPage .querySelectorAll("div");
        for (DomNode div : divs) {
            ....
        }

        //get div which has the id 'breadcrumbs'
        final DomNode div = htmlPage .querySelector("div#breadcrumbs");

css给出集合查询querySelectorAll和单个查询querySelector,如果你没有基础我给出以下例子你就明白:
htmlPage .querySelectorAll(“div”)返回htmlPage下面div标签集合
htmlPage .querySelector(“div:nth-child(1)”)返回htmlPage下面div的第一个div
htmlPage .querySelector(".submit")返回htmlPage下面第一个class=submit的标签
htmlPage .querySelector("#submit")返回htmlPage下面第一个id=submit的标签
htmlPage .querySelector(“div.submit”)返回htmlPage下面第一个class为submit的div标签
htmlPage .querySelector(“div[id=‘submit’]”)返回htmlPage下面第一个id为submit的div标签
以上的列举方法相信已经够用,不够的可以参阅css选择器
以下列举常见的html标签与HtmlUnit类的对应关系

div -> HtmlDivision
div集合 -> DomNodeList<DomNode>
fieldSet -> HtmlFieldSet 
form -> HtmlForm
button -> HtmlButton
a -> HtmlAnchor
<input type="xxx"> -> HtmlXxxInput
(<input type="text"> -> HtmlTextInput)
table -> HtmlTable
tr -> HtmlTableRow
td -> TableDataCell

有 setAttribute()方法节点的属性样式,setNodeValue()设置节点value值。是不是英语一下子就提高了?几乎所有的标签可以找到与之对应的的类,下面看我的实战:这是一个在线填写温度的excel文档 如果访问改地址,他会提示登陆网页上有登录按钮,如果登录过网页上是没有登录按钮,我们现在模拟打开自动登录框:

 //这段代码是为了让网页的的某个按钮加载出来之后再执行下面的代码
        while (htmlPage.querySelector("#header-login-btn")==null) {
            synchronized (htmlPage) {
                htmlPage.wait(1000);
            }
        }
        HtmlButton login = htmlPage.querySelector("#header-login-btn");//获取到登陆按钮
        if (login!=null){//如果网页上没这个按钮你还要去获取他只会得到一个空对象,所以我们用空的方式可以判断网页上是否有这个按钮
            System.out.println("-----未登录测试-----");
            htmlPage=login.click();//模拟按钮点击后要将网页返回回来方便动态更新数据
            System.out.println(htmlPage.asText());
            HtmlAnchor switcher_plogin = htmlPage.querySelector("a[id='switcher_plogin']");
            if (switcher_plogin!=null) {//帐号密码登录
                System.out.println("-----点击了帐号密码登陆-----");
                htmlPage = switcher_plogin.click();
                System.out.println(htmlPage.asText());
            }
        }
        System.out.println(htmlPage.asText());
        webClient.close();

爬虫最重要的步骤是我们对网页先进行调试,有哪些按钮,要点击哪个,要给哪些设值。毕竟我们要用代码安排代码。
**延申:**如果你要对网页的数据获取或者文件进行下载,光靠HtmlUnit解析是不够的,推荐Jsoup库,是可以配合HtmlUnit使用的,比较好用,这里就不列举。

如果你对文章比较满意,欢迎点赞! thanks

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java爬虫是一种利用Java语言编写的爬虫程序,可以用于自动化地获取互联网上的信息。获取网页源代码是Java爬虫程序中的一项基本功能,可以利用Java提供的网络编程和HTML解析库来实现。 Java爬虫获取网页源代码的过程通常分为以下几个步骤: 1. 网络连接:Java爬虫需要通过网络连接到要爬取的网站,可以使用Java提供的URLConnection或者Apache HttpClient等库进行网络连接。 2. 发起请求:一旦网络连接建立,可以构造HTTP请求,并附上必要的参数和头信息,向服务器发送请求。 3. 接收响应:服务器收到请求后,会返回HTTP响应,Java爬虫需要接收并解析这个响应。 4. HTML解析:HTTP响应中通常包括HTML代码,需要使用HTML解析库(如Jsoup)对其进行解析,提取出需要的内容。 5. 存储数据:Java爬虫通常需要将从网站上爬取的数据存储到数据库或者文件中,以供后续分析和使用。 拆分HTML是指将HTML代码拆分成元素,根据标签将其分解成一棵树形结构,每个节点代表一个元素,例如div、p等。Java提供了很多HTML解析库,如Jsoup、HtmlUnit等,可以方便地将HTML代码拆分成元素,并通过操作DOM树实现对元素的查找和修改等操作。在Java爬虫中,拆分HTML代码是非常重要的一步,可以大大简化数据的提取和处理过程,从而实现高效、精确的数据抓取。 ### 回答2: Java爬虫是一种程序,能够自动地获取Web页面数据并提取感兴趣的内容。Java爬虫获取源代码的方法是使用Java网络请求库发送HTTP GET请求,并通过响应获取所需的HTML源代码。 拆分HTML源代码的方法通常包括两个步骤。首先,Java爬虫需要使用HTML解析工具(例如Jsoup)将HTML源代码转换成可操作的DOM对象。这样,Java爬虫就可以对HTML进行操作,例如查找特定的元素、获取元素属性或文本内容。 第二步是使用Java爬虫的逻辑或正则表达式进行HTML内容的拆分。拆分HTML的方法通常有两种:一种是通过使用Java的正则表达式库快速地定位所需的内容;另一种方法是使用HTML标签语言对HTML代码进行结构性解析,以此找到我们需要的内容。 在拆分HTML的过程中,Java爬虫需要针对每个网站的HTML源代码进行特定的处理,以确保获取所需信息的准确性和完整性。一般而言,Java爬虫需要根据网站的HTML结构和文件格式,制定适当的策略,确保爬取数据质量达到预期。 ### 回答3: Java爬虫是一种可以自动化获取网页内容的程序,通常用于获取互联网上的数据和信息,比如抓取网页内容、分析网页结构等。 获取网页内容的第一步是获取源代码,这可以通过Java中的URLConnection或HttpClient等类库实现。这些类库可以建立HTTP连接,获取网页源代码。获取到的源代码通常是一个包含HTML标签和CSS样式等文本字符串。 随后需要对获取的源代码进行解析和处理,这时我们可以选择使用各种类库和工具(比如Jsoup)来解析HTML代码,根据HTML标签来提取所需的数据。这些工具可以方便地捕获网页中的标签、属性、文本等信息,并对其进行处理和转换。 当数据被提取后,我们还需要将其进行处理,主要是拆分HTML文件,分离出所需的内容。这需要使用正则表达式等方法,对提取的数据进行逐一判断,分割。这样我们就可以将网页内容划分为独立的组件,包括标题、文本、图像等,并且可以根据需要进行重新排布。 总的来说,Java爬虫获取网页源代码并拆分HTML是获取网页信息的基本流程。通过各种类库和工具,我们可以轻松地处理原始源代码,提取出所需的数据,并按照需要进行处理和调整,实现对网页信息的自动化采集和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值