您好,登錄后才能下訂單哦!
今天小編就為大家帶來一篇構建網絡爬蟲細化分析的文章。小編覺得挺不錯的,為此分享給大家做個參考。一起跟隨小編過來看看吧。
框架特性
框架設計 網絡爬蟲
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | public interface Spinder { /** * 添加站點訪問器 * * @param siteVisitor */ void addSiteVisitor(SiteVisitor siteVisitor); /** * 添加監視器 * * @param watcher */ void addWatcher(Watcher watcher); /** * 處理url * * @param url */ void processUrl(String url); /** * 處理url * @param url * @param parameter */ void processUrl(String url, Map<String, Object> parameter); /** * 設置URL倉庫 * * @param urlRepository */ void setUrlRepository(UrlRepository urlRepository); } |
一個爬蟲,至少需要包含一個站點訪問器,站點訪問器用于對URL進行訪問。如果沒有匹配的站點訪問器,URL將被忽略,不做繼續處理。
一個爬蟲至少需要包含一個監視器,監視器用于對URL中的內容進行過濾,并對命中的節點進行處理。如果沒有監視器,爬蟲爬回的內容就沒有任何價值。
一個爬蟲至少需要一個Url倉庫,Url倉庫用于對ur進行判斷,是否已經抓取并處理過。如果沒有url倉庫,將無法判斷url是否處理過,在非常多的時候,會造成死循環,無法退出。
當然,一個爬蟲,也必須能夠對url進行處理。
網站訪問者
由于一個爬蟲可以有多個站點訪問器,因此,需要有isMatch方法告訴爬蟲是否應該由自己進行處理。
訪問方式,可以設置是通過get還是post方式獲取數據。
URL倉庫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | public interface UrlRepository { /** * 返回url是否已經在倉庫中存在 * * @param url * @return */ boolean isExist(String url); /** * 返回url是否已經在倉庫中存在,帶有參數 * * @param url * @param parameter * @return */ boolean isExist(String url, Map<String, Object> parameter); /** * 如果不存在,則放放,如果已經存在,則替換 * * @param url * @param content */ void putUrlWithContent(String url, String content); /** * 如果不存在,則放放,如果已經存在,則替換 * * @param url * @param parameter * @param content */ void putUrlWithContent(String url, Map<String, Object> parameter, String content); /** * 如果存在,則返回內容;如果不存在,則拋出運行時異常 * * @param url * @return */ String getContent(String url); /** * 如果存在,則返回內容;如果不存在,則拋出運行時異常 * * @param url * @param parameter * @return */ String getContent(String url, Map<String, Object> parameter); } |
url倉庫用于對url及其內容進行管理。由于方法都簡單明了,因此不做更多介紹。
監視器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public interface Watcher { /** * 設置節點過濾器 * * @param filter */ void setNodeFilter(NodeFilter<HtmlNode> filter); /** * 獲取節點過濾器 * * @return */ NodeFilter<HtmlNode> getNodeFilter(); /** * 添加處理器 * * @param processor */ void addProcessor(Processor processor); /** * 獲取處理器列表 * * @return */ List<Processor> getProcessorList(); } |
一個監視器,必須一個節點過濾器,但是可以有多個處理器。
處理器
1 2 3 4 5 6 7 8 | public interface Processor { /** * 處理節點 * * @param node */ void process(HtmlNode node); } |
處理器非常簡單, 就是對命中的節點進行處理即可。
示例 通過訪問[http://www.oschina.net/question?catalog=1]可以看到,里面有許多技術問答的問題。
下面我們就來編寫一段程序來把這些標題打出來:
編寫爬蟲
1 2 3 4 5 6 7 8 9 10 11 | public static void main(String[] args) { Spinder spinder = new SpinderImpl(); Watcher watcher = new WatcherImpl(); watcher.addProcessor(new PrintOsChinaProcessor()); QuickNameFilter<HtmlNode> nodeFilter = new QuickNameFilter<HtmlNode>(); nodeFilter.setNodeName("div"); nodeFilter.setIncludeAttribute("class", "qbody"); watcher.setNodeFilter(nodeFilter); spinder.addWatcher(watcher); spinder.processUrl("http://www.oschina.net/question?catalog=1"); } |
編寫處理器
1 2 3 4 5 6 7 8 9 10 11 | public class PrintOsChinaProcessor implements Processor { public void process(HtmlNode node) { FastNameFilter<HtmlNode> filter = new FastNameFilter<HtmlNode>(node); filter.setNodeName("h3"); filter.setIncludeNode("a"); HtmlNode h4 = filter.findNode(); if (h4 != null) { System.out.println(h4.getSubNode("a").getContent()); } } } |
運行結果 輸出結果可能與結果不相同,因為數據是一直在變化的。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 約瑟夫環問題,一段代碼求講解 求推薦一款分享,回復的前端開源js MySQL什么情況使用MyISAM,什么時候使用InnoDB? phpstorm中使用搜狗輸入中文出現亂行問題怎樣解決? Android中如何實現快播中娛樂風向標的效果 使用java做手機后臺開發! Chrome 29的alert對話框好漂亮,有木有啊有木有 Eclipse+ADT+Android環境配置問題 關于android holderview的疑惑 蛋疼 從一個公司到另外一個公司都是一個人開發 有木有 wsunit 官方訪問不了 android求大神給我看看什么問題 關于Hibernate search 查詢結果與數據庫不相符的問題 求推薦Oracle好的書籍或PDF 關于"記事本"的 "自動換行" 的實現 swing在線html文本編輯器 android下網絡阻塞問題 文件上線系統該如何做(代碼上線) ztree節點設置成check多選框的時候如何只獲取葉節點,不要其他節點 怎么設置上傳的圖片不自動壓縮 js 正則表達式問題 eclipse 經常loading descriptor for XXX ,然后卡死 關于android開發xml顯示問題 RMI遠程對象是共享的吧? 參與開源項目如何進行文檔編寫 php如何以文件圖標的形式列出服務器上的所有文件? php中一個簡單的問題?請幫助解決一下,菜鳥 請教 solr query分詞查詢,結果為空的問題 這段代碼有問題嗎,怎么我運行報錯? jquery mobile 頁面中切換閃屏問題 你幫我改好,我給你講個笑話可好TUT asp.net問題:Js如何獲取cookie中的值? android 電話攔截并處理 iis7 下 php 如何顯示報錯? 安裝virtualbox的時候提示要安裝通用串行總線控制器,這個要安裝嗎? API獲取新浪微博消息 工廠該不該有默認行為 如何處理開發過程中遺留無用的代碼 ireport 設計時報表模板時,無法使用sybase驅動com.sybase.jdbc3.jdbc.SybDriver? 關于 使用druid后的一些問題. |
以上就是構建網絡爬蟲的方法介紹,詳細使用情況還得要大家自己使用過才能知道具體要領。如果想了解更多相關內容,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。