转自:https://www.cnblogs.com/luotinghao/p/3800054.html

网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,4行代码就OK啦,例子如下:

1
2
3
4
final WebClient webClient=new WebClient();
final HtmlPage page=webClient.getPage("http://www.yanyulin.info");
System.out.println(page.asText());
webClient.closeAllWindows();

在程序中写上上面的4行代码,运行,就可以得到烟雨林博客首页的全部内容,上面代码在运行的过程中会出现很多警告,出现这些警告的主要原因是由于以下两点:

1、HtmlUnitJavascript的支持不是很好

2、HtmlUnitCSS的支持不是很好

明白了上面的两点后,将代码重新改写一下,该禁用的就禁用,同时禁用一些不必要的功能,也有利于提高程序的运行效率,再者说网络爬虫也不需要CSS的支持滴

1
2
3
4
5
6
final WebClient webClient=new WebClient();
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
final HtmlPage page=webClient.getPage("http://www.yanyulin.info");
System.out.println(page.asText());
webClient.closeAllWindows();

HtmlUnit的使用: 简介:HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行Javascript

作用:web的自动化测试(最初的目的),浏览器,网络爬虫

重要API的使用 在介绍API的使用之前要先明白的一个问题是,WebClient,WebWindow,Page三者之间的关系,所有的页面最终都是在一个WebWindow对象里面,WebClient在创建时会自动的创建一个WebWindow对象,当调用getPage时会将新页面加载到WebWindow里,你可以理解成WebClient就是IE内核,WebWindow就是呈现页面的浏览器窗口,三者之间的关系图如下图所示:

1、模拟特定浏览器,也可以指定浏览器的相应版本(HtmlUnit最新版2.13现在可以模拟的浏览器有Chrome/FireFox/IE)

1
2
//模拟chorme浏览器,其他浏览器请修改BrowserVersion.后面
WebClient  webClient=new WebClient(BrowserVersion.CHROME);

2、查找特定元素,通过get或者XPath可以从HtmlPage中获得特定的Html元素,如下例子

方法一,通过get方法获取

1
2
3
HtmlPage page=webClient.getPage("http://www.yanyulin.info");
//从[烟雨林博客]上获取标签hed的内容
HtmlDivision div=(HtmlDivision)page.getElementById("hed");

方法二,通过XPath获取,XPath通常用于无法通过Id搜索,或者需要更为复杂的搜索时,XPath的相关教程

XPath相关教程请查看我的个人博客

1
2
3
4
//同样可以打印出hed的内容,//div中//表示搜索整个文档中的div,并将这些div
//放入list中,然后获取第一个div
final HtmlDivision div = (HtmlDivision) page.getByXPath("//div").get(0);
System.out.println(div.asXml());

3、代理服务器的配置,代理的配置很简单,只需要配置好地址,端口,用户名与密码即可

1
2
3
final WebClient webClient = new WebClient(BrowserVersion.CHROME,"http://127.0.0.1",8087);
final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
credentialsProvider.addCredentials("username","password");

4、模拟表单的提交

1
2
3
4
5
6
7
8
9
//获取表单 
final HtmlForm form = page.getFormByName("form");
//获取提交按扭
final HtmlSubmitInput button = form.getInputByName("submit");
//一会得输入的
final HtmlTextInput textField = form.getInputByName("userid");
textField.setValueAttribute("test");
//点击提交表单
final HtmlPage page = button.click();

API的使用就介绍到这,网络爬虫中主要目的就是获取页中所有的链接,代码如下:

1
2
3
4
java.util.List<HtmlAnchor> achList=page.getAnchors();
for(HtmlAnchor ach:achList){
System.out.println(ach.getHrefAttribute());
}

最新文章

  1. mysql sum 和 count 函数 合并使用
  2. 【java】:读取文件
  3. React访问组件元素的子元素(ES5与ES6的对比)
  4. innerHtml and Jquery.html()
  5. Windows下查看机器监听端口
  6. eclipse中新建maven项目-转
  7. (转)文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别
  8. 第一个shell编程,输出hello world!
  9. JVM学习笔记一:内存管理
  10. JAVA接口基础知识总结
  11. Leetcode_119_Pascal&#39;s Triangle II
  12. Android 性能优化之使用Lint
  13. [Swift]LeetCode699. 掉落的方块 | Falling Squares
  14. 2019年3月更新 技术分享 WPF基本界面制作
  15. 负载均衡器技术Nginx和F5的优缺点对比
  16. CentOS 7.x编译安装Nginx1.10.3+MySQL5.7.16+PHP5.2 5.3 5.4 5.5 5.6 7.0 7.1多版本全能环境
  17. 解决libvlc_media_player_stop时死锁的方法
  18. [转帖]你们知道LTE Cat.1到Cat.10 那Cat.0呢?
  19. [整理]Win下好用的Markdown工具
  20. Ansible 使用 Playbook 管理 Nginx 配置文件

热门文章

  1. codeforces 1198B - Welfare State
  2. arcgis字段计算器
  3. JS生成简单随机答案选择器,小抽奖器
  4. 基于icmp的tracert路由追踪程序
  5. opencv:霍夫直线检测
  6. vue 对象数组中,相邻的且相同类型和内容的数据合并,重组新的数组对象
  7. python+tkinter+动画图片+爬虫(查询天气)的GUI图形界面设计
  8. python之 &#39;随机&#39;
  9. C#初识LINQ
  10. 将项目打成war包并用tomcat部署的方法,步骤及注意点