WebMagic Java 爬蟲的簡單應用

前段時間做旅遊本體的知識庫,我和老師反應說景點之間關係太少了,導致整個圖很稀疏。。

“你去wiki上抓一批數據吧”,就這樣被自己坑了。

由於一直在用java做項目,ZWQ師兄推薦的是selenium,這個我想說真的很強大,還支持JS渲染,不過當我看到這篇的時候,我決定學一下WebMagic。

項目中文文檔地址:http://webmagic.io/docs/zh/

這個項目很容易上手,只要把架包導進來,簡單的爬蟲只要實現PageProcessor類接可以了。

public void process(Page page) {
        
    	if(page.getHtml().toString().contains("消歧")){
    		//System.out.println("1" + page.getUrl().toString());
    		Document doc = Jsoup.parse(page.getHtml().toString());
			Element ele = doc.select("div.mw-content-ltr").first();
			Element ul = ele.getElementsByTag("ul").first();
	    	page.putField("addr", ul.text());
			
	    	System.out.println("1:" + cntx ++);
    	}
    	
    	//else if(page.getHtml().xpath("//div[@id='noarticletext']/p/b/text()") != null && page.getHtml().xpath("//div[@id='noarticletext']/p/b/text()").toString().contains("沒有")){
    	else if (page.getHtml().toString().contains("維基百科目前還沒有與上述標題相同的條目")){
    		System.out.println("2" + page.getUrl().toString());
    		System.out.println("2:" + cnty ++);
    	}
    	else {
    	
    	
	    	        String th = "";
			String td = "";
			String test = "";
			//System.out.println("3" + page.getUrl().toString());
			Document doc = Jsoup.parse(page.getHtml().toString());
			Element ele = doc.select("div.mw-content-ltr").first();
			
			Element tbody = ele.getElementsByClass("infobox").first().getElementsByTag("tbody").first();
			
			
			for(int i = 1;i < 15;i ++){
				//th = page.getHtml().xpath("//table[@class=infobox]/tbody/tr[" + i + "]/th//text()").toString();
				//td = page.getHtml().xpath("//table[@class=infobox]/tbody/tr[" + i + "]/td//text()").toString();
				if(tbody.children().size() <= i)break;
				Element thx = tbody.child(i).child(0);
				th = thx.text();
				//System.out.println(tbody);
				if(tbody.child(i).children().size() > 1){
					Element tdx = tbody.child(i).child(1);
					td = tdx.text();
				//System.out.println(thx.text());
				}
				if(th != null && td != null && th != "" && td != ""){
					
					//page.putField(th, td);
					//test += th + ":" + td + "\n";
					page.putField(th, td);
					//System.out.println(th + ":" + td);
					
					
				}
				//System.out.println("done");
				th = "";td = "";
			}
			
				//writer.write(th + ":" + td + "\n");
			
    		
			System.out.println("3:" + cnt ++);
    	}

消歧頁面我就簡單判斷此頁面包不包含消歧,沒有詞條的。。。

這裏只抓詞條頁的infobox裏面的值,生成鍵值對。消歧頁把所有地址都抓下來。

想用Xpath獲得節點的值,可每個頁面都不盡相同,詢問HBQ師兄給出了用Jsoup的建議,發現真的很好用。

需要注意的事Element的child方法,如果i超過chrildensize的話會出錯,因爲這個問題好多頁面雖然抓到了但沒保存本地,我估計錯誤被PageProcessor接收了,沒扔出來。

最終去抓的旅遊景點有23743個,wiki上有消歧頁的有651個,有詞條頁的有2264個

消歧頁的結果是這樣的:

url:    http://zh.wikipedia.org/zh-cn/劍山
addr:    山名: 劍山 (臺灣),臺灣百嶽之一 劍山 (大連),位於中國大連的山峯 劍山 (德島縣),位於日本德島縣,日本百名山之一 劍山 (北海道上川支廳),位於日本北海道上川郡下川町 劍山 (北海道十勝支廳),位於日本北海道上川郡清水町與河西郡芽室町邊界 劍山 (青森縣),位於日本青森縣陸奧市 劍山 (東京都),位於日本東京都小笠原村 劍山 (兵庫縣),位於日本兵庫縣西宮市 劍山 (岡山市),位於日本岡山縣岡山市 劍山 (新見市),位於日本岡山縣新見市 劍山 (奈義町),位於日本岡山縣勝田郡奈義町 劍山 (愛媛縣),位於日本愛媛縣西條市 劍山 (橫濱市),日本神奈川縣橫濱市青葉區之地名 劍山 (插花),東亞傳統插花工具 劍山 (列車),日本JR四國營運的特急列車 劍山 (小行星),小行星帶中一顆小行星 劍山 (歌曲),日本歌手北山毅主唱的歌曲

有詞條頁面的infobox結果是這樣的:

url:	http://zh.wikipedia.org/zh-cn/廈門大學
校訓:	自強不息·止於至善
創建時間:	1921年 中華民國十年
學校類型:	私立(1921年至1937年) 公立(1937年至今)
校長:	朱崇實
職工:	2,431人
學生:	38,211人
校址:	 中國福建省廈門市 本部:思明區思明南路422號 海韻校區:思明區曾厝垵西路 翔安校區:翔安區翔安南路  中國福建省漳州市 漳州校區:龍海市南濱大道300號  馬來西亞分校 吉隆坡在建 2015年招生
校區:	市區(本部、海韻校區) 城鄉(漳州校區、翔安校區) 海外(馬來西亞分校)
總面積:	7868畝(524.5公頃)
電話:	+86-592-2181579
代表色:	藍 白
加入機構:	中華人民共和國教育部


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章