可能你們看到過有些網站有如下功能(如圖所示) java
這裏顯示的文章的來源網站,並非URL,並且網站的名稱。事實上,這個網站名稱是根據這篇文章的URL推斷出來的,即給你一個網頁的URL,找出這個URL對應的網站名。舉例說,URL爲http://www.sina.com.cn/ ,那麼網站名即是「新浪」。爲了實現這個功能,到網上查了不少資料,沒有發現好的解決方法,只好用一種比較笨的方法來解決。思路是在數據庫建一張表,記錄URL和網站名的映射關係,這樣就能夠直接根據URL查找到對應的網站名了。這種方法是最直接的,但創建這樣一張表,須要手工錄入足夠多的網站URL和網站名,顯然不是一項輕鬆的工做。 web
後來想了想,有沒有這樣的網站,把全部的網站URL和網站名都列出來,這樣我只須要寫一個簡單的程序,從這個網站裏提取信息,保存到數據庫就好了,省下了不少功夫。在百度裏搜索一下,竟然真的找到這種類型的網站:http://top.chinaz.com/list.aspx,這個網站列出了中國排名前5213位的網站URL及網站名,如圖所示: 正則表達式
只要把這些排名網站的信息提取出來,就能夠向數據庫插件5000多個網站的URL及網站名。jsoup這個開源項目能夠很方便地提取網頁內容,下面用jsoup提取網站URL及名稱。 數據庫
1.先到jsoup的官方網下載最新版的JAR包:http://jsoup.org/ 學習
2.jsoup的官網有很詳細的教程,這裏便不介紹其用法了 網站
3.查看http://top.chinaz.com/list.aspx的源代碼,找出要提取的內容的特徵 url
4.根據特徵提取網站URL及名稱,代碼以下: spa
/** * 從http://top.chinaz.com/提取排名前5000多位的網站URL及網站名 * @return */ public Map<String,String> getRealmNameFromChinaz(){ //用於保存網站URL和網站名 Map<String,String> map=new HashMap<String,String>(); Document doc=null; try { //總共有522頁 for(int i=1;i<=522;i++){ //每一頁的連接是有規律的,http://top.chinaz.com/list.aspx?p=第幾頁 doc = Jsoup.connect("http://top.chinaz.com/list.aspx?p="+i).get(); //提取網站名和URL Elements elements=doc.select("div.info a"); for(Element element:elements){ String name=element.text();//網站名 String url=element.nextElementSibling().text();//網站URL map.put(url, name);//保存到map中 } } } catch (IOException e) { e.printStackTrace(); } return map; }
這樣就能夠獲取5000多個網站的URL和網站名了,而後再把這些結果保存到數據庫,供查詢使用。抓取並保存到數據庫,整個過程大概須要3分鐘。 .net
以上方法能夠大大減輕錄入網站URL和網站名的工做,若是須要從其餘網站抓取相似的信息,也能夠採用這種方法。固然,互聯網上的網站不可勝數,想把全部的網站URL和網站名都收錄是不大可能的,咱們只要收錄大部分的主流網站(也就是排名靠前的網站)就好了,剩下的一些網站能夠採用手工錄入的方式,保存到數據中。 插件
把網站的URL和網站名保存到數據庫只是第一部分工做,第二部分工做要作的是根據URL查詢名稱。大多時候,咱們拿到的URL並非www.oschina.net這樣的連接,並且相似http://www.oschina.net/project,這時候須要咱們對URL進行處理,提取原始URL中的域名(即www.oschina.net)。這也不是一件很容易的事,由於網站的域名可能有多級,如http://justjavac.iteye.com/blog/1727586,要把這個網址轉爲www.iteye.com,要費必定功夫。目前提取頂級域名的開源項目有libtld,也能夠本身經過正則表達式等方法實現一個提取頂級域名、二級域名的類,從而完成任務。
注:菜鳥一個,博客內容寫得很膚淺,只是用於記錄工做學習中遇到的一些問題及解決方法,這些方法在別人看來可能不值一提,僅供參考。