溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

構(gòu)建網(wǎng)絡(luò)爬蟲細化分析

發(fā)布時間:2020-05-11 11:58:54 來源:億速云 閱讀:248 作者:Leah 欄目:移動開發(fā)

今天小編就為大家?guī)硪黄獦?gòu)建網(wǎng)絡(luò)爬蟲細化分析的文章。小編覺得挺不錯的,為此分享給大家做個參考。一起跟隨小編過來看看吧。


 框架特性  

  • 強大的節(jié)點過濾能力
  • 支持post與get兩種數(shù)據(jù)提交方式
  • 避免網(wǎng)頁重復處理功能
  • 支持多站點內(nèi)容抓取功能
  • 較強的Html容錯處理
     

框架設(shè)計   網(wǎng)絡(luò)爬蟲
 

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);
 
 
 /**
 * 添加監(jiān)視器
 *
 * @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);
 
 
 /**
 * 設(shè)置URL倉庫
 *
 * @param urlRepository
 */
 void setUrlRepository(UrlRepository urlRepository);
 }
 


 
 一個爬蟲,至少需要包含一個站點訪問器,站點訪問器用于對URL進行訪問。如果沒有匹配的站點訪問器,URL將被忽略,不做繼續(xù)處理。
 一個爬蟲至少需要包含一個監(jiān)視器,監(jiān)視器用于對URL中的內(nèi)容進行過濾,并對命中的節(jié)點進行處理。如果沒有監(jiān)視器,爬蟲爬回的內(nèi)容就沒有任何價&#20540;。
 一個爬蟲至少需要一個Url倉庫,Url倉庫用于對ur進行判斷,是否已經(jīng)抓取并處理過。如果沒有url倉庫,將無法判斷url是否處理過,在非常多的時候,會造成死循環(huán),無法退出。  
 當然,一個爬蟲,也必須能夠?qū)rl進行處理。
 網(wǎng)站訪問者
 由于一個爬蟲可以有多個站點訪問器,因此,需要有isMatch方法告訴爬蟲是否應(yīng)該由自己進行處理。
 訪問方式,可以設(shè)置是通過get還是post方式獲取數(shù)據(jù)。
 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是否已經(jīng)在倉庫中存在
 *
 * @param url
 * @return
 */
 boolean isExist(String url);
 
 
 /**
 * 返回url是否已經(jīng)在倉庫中存在,帶有參數(shù)
 *
 * @param url
 * @param parameter
 * @return
 */
 boolean isExist(String url, Map<String, Object> parameter);
 
 
 /**
 * 如果不存在,則放放,如果已經(jīng)存在,則替換
 *
 * @param url
 * @param content
 */
 void putUrlWithContent(String url, String content);
 
 
 /**
 * 如果不存在,則放放,如果已經(jīng)存在,則替換
 *
 * @param url
 * @param parameter
 * @param content
 */
 void putUrlWithContent(String url, Map<String, Object> parameter,
 String content);
 
 
 /**
 * 如果存在,則返回內(nèi)容;如果不存在,則拋出運行時異常
 *
 * @param url
 * @return
 */
 String getContent(String url);
 
 
 /**
 * 如果存在,則返回內(nèi)容;如果不存在,則拋出運行時異常
 *
 * @param url
 * @param parameter
 * @return
 */
 String getContent(String url, Map<String, Object> parameter);
 }
 


 
 url倉庫用于對url及其內(nèi)容進行管理。由于方法都簡單明了,因此不做更多介紹。
 監(jiān)視器
 

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 {
 /**
 * 設(shè)置節(jié)點過濾器
 *
 * @param filter
 */
 void setNodeFilter(NodeFilter<HtmlNode> filter);
 
 
 /**
 * 獲取節(jié)點過濾器
 *
 * @return
 */
 NodeFilter<HtmlNode> getNodeFilter();
 
 
 /**
 * 添加處理器
 *
 * @param processor
 */
 void addProcessor(Processor processor);
 
 
 /**
 * 獲取處理器列表
 *
 * @return
 */
 List<Processor> getProcessorList();
 }
 


 
 一個監(jiān)視器,必須一個節(jié)點過濾器,但是可以有多個處理器。
 處理器
 

1
 2
 3
 4
 5
 6
 7
 8
public interface Processor {
 /**
 * 處理節(jié)點
 *
 * @param node
 */
 void process(HtmlNode node);
 }
 


 
 處理器非常簡單, 就是對命中的節(jié)點進行處理即可。
 示例 通過訪問[http://www.oschina.net/question?catalog=1]可以看到,里面有許多技術(shù)問答的問題。
 下面我們就來編寫一段程序來把這些標題打出來:
 編寫爬蟲
 

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());
 }
 }
 }
 


 
 運行結(jié)果 輸出結(jié)果可能與結(jié)果不相同,因為數(shù)據(jù)是一直在變化的。
 ?
 

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
約瑟夫環(huán)問題,一段代碼求講解
 求推薦一款分享,回復的前端開源js
 MySQL什么情況使用MyISAM,什么時候使用InnoDB?
 phpstorm中使用搜狗輸入中文出現(xiàn)亂行問題怎樣解決?
 Android中如何實現(xiàn)快播中娛樂風向標的效果
 使用java做手機后臺開發(fā)!
 Chrome 29的alert對話框好漂亮,有木有啊有木有
 Eclipse&#43;ADT&#43;Android環(huán)境配置問題
 關(guān)于android holderview的疑惑
 蛋疼  從一個公司到另外一個公司都是一個人開發(fā)   有木有
 wsunit 官方訪問不了
 android求大神給我看看什么問題
 關(guān)于Hibernate search 查詢結(jié)果與數(shù)據(jù)庫不相符的問題
 求推薦Oracle好的書籍或PDF
 關(guān)于"記事本"的 "自動換行" 的實現(xiàn)
 swing在線html文本編輯器
 android下網(wǎng)絡(luò)阻塞問題
 文件上線系統(tǒng)該如何做(代碼上線)
 ztree節(jié)點設(shè)置成check多選框的時候如何只獲取葉節(jié)點,不要其他節(jié)點
 怎么設(shè)置上傳的圖片不自動壓縮
 js 正則表達式問題
 eclipse 經(jīng)常loading descriptor for XXX ,然后卡死
 關(guān)于android開發(fā)xml顯示問題
 RMI遠程對象是共享的吧?
 參與開源項目如何進行文檔編寫
 php如何以文件圖標的形式列出服務(wù)器上的所有文件?
 php中一個簡單的問題?請幫助解決一下,菜鳥
 請教 solr query分詞查詢,結(jié)果為空的問題
 這段代碼有問題嗎,怎么我運行報錯?
 jquery mobile 頁面中切換閃屏問題
 你幫我改好,我給你講個笑話可好TUT
 asp.net問題:Js如何獲取cookie中的&#20540;?
 android  電話攔截并處理
 iis7 下 php 如何顯示報錯?
 安裝virtualbox的時候提示要安裝通用串行總線控制器,這個要安裝嗎?
 API獲取新浪微博消息
 工廠該不該有默認行為
 如何處理開發(fā)過程中遺留無用的代碼
 ireport 設(shè)計時報表模板時,無法使用sybase驅(qū)動com.sybase.jdbc3.jdbc.SybDriver?
 關(guān)于 使用druid后的一些問題.
 

以上就是構(gòu)建網(wǎng)絡(luò)爬蟲的方法介紹,詳細使用情況還得要大家自己使用過才能知道具體要領(lǐng)。如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI