编程语言 php java

用HtmlUnit实现爬虫抓取网页

java HTML我帮您 1年前  0次浏览
HtmlUnit官方学习文档
http://htmlunit.sourceforge.net/gettingStarted.html

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

final WebClient webClient=new WebClient();
final HtmlPage page=webClient.getPage("http://www.html580.com");
System.out.println(page.asText());
webClient.closeAllWindows();

在程序中写上上面的4行代码,运行,就可以得到HTML我帮您博客首页的全部内容,上面代码在运行的过程中会出现很多警告,出现这些警告的主要原因是由于以下两点:
1、HtmlUnit对Javascript的支持不是很好
2、HtmlUnit对CSS的支持不是很好
3、HtmlUnit对异常信息处理不抛出异常
明白了上面的两点后,将代码重新改写一下,该禁用的就禁用,同时禁用一些不必要的功能,也有利于提高程序的运行效率,再者说网络爬虫也不需要CSS的支持滴

final WebClient webClient=new WebClient();
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
webclient.getOptions().setThrowExceptionOnScriptError(false);
final HtmlPage page=webClient.getPage("http://www.html580.com");
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.15现在可以模拟的浏览器有Chrome/FireFox/IE)
//模拟浏览器浏览,其他浏览器请修改BrowserVersion.后面
WebClient webClient=new WebClient(BrowserVersion.CHROME);
WebClient webClient=new WebClient(BrowserVersion.FIREFOX_24);
WebClient webClient=new WebClient(BrowserVersion.INTERNET_EXPLORER_11);

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

方法一,通过get方法获取
HtmlPage page=webClient.getPage("http://www.html580.com");
//根据ID值some_div_id获取标签div的内容
HtmlDivision div = page.getHtmlElementById("some_div_id");

方法二,通过XPath获取,XPath通常用于无法通过Id搜索,或者需要更为复杂的搜索时,XPath的相关教程
XPATH相关教程:http://www.w3school.com.cn/xpath/xpath_syntax.asp
//获取DIV集合
List divs = page.getByXPath("//div");
//根据某个属性获取DIV
HtmlDivision div = (HtmlDivision) page.getByXPath("//div<@name='John'>").get(0);

3、代理服务器的配置,代理的配置很简单,只需要配置好地址,端口,用户名与密码即可
final WebClient webClient = new WebClient(BrowserVersion.CHROME, "http://127.0.0.1", 8087);
final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
credentialsProvider.addCredentials("username", "password");
HtmlPage page = webClient.getPage("http://www.html580.com");
webClient.closeAllWindows();

4、获取表单提交
final WebClient webClient = new WebClient();
//得到一个表单页面
final HtmlPage page1 = webClient.getPage("http://some_url");
//得到表单实际名
final HtmlForm form = page1.getFormByName("myform");
//得到表单的提交按钮
final HtmlSubmitInput button = form.getInputByName("submitbutton");
//得到表单的用户输入框
final HtmlTextInput textField = form.getInputByName("userid");
//设置表单值
textField.setValueAttribute("root");
//模拟表单提交跳转
final HtmlPage page2 = button.click();
System.out.println(page2.asText());
webClient.closeAllWindows();


发表评论