开发者社区> keller.zhou> 正文

【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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
java爬虫利器Jsoup的使用
java爬虫利器Jsoup的使用
18 0
开发利器Hutool之MapProxy的妙用
开发利器Hutool之MapProxy的妙用
40 0
Java爬虫:使用WebMagic构建最简单的爬虫项目
Java爬虫:使用WebMagic构建最简单的爬虫项目
88 0
springMVC做Web开发已过时,现在都用 FineReport了
springMVC做Web开发已过时,现在都用 FineReport了
97 0
JavaWeb| JSTL标签库看这篇文章就够了!(含案例)
JavaWeb| JSTL标签库看这篇文章就够了!(含案例)
125 0
带你读《从零开始学Scrapy网络爬虫》之三:Scrapy框架介绍
本书共13章。其中,第1~4章为基础篇,介绍了Python基础、网络爬虫基础、Scrapy框架及基本的爬虫功能。第5~10章为进阶篇,介绍了如何将爬虫数据存储于MySQL、MongoDB和Redis数据库中;如何实现异步AJAX数据的爬取;如何使用Selenium和Splash实现动态网站的爬取;如何实现模拟登录功能;如何突破反爬虫技术,以及如何实现文件和图片的下载。第11~13章为高级篇,介绍了使用Scrapy-Redis实现分布式爬虫;使用Scrapyd和Docker部署分布式爬虫;使用Gerapy管理分布式爬虫,并实现了一个抢票软件的综合项目。
879 0
Python爬虫入门教程 28-100 虎嗅网文章数据抓取 pyspider
1. 虎嗅网文章数据----写在前面 今天继续使用pyspider爬取数据,很不幸,虎嗅资讯网被我选中了,网址为 https://www.huxiu.com/ 爬的就是它的资讯频道,本文章仅供学习交流使用,切勿用作其他用途。
1254 0
爬虫入门之Scrapy框架基础LinkExtractors(十一)
1 parse()方法的工作机制: 1. 因为使用的yield,而不是return。parse函数将会被当做一个生成器使用。
1618 0
爬虫入门之Scrapy 框架基础功能(九)
Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
2010 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Storm源码走读笔记
立即下载
ReactNative实战优化之路
立即下载
Python第五讲——关于爬虫如何做js逆向的思路
立即下载