【HtmlUnit】网页爬虫进阶篇

简介: 之前,亦枫写过一篇关于使用 Jsoup 抓取网页内容的文章:【Jsoup】HTML解析器,轻松获取网页内容Jsoup提供的api非常便捷,完全的类似JQuery操作,轻松抓取网页数据。

之前,亦枫写过一篇关于使用 Jsoup 抓取网页内容的文章:

【Jsoup】HTML解析器,轻松获取网页内容

Jsoup提供的api非常便捷,完全的类似JQuery操作,轻松抓取网页数据。但像Jsoup这样普通的爬虫工具不足的地方就是无法处理js生成的内容。

做过Html开发的人都知道,现在很多网站都在大量使用ajax和JavaScript来获取并处理数据,普通的爬虫工具已经无法处理js中的内容。

举例说明,我们在本地新建一个测试网页文件text.html,源码如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>main.html</title>

        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="this is my page">
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <style type="text/css">
        a {
            line-height: 30px;
            margin: 20px;
        }
    
    </style>
        <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
        <script type="text/javascript">

var datas = [ {
    href : "http://www.jianshu.com/p/8d8edf25850d",
    title : "推荐一款编程字体,让代码看着更美"
}, {
    href : "http://www.jianshu.com/p/153d9f31288d",
    title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
    href : "http://www.jianshu.com/p/d6fb0c9c9c26",
    title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
    href : "http://www.jianshu.com/p/72d69b49d135",
    title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];

window.onload = function() {
    var infos = document.getElementById("infos");
    for( var i = 0 ; i < datas.length ; i++)
        {
            var a = document.createElement("a");
            a.href = datas[i].href ;
            a.innerText = datas[i].title;
            infos.appendChild(a);   
            infos.appendChild(document.createElement("br"))
        }
}
</script>
    </head>

    <body>
        <div class="text" style=" text-align:center;">HtmlUnit 测试网页内容!</div>
        <br>

        <div id="infos"
            style="width: 60%; border: 1px solid green; border-radius: 10px; margin: 0 auto;">
        </div>

    </body>
</html>

通过IIS发布本地网站(参考亦枫之前写的文章:
【IIS】Windows下利用IIS建立网站并实现局域网共享),
在浏览器中显示的网页效果如下:

网页展示效果.jpg

虽然通过网页审查元素可以看到body中含有网页展示中的文本内容:

网页审查元素.jpg

但是,通过Jsoup工具根本无法获取!在网页源代码中可以看出,我们需要抓取的内容是在页面显示之后通过ajax和JavaScript加载得到的。

那么怎么办呢?使用本文中推荐的开源工具 —— HtmlUnit,一款能够模拟浏览器的抓包神器!

在官网下载对应jar包,添加到项目工程的lib中,简单的测试代码如下:

import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

/**
 * @author 亦枫
 * @created_time 2016年1月12日
 * @file_user_todo Java测试类
 * @blog http://www.jianshu.com/users/1c40186e3248/latest_articles
 */
public class JavaTest {

    /**
     * 入口函数
     * @param args
     * @throws ParseException
     */
    public static void main(String[] args) throws ParseException {
        
        try {
            WebClient webClient = new WebClient(BrowserVersion.CHROME);
            HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
            DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
            for (int i = 0; i < domNodeList.size(); i++) {
                DomElement domElement = (DomElement) domNodeList.get(i);
                System.out.println(domElement.asText());
            }
            webClient.close();
        } catch (FailingHttpStatusCodeException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        
    }
    
}

运行之后,在控制台打印的结果:

HtmlUnit测试结果.jpg

可以看出,HtmlUnit能够抓取到AJAX和JavaScript加载的内容。

有关HtmlUnit的介绍在官网上写的非常详细,以下内容是亦枫翻译的一部分内容,供大家参考:

HtmlUnit是一款基于Java的没有图形界面的浏览器程序。它能够调用HTML文档并且提供API让开发人员像是在一个正常的浏览器上操作一样,获取网页内容,填充表单,点击超链接等等。

它能够非常好的支持JavaScript并且仍在不断改进提升,同时能够解析非常复杂的AJAX库,在不同的配置下模拟Chrome、Firefox和IE浏览器。

HtmlUnit通常用于测试目的和检索网站信息。

HtmlUnit提供了很多测试网络请求和抓取网页内容的功能,大家可以去官网或者其他网站学习使用。



作者:亦枫
链接:https://www.jianshu.com/p/d18845eb0e94
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
目录
相关文章
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
|
2月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
59 4
|
2月前
|
数据采集 存储 API
在信息时代,Python爬虫用于自动化网络数据采集,提高效率。
【7月更文挑战第5天】在信息时代,Python爬虫用于自动化网络数据采集,提高效率。基本概念包括发送HTTP请求、解析HTML、存储数据及异常处理。常用库有requests(发送请求)和BeautifulSoup(解析HTML)。基本流程:导入库,发送GET请求,解析网页提取数据,存储结果,并处理异常。应用案例涉及抓取新闻、商品信息等。
74 2
|
2月前
|
数据采集 存储 Java
如何让Python爬虫在遇到异常时继续运行
构建健壮Python爬虫涉及异常处理、代理IP和多线程。通过try/except捕获异常,保证程序在遇到问题时能继续运行。使用代理IP(如亿牛云)防止被目标网站封锁,多线程提升抓取效率。示例代码展示了如何配置代理,设置User-Agent,以及使用SQLite存储数据。通过`fetch_url`函数和`ThreadPoolExecutor`实现抓取与重试机制。
如何让Python爬虫在遇到异常时继续运行
|
2月前
|
数据采集 网络协议 数据挖掘
网络爬虫进阶之路:深入理解HTTP协议,用Python urllib解锁新技能
【7月更文挑战第30天】网络爬虫是数据分析和信息聚合的关键工具。深入理解HTTP协议及掌握Python的urllib库对于高效爬虫开发至关重要。HTTP协议采用请求/响应模型,具有无状态性、支持多种请求方法和内容协商等特点。
28 3
|
2月前
|
数据采集 API 开发者
🚀告别网络爬虫小白!urllib与requests联手,Python网络请求实战全攻略
【7月更文挑战第29天】在广阔的网络世界里,Python以其简洁的语法和强大的库支持成为网络爬虫开发的首选。本文聚焦于两大网络请求库——urllib和requests。urllib是Python内置库,虽API稍显复杂,却有助于理解HTTP本质。示例代码展示了如何使用`urlopen`函数发起GET请求并读取网页内容。相比之下,requests库则更加人性化,极大地简化了HTTP请求流程,使开发者能更专注于业务逻辑。
31 1
|
2月前
|
数据采集 XML API
Python 爬虫数据抓取(10):LXML
Python 爬虫数据抓取(10):LXML
43 1
|
2月前
|
机器学习/深度学习 数据采集 前端开发
网络爬虫开发:JavaScript与Python特性的小差异
我们以前写JavaScript的代码时,在遇到了发送请求时,都是需要去await的。 但是为什么Python代码不需要这样做呢? 这就是因为JavaScript是异步的,Python是同步的。 JavaScript就需要使用关键词await将异步代码块变为同步代码。
|
2月前
|
机器学习/深度学习 数据采集 自然语言处理
Python实现循环神经网络SimpleRNN、LSTM进行淘宝商品评论情感分析(含爬虫程序)
Python实现循环神经网络SimpleRNN、LSTM进行淘宝商品评论情感分析(含爬虫程序)
Python实现循环神经网络SimpleRNN、LSTM进行淘宝商品评论情感分析(含爬虫程序)
|
3月前
|
数据采集 前端开发 Java
Python简单爬虫案例
用pyhton从网页中爬取数据,是比较常用的爬虫方式。网页一般由html编写,里面包含大量的标签,我们所需的内容都包含在这些标签之中,除了对python的基础语法有了解之外,还要对html的结构以及标签选择有简单的认知,下面就用爬取fl小说网的案例带大家进入爬虫的世界。
下一篇
DDNS