之前写过一篇用Java抓取网页内容的文章,当时是用url.openStream()函数创建一个流,然后用BufferedReader把这个inputstream读取进来。抓取的结果是一整个字符串。如果要提取网页中的某个元素或者链接,还需要用正则表达式来查找匹配。
最近看到利用Jsoup库函数可以方便的分析html文件。函数库本身很小,不到2Mb,本领却很大。先用url创建一个Document类的对象,再按照css的格式把链接、图片、文本一一分解出来。比如,我写了一段代码把17届中央委员、候补中央委员、中央纪委委员的百度百科词条链接都抓取到。若逐条解析这些链接,又可以提取其它信息。原代码如下:
package CPCsearch; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import BaikeCard.PersonCard; public class No17Committee { /** * @param args */ private static Map<String, String> urllist = new HashMap<String, String>(); public static void setURLlist() throws IOException{ String originalurl = "http://baike.baidu.com/searchword/?word=" +"中国XX党第十七届中央委员会"+"&pic=1&sug=1&enc=utf-8"; System.out.println(originalurl); Document doc = Jsoup.connect(originalurl).get(); Element lemmacontent = doc.select("div#lemmaContent-0").first(); Elements links = lemmacontent.select("a[href]"); for(Element link:links){ if(link.text().length()<=10){ String urladdress = link.attr("abs:href"); String name = link.text(); urllist.put(name, urladdress); } } } public static void main(String[] args) throws IOException { // TODO Auto-generated method stub setURLlist(); for(Map.Entry entry:urllist.entrySet()){ System.out.println(entry.getKey()+" "+entry.getValue()); } System.out.println(urllist.size()); } }
这里是扑捉到的结果:
中国XX党第十七届中央委员会委员、候补委员、第十七届中央纪律检查委员会委员的百度百科页面链接:
王旭东 http://baike.baidu.com/view/34770.htm
李盛霖 http://baike.baidu.com/view/34722.htm
田成平 http://baike.baidu.com/view/34605.htm
宋秀岩 http://baike.baidu.com/view/122092.htm
胡泽君 http://baike.baidu.com/view/967656.htm
王兆国 http://baike.baidu.com/view/1844.htm
路甬祥 http://baike.baidu.com/view/1860.htm
王太华 http://baike.baidu.com/view/35988.htm
迟万春 http://baike.baidu.com/view/325028.htm
刘奇葆 http://baike.baidu.com/view/303958.htm
王国生 http://baike.baidu.com/view/767111.htm
王沪宁 http://baike.baidu.com/view/159348.htm
张庆伟 http://baike.baidu.com/view/117230.htm
袁家军 http://baike.baidu.com/view/51855.htm
徐绍史 http://baike.baidu.com/view/924447.htm
刀林荫 http://baike.baidu.com/view/795154.htm
金振吉 http://baike.baidu.com/view/624679.htm
张平 http://baike.baidu.com/view/124481.htm
谌贻琴 http://baike.baidu.com/view/768829.htm
梁光烈 http://baike.baidu.com/view/28711.htm
杨利伟 http://baike.baidu.com/view/27767.htm
靖志远 http://baike.baidu.com/view/325364.htm
孙忠同 http://baike.baidu.com/view/325023.htm
陆浩 http://baike.baidu.com/view/119638.htm
吴定富 http://baike.baidu.com/view/321120.htm
李学勇 http://baike.baidu.com/view/282960.htm
刘玉浦 http://baike.baidu.com/view/304626.htm
王宪魁 http://baike.baidu.com/view/576688.htm
陈川平 http://baike.baidu.com/view/1216672.htm
李金城 http://baike.baidu.com/view/1215488.htm
朱明国 http://baike.baidu.com/view/304539.htm
实在是因为敏感词太多了,只能放出一部分。。。