htmlunit爬取数据
2017-11-17 09:05
92 查看
HtmlUnit是一个“java程序的浏览器”。它为html文档建模,提供了一个API,允许您调用页面、填写表单、点击链接等,就像你在“正常”浏览器里做的一样。他有相当好的JavaScirpt支持(不断改进),甚至可以使用相当复杂的AJAX库,模拟Chrome、Firefox或Internet Explorer,这取决于所使用的配置。他通常用于测试的目的或从web站点检索信息。
下面贴出我在阳光高考中抓取专业的例子,这个例子最主要的特点是模仿浏览器的点击时间,动态的获取数据,其中包括ajax请求的数据:
怎么样,是不是很简单?上面的例子只是模仿了点击事件,然而htmlunit还有更加高级的功能,从原理上来说,他是直接访问网站的服务器,发的请求,所以没有被封号的危险,简单又容易上手。下面给出一个模仿表单提交事件的例子:
下面贴出我在阳光高考中抓取专业的例子,这个例子最主要的特点是模仿浏览器的点击时间,动态的获取数据,其中包括ajax请求的数据:
public static void main(String[] args) throws IOException { /* String url="http://gaokao.chsi.com.cn/zyk/zybk/"; Document doc = Jsoup.connect(url).get(); System.out.println(doc);*/ WebClient webClient = new WebClient(); // 部分js无法加载,导致控制台报错,下面几行代码都是为了让控制台不报错,但是不能从根本上解决问题哟! LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF); java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF); webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); webClient.getOptions().setThrowExceptionOnScriptError(false); //开启javascript webClient.getOptions().setJavaScriptEnabled(true); //htmlunit对css不是很友好呢! webClient.getOptions().setCssEnabled(false); //使重定向可用 webClient.getOptions().setRedirectEnabled(true); //设置超时时间 webClient.getOptions().setTimeout(50000); //获取网页 HtmlPage htmlpage = webClient.getPage("http://gaokao.chsi.com.cn/zyk/zybk/"); //加载javascript,有时候数据会加载不到,这个时候就需要加一个延迟时间。 webClient.waitForBackgroundJavaScript(20000); //得到本科数据本科数据 HtmlElement bk = htmlpage.getHtmlElementById("1050"); //通过xpath解析网页内容,关于xpath获取节点,可以在W3School教程中看到(解析很方便而且很简单哦) List<HtmlListItem> byXPath = (List<HtmlListItem>) htmlpage.getByXPath("//ul[@id='mlUl']/li"); ArrayList<HashMap<String, ArrayList<String>>> hashMaps = new ArrayList<>(); for (HtmlListItem htmlListItem : byXPath) { HashMap<String, ArrayList<String>> hashMap = new HashMap<>(); //得到节点文本 String textContent = htmlListItem.getTextContent(); System.out.println(textContent); //执行click()事件,这是使用htmlunit最便捷的地方了,可以模仿浏览器的行为 HtmlPage middle = (HtmlPage)htmlListItem.click(); webClient.waitForBackgroundJavaScript(20000); List<HtmlListItem> byXPath1 = (List<HtmlListItem>) middle.getByXPath("//ul[@id='xkUl']/li"); for (HtmlListItem listItem : byXPath1) { String textContent1 = listItem.getTextContent(); // System.out.println(textContent1); HtmlPage professionPage = (HtmlPage)listItem.click(); webClient.waitForBackgroundJavaScript(20000); // System.out.println(professionPage.asXml()); //通过xpath解析获取自己想要的数据 List<HtmlAnchor> professionList = (List<HtmlAnchor>) professionPage.getByXPath("//div[@id='listResult']/table/tbody/tr/td[1]/a[@target='_blank']"); for (HtmlAnchor item : professionList) { String profession= item.getTextContent(); } } } }
怎么样,是不是很简单?上面的例子只是模仿了点击事件,然而htmlunit还有更加高级的功能,从原理上来说,他是直接访问网站的服务器,发的请求,所以没有被封号的危险,简单又容易上手。下面给出一个模仿表单提交事件的例子:
public static void test() throws IOException { WebClient webclient = new WebClient(); HtmlPage htmlpage = webclient .getPage("http://news.baidu.com/advanced_news.html"); // 根据名字得到一个表单,查看上面这个网页的源代码可以发现表单的名字叫“f” final HtmlForm form = htmlpage.getFormByName("f"); System.out.println(form); // 同样道理,获取”百度一下“这个按钮 final HtmlSubmitInput button = form.getInputByValue("百度一下"); System.out.println(button); // 得到搜索框 final HtmlTextInput textField = form.getInputByName("q1"); System.out.println(textField); // 最近周星驰比较火呀,我这里设置一下在搜索框内填入”java“ textField.setValueAttribute("java"); // 输入好了,我们点一下这个按钮 final HtmlPage nextPage = button.click(); String result = nextPage.asXml(); System.out.println(result); } }
相关文章推荐
- htmlunit 自动化提交/获取网页数据,自动化测试
- 最近用htmlunit做网络爬虫 遇到拿不到初始化js加载的数据的问题 最近解决了 写个简单的例子
- htmlunit使用教程爬取网站的数据并保存成Excel表格
- HtmlUnit模仿浏览器抓取数据(含ajax)
- java htmlunit 抓取网页数据
- 使用HtmlUnit执行JavaScript中方法获取数据
- 使用HtmlUnit实现数据抓取
- htmlunit做爬虫绕过验证码抓取网站数据
- HtmlUnit爬取动态数据(js相关)
- htmlunit抓取数据的一些总结
- HtmlUnit java爬虫入门 真实案例讲解 爬取电商网站数据
- Hadoop源码分析笔记(十三):名字节点--数据块和数据节点管理
- c++boost库正则取网页数据输入
- 编程之美2014资格赛 大神与三个小伙伴 小数据
- Debug法修改Table数据
- 截获数据
- C++数据类型
- 简单的Linux数据备份方案
- Visual C# 2008+SQL Server 2005 数据库与网络开发--4.4.1 查询数据语法