基于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#实现修改网页数据
背景 由于某宝最近升级,导致朋友买的刷单软件不能用了:在又付过钱之后,那个刷单软件供应商竟然捐款跑路了...于是,朋友委托我做一个功能一样的软件.功能 他给我描述的软件功能,是这个样子的: ...
随机推荐
- static_cast和reinterpret_cast
static_cast和reinterpret_cast 相同点:都是暴力转换,从一个类型转换为另一个类型,对于类指针不会保证安全性 static_cast和reinterpret_cast的区别 ...
- C4.5决策树--Java
ID3是以信息增益作为划分训练数据集的特征,即认为信息增益大的特征是对分类结果影响更大,但是信息增益的方法偏向于选择取值较多的特征,因此引入了C4.5决策树,也就是使用信息增益率(比)来作为划分数据集 ...
- 企业级Java应用最重要的4个性能指标
应用性能管理(APM)是一种即时监控以实现对应用程序性能管理和故障管理的系统化解决方案.目前主要指对企业的关键业务应用进行监测.优化,最终达到提高企业应用的可靠性和质量,保证用户得到良好的服务,降低I ...
- POJ 2023 Choose Your Own Adventure(树形,dfs,简单题)
题意: 输入一个整数n,表示有n组测试数据, 每组第一行输入一个整数x表示该组测试一共有x页,接下来输入x行,每行表示一页, 每页或者以C开头(第一页都是以C开头),或者以E开头,中间用引号括起一段文 ...
- C# 和Jsonp的一个小demo 用jQuery与JSONP轻松解决跨域访问的问题
客服端: 在A项目下面 建立一个 JsonpClient.aspx页面,代码如下: <%@ Page Language="C#" AutoEventWireup=& ...
- Razor视图引擎 语法学习(一)
ASP.NET MVC是一种构建web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架: ASP.NET约定优于配置:基本分为模型(对实体数据 ...
- poj 3114(强连通缩点+SPFA)
题目链接:http://poj.org/problem?id=3114 思路:题目要求很简单,就是求两点之间的花费的最短时间,不过有一个要求:如果这两个city属于同一个国家,则花费时间为0.如何判断 ...
- java中静态代理跟动态代理之间的区别
文章转载于:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另 ...
- Winsock IOCP模型(四篇)
http://blog.csdn.net/visualeleven/article/details/6041893 http://blog.csdn.net/visualeleven/article/ ...
- #-webkit-autofill##google#启用表单自动填充时,如何覆盖黄色背景
google和opera浏览器的表单自动填充后,输入框均会变成黄色背景,黑色字体.如下图. 这样的话会与网页的整体设计风格不一致,怎样自定义样式,来覆盖黄色背景. 首先来看看是什么导致的,右键查看元素 ...