既然方向定了,就开始做实验室吧,做舆情分析,首先就是要收集相关的语料
正好实验室有同学在做标化院的信息抽取抽取这块 于是把程序拿过来研究研究正好
完整程序在126邮箱共享:
可下载数:20 共享连接:http://163.fm/SGmSw42 提取码:
第一个主类:
1 package com.fetch; 2 3 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.util.ArrayList; 7 import java.util.Enumeration; 8 import java.util.HashMap; 9 import java.util.List; 10 import java.util.Map; 11 import java.util.Properties; 12 13 import com.gargoylesoftware.htmlunit.TopLevelWindow; 14 import com.gargoylesoftware.htmlunit.WebClient; 15 import com.gargoylesoftware.htmlunit.html.HtmlAnchor; 16 import com.gargoylesoftware.htmlunit.html.HtmlElement; 17 import com.gargoylesoftware.htmlunit.html.HtmlPage; 18 import com.util.MyWebConnectionWrapper; 19 20 21 /** 22 * @author 裴东辉 24 */ 25 public class HtmlUnitExtractor { 26 27 private WebClient webClient; 28 29 private String startPageUrl; 30 31 private static final String DEFAULT_PROPERTIES = "default.properties"; 32 33 private static Map<String, String> cfgMap = new HashMap<String, String>(); 34 35 /** 36 * read config 37 * @return 38 */ 39 public InputStream getConfigFileInputStream() { 40 InputStream is = HtmlUnitExtractor.class.getResourceAsStream("/"+DEFAULT_PROPERTIES); 41 if (is==null) { 42 return null; 43 } 44 return is; 45 } 46 47 /** 48 * 初始化 49 */ 50 public void initCfgMap(){ 51 InputStream is = this.getConfigFileInputStream(); 52 if (is != null) { 53 Properties p = new Properties(); 54 try { 55 p.load(is); 56 for (Enumeration<?> enu = p.propertyNames(); enu.hasMoreElements();) { 57 String key = (String) enu.nextElement(); 58 String value = (String) p.getProperty(key); 59 cfgMap.put(key, value); 60 } 61 } catch (IOException e) { 62 System.out.println("read default.properties failed!"); 63 e.printStackTrace(); 64 } 65 } 66 } 67 68 69 /** 70 * 抽取国家标准公告 71 * 72 * @参数初始化 73 */ 74 public void initialize(){ 75 //参数初始化 76 initCfgMap(); 77 //模拟一个浏览器 78 webClient = new WebClient(); 79 //设置webClient的相关参数 80 webClient.getOptions().setCssEnabled(false); 81 webClient.getOptions().setTimeout(35000); 82 webClient.setWebConnection(new MyWebConnectionWrapper(webClient.getWebConnection())); 83 //http://www.sac.gov.cn/ 84 startPageUrl = cfgMap.get("indexurl");//起始地址 85 } 86 87 /** 88 * @author Administrator 89 * 90 * 起始地址,并返回HtmlPage的页面信息 91 * 92 */ 93 public HtmlPage getStartPage() { 94 HtmlPage page = null; 95 try { 96 //模拟浏览器打开一个目标网址 97 page = webClient.getPage(startPageUrl);//每个抓取得直接网址 98 } catch (Exception ex) { 99 System.out.println("打开网页失败-->"+startPageUrl); 100 ex.printStackTrace(); 101 return null; 102 } 103 return page; 104 } 105 /** 106 * @author Administrator 107 * 返回当前页面的内容 108 */ 109 public HtmlPage getNextSearchResultPage(HtmlElement resultPageTrigger) { 110 //模拟点击进入该链接 111 HtmlPage currentPage = null; 112 try { 113 resultPageTrigger.click(); 114 } catch (Exception ex) { 115 System.out.println("获取下一页内容失败!"); 116 ex.printStackTrace(); 117 return null; 118 } 119 //打开当前页 120 currentPage = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage(); 121 122 //打印看看内容 123 System.out.println(currentPage.asXml()); 124 return currentPage; 125 } 126 127 /** 128 * @author Administrator 129 * 获取下一页链接地址 130 */ 131 public HtmlElement getNextPageTrigger(HtmlPage page) { 132 webClient.getOptions().setJavaScriptEnabled(true); 133 //学习一下 getFirstByXPath的API 134 HtmlElement nextPageTrigger = page.getFirstByXPath("//a[text()='下一页']"); 135 136 //打印看看内容 137 System.out.println(nextPageTrigger.asText()); 138 139 return nextPageTrigger; 140 } 141 /** 142 * @author Administrator 143 * 抽取本结果页面中的所有结果集的链接地址 144 */ 145 @SuppressWarnings("unchecked") 146 public List<HtmlElement> extractAnchors(HtmlPage page) { 147 //查看页面源码: 148 //<a href='./201310/' target="_blank" class="1430">• 2013年第10号中国国家标准公告</a> 149 //<a href='./201309/' target="_blank" class="1430">• 2013年第9号中国国家标准公告</a></td> 150 //<a href='./201308/' target="_blank" class="1430">• 2013年第8号中国国家标准公告</a> 151 List<HtmlElement> anchors = (List<HtmlElement>) page.getByXPath("//a[@class='1430']"); 152 for (HtmlElement a : anchors) { 153 HtmlAnchor anchor = (HtmlAnchor) a; 154 System.out.println(anchor.asXml()); 155 } 156 return anchors; 157 } 158 159 /** 160 * @author Administrator 161 * 抽取本结果页面中的所有数据 162 */ 163 public List<Map<String, String>> extractStd(List<HtmlElement> tbtAnchors){ 164 webClient.getOptions().setJavaScriptEnabled(false); 165 List<Map<String, String>> tbts = new ArrayList<Map<String, String>>(); 166 for (HtmlElement anchor : tbtAnchors){ 167 //开始一个新的页面 就是http://www.sac.gov.cn/gjbzgg/页面的第一个链接 168 //http://www.sac.gov.cn/gjbzgg/201310/ 169 TopLevelWindow currentWindow = null; 170 String href = anchor.getAttribute("href"); 171 try { 172 //模拟浏览器的动作 打开网页 173 anchor.click(); 174 } catch (IOException ex) { 175 System.out.println("=====打开网页失败!====="); 176 ex.printStackTrace(); 177 } 178 //获取当前打开的页面 http://www.sac.gov.cn/gjbzgg/201310/ 179 currentWindow = (TopLevelWindow) webClient.getCurrentWindow(); 180 HtmlPage tbtPage = (HtmlPage) currentWindow.getEnclosedPage(); 181 if (tbtPage != null) { 182 System.out.println(tbtPage.getUrl()); 183 Map<String, String> info = new HashMap<String, String>();; 184 //获取这个页面的信息 并将页面上的信息保存到map中 最后将map数据添加的list<map>中 185 info.put("lylj", tbtPage.getUrl().toString());// lylj 来源连接 186 info.put("lyym", tbtPage.asXml().trim());// lyym 来源页面内容 187 System.out.println(info.get("lylj")); 188 System.out.println(info.get("lyym")); 189 tbts.add(info); 190 if (tbtPage.getUrl().toString().endsWith(href)) { 191 currentWindow.close(); 192 } 193 currentWindow.close(); 194 } 195 } 196 return tbts; 197 } 198 /** 199 * @author Administrator 200 * 201 */ 202 public void destory() { 203 webClient.closeAllWindows(); 204 } 205 /** 206 * @author Administrator 207 */ 208 public static void main(String[] args) { 209 210 HtmlUnitExtractor extractor = new HtmlUnitExtractor(); 211 extractor.initialize(); 212 213 HtmlPage startPage = extractor.getStartPage(); 214 if (startPage == null) { 215 return; 216 } 217 218 //查看页面源码 219 //td align="center"><a href="/gjbzgg/" target="_blank" class="lanse12">国家标准公告</a></td> 220 HtmlElement resultPageTrigger = startPage.getAnchorByHref("/gjbzgg/"); 221 222 int pageCount = 5; 223 224 while ( resultPageTrigger != null &&pageCount > 0) { 225 226 HtmlPage resultPage = extractor.getNextSearchResultPage(resultPageTrigger); 227 228 if (resultPage != null) { 229 System.out.println("Result page \"" + resultPage.getUrl()+ "\" loaded;"); 230 231 //获取http://www.sac.gov.cn/gjbzgg/这个页面上面所有的页面链接地址 就是分页的第一页数据 20条记录 232 List<HtmlElement> tbtAnchors = extractor.extractAnchors(resultPage); 233 234 //对当前页的20条记录 逐个进行分析 235 //每一个页面分析的结果就放到一个Map中 所以结果最后都放到一个list里面去 236 List<Map<String, String>> pageInfos = extractor.extractStd(tbtAnchors); 237 238 //对数据进行处理 保存到txt文本里面 或者保存到数据库 或者保存到nosql数据库上面 239 for(Map<String, String> pageIfno: pageInfos){ 240 System.out.print(pageIfno.size()); 241 } 242 243 //对第二页的数据进行抽取 244 resultPageTrigger = extractor.getNextPageTrigger(resultPage);//获取下一页链接地址 245 } 246 pageCount--; 247 } 248 extractor.destory(); 249 } 250 } 251
第二个辅助类:
1 package com.util; 2 3 import java.io.IOException; 4 5 import com.gargoylesoftware.htmlunit.StringWebResponse; 6 import com.gargoylesoftware.htmlunit.WebConnection; 7 import com.gargoylesoftware.htmlunit.WebRequest; 8 import com.gargoylesoftware.htmlunit.WebResponse; 9 import com.gargoylesoftware.htmlunit.util.WebConnectionWrapper; 10 11 public class MyWebConnectionWrapper extends WebConnectionWrapper { 12 13 public MyWebConnectionWrapper(WebConnection webConnection) 14 throws IllegalArgumentException { 15 super(webConnection); 16 } 17 18 @Override 19 public WebResponse getResponse(WebRequest request) throws IOException { 20 if (request.getUrl().toString().startsWith("http://stat.sac.gov.cn/phpstat/logcount.php?")) { 21 WebResponse webResponse = new StringWebResponse("",request.getUrl()); 22 return webResponse; 23 } 24 return super.getResponse(request); 25 } 26 27 }
依赖jar包:
1 commons-codec-1.6.jar 2 commons-collections-3.2.1.jar 3 commons-io-2.2.jar 4 commons-lang3-3.1.jar 5 commons-logging-1.1.1.jar 6 cssparser-0.9.8.jar 7 displaytag-1.2.jar 8 dom4j-2.0.0-ALPHA-2.jar 9 htmlunit-2.11.jar 10 htmlunit-core-js-2.11.jar 11 httpclient-4.2.1.jar 12 httpcore-4.2.1.jar 13 httpmime-4.2.1.jar 14 mongo-2.10.1.jar 15 nekohtml-1.9.17.jar 16 sac-1.3.jar 17 serializer-2.7.1.jar 18 xalan-2.7.1.jar 19 xercesImpl-2.10.0.jar 20 xml-apis-1.4.01.jar
default.properties 配置文件:
1 indexurl=http://www.sac.gov.cn/