Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取。

下载地址:

  https://sourceforge.net/projects/htmlunit/files/htmlunit/

maven地址:

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

代码的实现非常简单,主要分为两种常用场景:

  1. 解析页面的js
  2. 不解析页面的js
package cn.qlq.craw.httpunit;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* httpunit爬虫
* @author liqiang
*
*/
public class HttpUnitCraw { public static void main(String[] args) throws Exception {
HttpUnitCraw crawl = new HttpUnitCraw();
String url = "http://qiaoliqiang.cn/";
System.out.println("----------------------抓取页面时不解析js-----------------");
crawl.crawlPageWithoutAnalyseJs(url);
System.out.println("----------------------抓取页面时解析js-------------------");
crawl.crawlPageWithAnalyseJs(url);
} /**
* 功能描述:抓取页面时不解析页面的js
* @param url
* @throws Exception
*/
public void crawlPageWithoutAnalyseJs(String url) throws Exception{
//1.创建连接client
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//2.设置连接的相关选项
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setTimeout(10000);
//3.抓取页面
HtmlPage page = webClient.getPage(url);
System.out.println(page.asXml());
//4.关闭模拟窗口
webClient.closeAllWindows();
} /**
* 功能描述:抓取页面时并解析页面的js
* @param url
* @throws Exception
*/
public void crawlPageWithAnalyseJs(String url) throws Exception{
//1.创建连接client
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//2.设置连接的相关选项
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true); //需要解析js
webClient.getOptions().setThrowExceptionOnScriptError(false); //解析js出错时不抛异常
webClient.getOptions().setTimeout(10000); //超时时间 ms
//3.抓取页面
HtmlPage page = webClient.getPage(url);
//4.将页面转成指定格式
webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成
System.out.println(page.asXml());
//5.关闭模拟的窗口
webClient.closeAllWindows();
}
}
 
主要关注webClient的几个选项配置,


需要将这两个开关打开才可以解析页面的js,css的渲染默认关掉就可以,因为爬虫本身没有界面,所以这块不需要,即下面的配置:
 
htmlunit在解析js的时候也有可能失败,这块还没有深入研究,后续使用遇到问题再记录
 
抓取到的内容默认以xml形式获得,即page.asXml(), 因为这样可以通过jsoup去解析html页面数据,jsoup是一个比较方便简洁的工具.

htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容的更多相关文章

  1. 使用HttpClient配置代理服务器模拟浏览器发送请求调用接口测试

    在调用公司的某个接口时,直接通过浏览器配置代理服务器可以请求到如下数据: 请求url地址:http://wwwnei.xuebusi.com/rd-interface/getsales.jsp?cid ...

  2. 20200726_java爬虫_使用HttpClient模拟浏览器发送请求

    浏览器获取数据: 打开浏览器 ==> 输入网址 ==> 回车查询 ==> 返回结果 ==> 浏览器显示结果数据 HttpClient获取数据: 创建HttpClient ==& ...

  3. telnet客户端模拟浏览器发送请求

    telnet 客户端 telnet客户端能够发出请求去连接服务器(模拟浏览器) 使用telnet之前,需要开启telnet客户端 1.进入控制面板 2.进入程序和功能,选择打开或关闭windows功能 ...

  4. Java基础教程——模拟浏览器发送请求

    JAVA访问网页 分别测试使用get和post方法访问网页,可以收到服务器的请求,并写入到html文件中. import java.io.*; import java.net.*; import ja ...

  5. HtmlUnit爬取Ajax动态生成的页面内容

    HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴. HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单 ...

  6. java模拟浏览器发送请求

    package test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOExcep ...

  7. JAVA--利用HttpClient模拟浏览器登陆请求获取响应的Cookie

    在通过java采集网页数据时,我们常常会遇到这样的问题: 站点需要登陆才能访问 而这种网站,一般都会对请求进行账号密码的验证,验证的方式也有多种,需要具体分析. 今天分析其中的一种情况: 站点对登陆密 ...

  8. php使用curl模拟多线程发送请求

    每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求.php的curl多线程是通过不断调用curl_multi_e ...

  9. httpClient模拟浏览器发请求

    一.介绍 httpClient是Apache公司的一个子项目, 用来提高高效的.最新的.功能丰富的支持http协议的客户端编程工具包.完成可以模拟浏览器发起请求行为. 二.简单使用例子 : 模拟浏览器 ...

随机推荐

  1. CSS中可以和不可以继承的属性【转】

    一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性: vertical-align:垂直文本对齐 text-decoration:规定添加到文本的装饰 text-shad ...

  2. 第154天:canvas基础(一)

    一.canvas简介 ​ <canvas> 是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是 ...

  3. HDU4675_GCD of Sequence

    很有意思的一个数论题. 是这样的,给你一个数数组a[i],其中给出的每一个数字和要求的数字方位都是[1,m],现在问你根据a[]构造一个b[],且a和b中间的不相等的元素的个数恰好有k个. 现在问你g ...

  4. Educational Codeforces Round 33 (Rated for Div. 2) 题解

    A.每个状态只有一种后续转移,判断每次转移是否都合法即可. #include <iostream> #include <cstdio> using namespace std; ...

  5. 【题解】APIO2014回文串

    哇哦~想不到我有生之年竟然能够做出字符串的题目ヾ(✿゚▽゚)ノ虽然这题比较裸但依然灰常开心! 首先有一个棒棒的性质:本质不同的回文串最多有 O(n) 个.首先 manacher 把它们都找出来,然后问 ...

  6. 【POJ1741】Tree(点分治)

    [POJ1741]Tree(点分治) 题面 Vjudge 题目大意: 求树中距离小于\(K\)的点对的数量 题解 完全不觉得点分治了.. 简直\(GG\),更别说动态点分治了... 于是来复习一下. ...

  7. (转)Ubuntu 17.04_64上搭建巡风扫描系统(资产信息漏洞扫描内网神器)

    巡风简介 巡风是一款适用于企业内网的漏洞快速应急.巡航扫描系统,通过搜索功能可清晰的了解内部网络资产分布情况,并且可指定漏洞插件对搜索结果进行快速漏洞检测并输出结果报表.其主体分为两部分:网络资产识别 ...

  8. 安装redis环境

    1 安装redis至 /home/www/redis目录下 [root@cuijian www]# tar zxf redis-2.8.13.tar.gz [root@cuijian www]# cd ...

  9. 【loj6059】Sum

    Portal --> loj6059 Solution ​​ 看过去第一反应是..大力数位dp!然后看了一眼数据范围... ​ 但是这没有什么关系!注意到我们不需要考虑前导零了,可以直接快乐dp ...

  10. 51nod 1225 数学

    F(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n).其中%表示Mod,也就是余数. 例如F(6) = 6 % 1 + 6 % 2 + 6 % 3 + ...