基于HtmlUnit的模板的网页数据抽取
既然方向定了,就开始做实验室吧,做舆情分析,首先就是要收集相关的语料
正好实验室有同学在做标化院的信息抽取抽取这块 于是把程序拿过来研究研究正好
完整程序在126邮箱共享:
可下载数:20 共享连接:http://163.fm/SGmSw42 提取码:ruKJOh29
第一个主类: 1 package com.fetch; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import com.gargoylesoftware.htmlunit.TopLevelWindow; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlAnchor; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.util.MyWebConnectionWrapper; /** */ public class HtmlUnitExtractor { private WebClient webClient; private String startPageUrl; private static final String DEFAULT_PROPERTIES = "default.properties"; private static Map<String, String> cfgMap = new HashMap<String, String>(); /** * read config * @return */ public InputStream getConfigFileInputStream() { InputStream is = HtmlUnitExtractor.class.getResourceAsStream("/"+DEFAULT_PROPERTIES); if (is==null) { return null; } return is; } /** * 初始化 */ public void initCfgMap(){ InputStream is = this.getConfigFileInputStream(); if (is != null) { Properties p = new Properties(); try { p.load(is); for (Enumeration<?> enu = p.propertyNames(); enu.hasMoreElements();) { String key = (String) enu.nextElement(); String value = (String) p.getProperty(key); cfgMap.put(key, value); } } catch (IOException e) { System.out.println("read default.properties failed!"); e.printStackTrace(); } } } /** * 抽取国家标准公告 * * @参数初始化 */ public void initialize(){ //参数初始化 initCfgMap(); //模拟一个浏览器 webClient = new WebClient(); //设置webClient的相关参数 webClient.getOptions().setCssEnabled(false); webClient.getOptions().setTimeout(35000); webClient.setWebConnection(new MyWebConnectionWrapper(webClient.getWebConnection())); //http://www.sac.gov.cn/ startPageUrl = cfgMap.get("indexurl");//起始地址 } /** * @author Administrator * * 起始地址,并返回HtmlPage的页面信息 * */ public HtmlPage getStartPage() { HtmlPage page = null; try { //模拟浏览器打开一个目标网址 page = webClient.getPage(startPageUrl);//每个抓取得直接网址 } catch (Exception ex) { System.out.println("打开网页失败-->"+startPageUrl); ex.printStackTrace(); return null; } return page; } /** * @author Administrator * 返回当前页面的内容 */ public HtmlPage getNextSearchResultPage(HtmlElement resultPageTrigger) { //模拟点击进入该链接 HtmlPage currentPage = null; try { resultPageTrigger.click(); } catch (Exception ex) { System.out.println("获取下一页内容失败!"); ex.printStackTrace(); return null; } //打开当前页 currentPage = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage(); //打印看看内容 System.out.println(currentPage.asXml()); return currentPage; } /** * @author Administrator * 获取下一页链接地址 */ public HtmlElement getNextPageTrigger(HtmlPage page) { webClient.getOptions().setJavaScriptEnabled(true); //学习一下 getFirstByXPath的API HtmlElement nextPageTrigger = page.getFirstByXPath("//a[text()='下一页']"); //打印看看内容 System.out.println(nextPageTrigger.asText()); return nextPageTrigger; } /** * @author Administrator * 抽取本结果页面中的所有结果集的链接地址 */ @SuppressWarnings("unchecked") public List<HtmlElement> extractAnchors(HtmlPage page) { //查看页面源码: //<a href='./201310/' target="_blank" class="1430">• 2013年第10号中国国家标准公告</a> //<a href='./201309/' target="_blank" class="1430">• 2013年第9号中国国家标准公告</a></td> //<a href='./201308/' target="_blank" class="1430">• 2013年第8号中国国家标准公告</a> List<HtmlElement> anchors = (List<HtmlElement>) page.getByXPath("//a[@class='1430']"); for (HtmlElement a : anchors) { HtmlAnchor anchor = (HtmlAnchor) a; System.out.println(anchor.asXml()); } return anchors; } /** * @author Administrator * 抽取本结果页面中的所有数据 */ public List<Map<String, String>> extractStd(List<HtmlElement> tbtAnchors){ webClient.getOptions().setJavaScriptEnabled(false); List<Map<String, String>> tbts = new ArrayList<Map<String, String>>(); for (HtmlElement anchor : tbtAnchors){ //开始一个新的页面 就是http://www.sac.gov.cn/gjbzgg/页面的第一个链接 //http://www.sac.gov.cn/gjbzgg/201310/ TopLevelWindow currentWindow = null; String href = anchor.getAttribute("href"); try { //模拟浏览器的动作 打开网页 anchor.click(); } catch (IOException ex) { System.out.println("=====打开网页失败!====="); ex.printStackTrace(); } //获取当前打开的页面 http://www.sac.gov.cn/gjbzgg/201310/ currentWindow = (TopLevelWindow) webClient.getCurrentWindow(); HtmlPage tbtPage = (HtmlPage) currentWindow.getEnclosedPage(); if (tbtPage != null) { System.out.println(tbtPage.getUrl()); Map<String, String> info = new HashMap<String, String>();; //获取这个页面的信息 并将页面上的信息保存到map中 最后将map数据添加的list<map>中 info.put("lylj", tbtPage.getUrl().toString());// lylj 来源连接 info.put("lyym", tbtPage.asXml().trim());// lyym 来源页面内容 System.out.println(info.get("lylj")); System.out.println(info.get("lyym")); tbts.add(info); if (tbtPage.getUrl().toString().endsWith(href)) { currentWindow.close(); } currentWindow.close(); } } return tbts; } /** * @author Administrator * */ public void destory() { webClient.closeAllWindows(); } /** * @author Administrator */ public static void main(String[] args) { HtmlUnitExtractor extractor = new HtmlUnitExtractor(); extractor.initialize(); HtmlPage startPage = extractor.getStartPage(); if (startPage == null) { return; } //查看页面源码 //td align="center"><a href="/gjbzgg/" target="_blank" class="lanse12">国家标准公告</a></td> HtmlElement resultPageTrigger = startPage.getAnchorByHref("/gjbzgg/"); int pageCount = 5; while ( resultPageTrigger != null &&pageCount > 0) { HtmlPage resultPage = extractor.getNextSearchResultPage(resultPageTrigger); if (resultPage != null) { System.out.println("Result page \"" + resultPage.getUrl()+ "\" loaded;"); //获取http://www.sac.gov.cn/gjbzgg/这个页面上面所有的页面链接地址 就是分页的第一页数据 20条记录 List<HtmlElement> tbtAnchors = extractor.extractAnchors(resultPage); //对当前页的20条记录 逐个进行分析 //每一个页面分析的结果就放到一个Map中 所以结果最后都放到一个list里面去 List<Map<String, String>> pageInfos = extractor.extractStd(tbtAnchors); //对数据进行处理 保存到txt文本里面 或者保存到数据库 或者保存到nosql数据库上面 for(Map<String, String> pageIfno: pageInfos){ System.out.print(pageIfno.size()); } //对第二页的数据进行抽取 resultPageTrigger = extractor.getNextPageTrigger(resultPage);//获取下一页链接地址 } pageCount--; } extractor.destory(); } }
第二个辅助类: 1 package com.util; import java.io.IOException; import com.gargoylesoftware.htmlunit.StringWebResponse; import com.gargoylesoftware.htmlunit.WebConnection; import com.gargoylesoftware.htmlunit.WebRequest; import com.gargoylesoftware.htmlunit.WebResponse; import com.gargoylesoftware.htmlunit.util.WebConnectionWrapper; public class MyWebConnectionWrapper extends WebConnectionWrapper { public MyWebConnectionWrapper(WebConnection webConnection) throws IllegalArgumentException { super(webConnection); } @Override public WebResponse getResponse(WebRequest request) throws IOException { if (request.getUrl().toString().startsWith("http://stat.sac.gov.cn/phpstat/logcount.php?")) { WebResponse webResponse = new StringWebResponse("",request.getUrl()); return webResponse; } return super.getResponse(request); } }
依赖jar包: 1 commons-codec-1.6.jar commons-collections-3.2.1.jar commons-io-2.2.jar commons-lang3-3.1.jar commons-logging-1.1.1.jar cssparser-0.9.8.jar displaytag-1.2.jar dom4j-2.0.0-ALPHA-2.jar htmlunit-2.11.jar htmlunit-core-js-2.11.jar httpclient-4.2.1.jar httpcore-4.2.1.jar httpmime-4.2.1.jar mongo-2.10.1.jar nekohtml-1.9.17.jar sac-1.3.jar serializer-2.7.1.jar xalan-2.7.1.jar xercesImpl-2.10.0.jar xml-apis-1.4.01.jar
default.properties 配置文件: 1 indexurl=http://www.sac.gov.cn/
基于HtmlUnit的模板的网页数据抽取的更多相关文章
- htmlunit 自动化提交/获取网页数据,自动化测试
开源组件: https://sourceforge.net/projects/htmlunit/ demo public void post() { try { WebClient client = ...
- 移动端基于HTML模板和JSON数据的JavaScript交互
写本文之前,我正在做一个基于Tab页的订单中心: 每点击一个TAB标签,会请求对应状态的订单列表.之前的项目,我会在js里使用 + 连接符连接多个html内容: var html = ''; htm ...
- python获取数据网页数据并创建文件夹保存(基于python3.6)
from urllib.parse import urljoin import urllib.request from bs4 import BeautifulSoup import os impor ...
- 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)
urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...
- 各种JS模板引擎对比数据(高性能JavaScript模板引擎)
最近做了JS模板引擎测试,拿各个JS模板引擎在不同浏览器上去运行同一程序,下面是模板引擎测试数据:通过测试artTemplate.juicer与doT引擎模板整体性能要有绝对优势: js模板引擎 Ja ...
- JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有)
前言:最近园子里多了许多谈语言.谈环境.谈逼格(格局)的文章,看看笑笑过后,殊不知其实都是然并卵.提升自己的技术才是王道.之前博主分享过多篇bootstrap组件的文章,引起了很多园友的关注和支持,看 ...
- 【转】如何在Windows+VS2005使用最新静态libcurl 7.35.0获取网页数据,支持HTTPS
地址: http://blog.csdn.net/hujkay作者:Jekkay Hu(34538980@qq.com)关键词:Windows,curl,ssl, visual c++ 2005, ...
- 《BI项目笔记》增量ETL数据抽取的策略及方法
增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据.在ETL使用过程中.增量抽取较全量抽取应用更广.如何捕获变化的数据是增量抽取的关键.对捕获方法一般有两点要求:准确性,能够将 ...
- 用C#实现修改网页数据
背景 由于某宝最近升级,导致朋友买的刷单软件不能用了:在又付过钱之后,那个刷单软件供应商竟然捐款跑路了...于是,朋友委托我做一个功能一样的软件.功能 他给我描述的软件功能,是这个样子的: ...
随机推荐
- POJ 3253 Fence Repair(优先队列,哈夫曼树,模拟)
题目 //做哈夫曼树时,可以用优先队列(误?) //这道题教我们优先队列的一个用法:取前n个数(最大的或者最小的) //哈夫曼树 //64位 //超时->优先队列,,,, //这道题的优先队列用 ...
- awk处理之案例一:awk 处理百分比的问题
编译环境 本系列文章所提供的算法均在以下环境下编译通过. [脚本编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...
- swift学习网站
http://letsswift.com/category/swiftguide/http://www.imooc.com/course/list?is_easy=3&c=ioshttp:// ...
- JS中的内部类
js内部类 javascript中本身有提供一些可以直接使用的类,这种类就是内部类.主要有:Object.Array.Math.Boolean.String.Number.Date.RegExp. ...
- linux系统下挂载windows共享目录
在工作中有时我们需要在linux上挂载windows共享目录.首先我们需要学会在linux上查看windows共享了那些目录.查看操作需要安装samba-client. [root@ ~]# yum ...
- angularJS seed 安装
安装nodejs 安装python 配置python 环境 安装git 配置git 环境 clone angularJS seed 代码. 环境变量如下: C:\Program Files\nodej ...
- hdu 4159 Indomie (DP,数学概率)
推出数学公式: #include<stdio.h> #include<string.h> __int64 C(int m,int n) { __int64 tmp=; if(m ...
- ios开发--GCD使用介绍:4-延迟执行操作
在开发过程中,我们有时会希望把一些操作封装起来延迟一段时间后再执行.iOS开发中,有两种常用的方法可以实现延迟执行,一种是使用GCD,另外一种是使用NSRunLoop类中提供的方法. 1.使用GCD实 ...
- vmware通过vmnet8共享本地网络
转载于:http://zhaolongchn.blog.163.com/blog/static/19065850420122595117886/ 1,首先将真实电脑的虚拟网卡VMnet8启用 2,然后 ...
- linux中U盘umonut时出现“Device is busy”的解决方法
问题: #umount /dev/sda1 umount: /mnt/usb: device is busy 查找占用目录进程: #lsof |grep /mnt/usb bash 1971 root ...