基于HtmlUnit的模板的网页数据抽取

时间:2022-08-31 13:28:21

既然方向定了,就开始做实验室吧,做舆情分析,首先就是要收集相关的语料

正好实验室有同学在做标化院的信息抽取抽取这块 于是把程序拿过来研究研究正好

完整程序在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">•&nbsp; &nbsp;2013年第10号中国国家标准公告</a>
         //<a href='./201309/' target="_blank" class="1430">•&nbsp; &nbsp;2013年第9号中国国家标准公告</a></td>
         //<a href='./201308/' target="_blank" class="1430">•&nbsp; &nbsp;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的模板的网页数据抽取的更多相关文章

  1. htmlunit 自动化提交&sol;获取网页数据,自动化测试

    开源组件: https://sourceforge.net/projects/htmlunit/ demo public void post() { try { WebClient client = ...

  2. 移动端基于HTML模板和JSON数据的JavaScript交互

    写本文之前,我正在做一个基于Tab页的订单中心: 每点击一个TAB标签,会请求对应状态的订单列表.之前的项目,我会在js里使用 +  连接符连接多个html内容: var html = ''; htm ...

  3. python获取数据网页数据并创建文件夹保存(基于python3&period;6)

    from urllib.parse import urljoin import urllib.request from bs4 import BeautifulSoup import os impor ...

  4. 使用webdriver&plus;urllib爬取网页数据&lpar;模拟登陆,过验证码&rpar;

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  5. 各种JS模板引擎对比数据&lpar;高性能JavaScript模板引擎&rpar;

    最近做了JS模板引擎测试,拿各个JS模板引擎在不同浏览器上去运行同一程序,下面是模板引擎测试数据:通过测试artTemplate.juicer与doT引擎模板整体性能要有绝对优势: js模板引擎 Ja ...

  6. JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有)

    前言:最近园子里多了许多谈语言.谈环境.谈逼格(格局)的文章,看看笑笑过后,殊不知其实都是然并卵.提升自己的技术才是王道.之前博主分享过多篇bootstrap组件的文章,引起了很多园友的关注和支持,看 ...

  7. 【转】如何在Windows&plus;VS2005使用最新静态libcurl 7&period;35&period;0获取网页数据,支持HTTPS

    地址: http://blog.csdn.net/hujkay作者:Jekkay Hu(34538980@qq.com)关键词:Windows,curl,ssl,  visual c++ 2005, ...

  8. 《BI项目笔记》增量ETL数据抽取的策略及方法

    增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据.在ETL使用过程中.增量抽取较全量抽取应用更广.如何捕获变化的数据是增量抽取的关键.对捕获方法一般有两点要求:准确性,能够将 ...

  9. 用C&num;实现修改网页数据

    背景    由于某宝最近升级,导致朋友买的刷单软件不能用了:在又付过钱之后,那个刷单软件供应商竟然捐款跑路了...于是,朋友委托我做一个功能一样的软件.功能    他给我描述的软件功能,是这个样子的: ...

随机推荐

  1. ios中的http:get,post,同步,异步

    一.服务端 1.主要结构:

  2. Redis学习笔记三:多机数据库的实现

    1.复制 执行slaveof命令或者设置slaveof选项,让一个服务器去复制另外一个服务器. 旧版复制功能的实现(Redis 2.8 之前的版本) 复制功能分为同步和命令传播两个操作. 同步(syn ...

  3. web端视频直播网站的弊端和优势

    在YY上市前后,国内涌出一批类YY视频直播或9158的秀场类网站. 比如六间房,酷六等等 这种web端视频服务基本依靠web本身的特性,用flash直播,靠CDN提供服务. 但是这样的架构有2个问题 ...

  4. Cheatsheet&colon; 2013 08&period;14 ~ 08&period;19

    .NET Lucene.Net ultra fast search for MVC or WebForms site => made easy! C# State Machines HttpCl ...

  5. Web Api 接口文档制作

    参考地址: http://blogs.msdn.com/b/yaohuang1/archive/2012/05/21/asp-net-web-api-generating-a-web-api-help ...

  6. BZOJ AC 200题留念

    话说本来想200AC就把题目总结一下...但是我现在挺懒的..不想弄...以后再来吧.

  7. Linux Shell 小脚本经典收藏

    原文:http://www.cnblogs.com/Javame/p/3867686.html 1.在两个文件中找出相同的号码 diff -y xx.txt oo.txt | egrep -v &qu ...

  8. Java的类的实例化顺序

    Java的类的实例化顺序 父类的静态数据 子类的静态数据 父类的成员变量 父类的构造方法 子类的成员变量 子类的构造方法

  9. zabbix自定义key监控memcache状态及其他服务进程

    一.在客户端 1.到/usr/loca/zabbix/conf/zabbix_agentd.conf里添加         UserParameter=memcached_stats[*],(echo ...

  10. JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList&comma;迭代器Iterator,List的使用

    JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据 ...