劉思林
摘要:隨著大數(shù)據(jù)時代的到來,信息的獲取與檢索尤為重要。如何在海量的數(shù)據(jù)中快速準確獲取到我們需要的內容顯得十分重要。通過對網(wǎng)絡爬蟲的研究和爬蟲框架Scrapy的深入探索,結合Redis這種NoSQL數(shù)據(jù)庫搭建分布式爬蟲框架,并結合Django框架搭建搜索引擎網(wǎng)站,將從知乎,拉鉤,伯樂等網(wǎng)站抓取的有效信息存入ElasticSearch搜索引擎中,供用戶搜索獲取。研究結果表明分布式網(wǎng)絡爬蟲比單機網(wǎng)絡爬蟲效率更高,內容也更豐富準確。
關鍵詞:網(wǎng)絡爬蟲;Scrapy;分布式;Scrapy-Redis;Django;ElasticSearch
中圖分類號:TP311? ? ?文獻標識碼:A? ? ?文章編號:1009-3044(2018)34-0186-03
1 引言
爬蟲的應用領域非常廣泛,目前利用爬蟲技術市面上已經(jīng)存在了比較成熟的搜索引擎產品,如百度,谷歌以及其他垂直領域搜索引擎,這些都是非直接目的的;還有一些推薦引擎,如今日頭條,可以定向給用戶推薦相關新聞;爬蟲還可以用來作為機器學習的數(shù)據(jù)樣本。
論文研究的主要目的是更加透徹的理解爬蟲的相關知識;在熟練運用Python語言的基礎上,更加深入的掌握開源的爬蟲框架Scrapy,為后續(xù)其他與爬蟲相關的業(yè)務奠定理論基礎和數(shù)據(jù)基礎;進一步理解分布式的概念,為大數(shù)據(jù)的相關研究和硬件條件奠定基礎;熟練理解python搭建網(wǎng)站的框架Django,深入理解基于Lucene的搜索服務器ElasticSearch,最終在上述基本知識的基礎上,搭建出一個簡易版本的搜索引擎,實現(xiàn)從網(wǎng)絡上爬取數(shù)據(jù),存儲到分布式的Redis數(shù)據(jù)庫,并最終通過Django和ElasticSearch,實現(xiàn)搜索展現(xiàn)的目的。
2 爬蟲基本原理
網(wǎng)絡爬蟲是一種按照一定規(guī)則,自動抓取萬維網(wǎng)信息的程序或者腳本。如果把互聯(lián)網(wǎng)比作一張大的蜘蛛網(wǎng),數(shù)據(jù)便是存放于蜘蛛網(wǎng)的各個節(jié)點,而爬蟲就是一只小蜘蛛,沿著網(wǎng)絡抓取自己的獵物(數(shù)據(jù))。爬蟲指的是,向網(wǎng)站發(fā)起請求,獲取資源后分析并提取有用數(shù)據(jù)的程序。
從技術層面來說就是通過程序模擬瀏覽器請求站點的行為,把站點返回的HTML代碼,JSON數(shù)據(jù),二進制數(shù)據(jù)(圖片、視頻)等爬到本地,進而提取自己需要的數(shù)據(jù),存放起來供后期使用。
3 Scrapy-Redis分布式爬蟲
3.1 Scrapy
Scrapy的原理如圖1所示:
各個組件的解釋如下:Scrapy Engine(引擎):負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數(shù)據(jù)傳遞等,相當于人的大腦中樞,機器的發(fā)動機等,具有顯著的作用。Scheduler(調度器):負責接收引擎發(fā)送過來的Request請求,并按照一定的方式邏輯進行整理排列,入隊,當引擎需要時,再交還給引擎。Downloader(下載器):負責下載Scrapy Engine(引擎)發(fā)送的所有Requests請求,并將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理。Spider(爬蟲):負責處理所有的Responses,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù),并將需要跟進的URL提交給引擎,再次進入Scheduler(調度器)。Item Pipeline(管道):負責處理Spider中獲取到的Item,并進行后期處理(詳細分析、過濾、存儲等)。Downloader Middlewares(下載中間件):可以當作是一個可以自定義擴展下載功能的組件。Spider Middlewares(Spider中間件):可以理解為是一個可以自定義擴展和操作引擎以及Spider中間通信的功能組件(例如進入Spider的Responses;和從Spider出去的Requests)。
整個Scrapy爬蟲框架執(zhí)行流程可以理解為:爬蟲啟動的時候就會從start_urls提取每一個url,然后封裝成請求,交給engine,engine交給調度器入隊列,調度器入隊列去重處理后再交給下載器去下載,下載返回的響應文件交給parse方法來處理,parse方法可以直接調用xpath方法提取數(shù)據(jù)了。
3.2 Redis
Redis 是完全開源免費的,遵守BSD協(xié)議的,高性能的key-value數(shù)據(jù)庫。Redis 與其他key - value 緩存產品有以下三個特點:(1)Redis支持數(shù)據(jù)的持久化,可以將內存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載進行使用。這樣可以防止數(shù)據(jù)的丟失,在實際生產應用中數(shù)據(jù)的完整性是必須保證的。(2)Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供list,set,zset,hash等數(shù)據(jù)結構的存儲。這些功能更強大的數(shù)據(jù)存儲方式極大地節(jié)約了存儲空間,優(yōu)化了查詢的性能,大大提高了查詢效率。存儲的目的是為了后期更好的取出,Redis很好地做到了這一點。(3)Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。主從結構目前是大數(shù)據(jù)里面的主流結構,主從模式能保證數(shù)據(jù)的健壯性和高可用。當出現(xiàn)電腦宕機,硬盤損壞等重大自然原因時,主從模式能很好的保證存儲的數(shù)據(jù)不丟失,隨時恢復到可用狀態(tài)。正是考慮到Redis的以上強大特點,才選擇Redis作為分布式存儲的數(shù)據(jù)庫。
4 Django搭建搜索網(wǎng)站
Django是一個開放源代碼的Web應用框架,由Python開發(fā)的基于MVC構造的框架。在Django中,控制器接受用戶輸入的部分由框架自行處理,因此更加關注模型,模板和視圖,即MVT。模型(Model),即數(shù)據(jù)存取層,處理與數(shù)據(jù)相關的所有事物:包括如何存取,如何驗證有效性,數(shù)據(jù)之間的關系等。視圖(View),即表現(xiàn)層,處理與表現(xiàn)相關的邏輯,主要是顯示的問題。模板(Template),即業(yè)務邏輯層,主要職責是存取模型以及調取恰當模板的相關邏輯。控制器部分,由Django框架的URLconf來實現(xiàn),而URLconf機制恰恰又是使用正則表達式匹配URL,然后調用合適的函數(shù)。因此只需要寫很少量的代碼,只需關注業(yè)務邏輯部分,大大提高了開發(fā)的效率。使用Django搭建搜索引擎的界面,簡單便捷且界面交互效果良好,適應需求,無須成本。
5 ElasticSearch搜索引擎
ElasticSearch是一個基于Lucene的實時的分布式搜索和分析引擎,設計用于云計算中,能夠達到實時搜索,穩(wěn)定,可靠,快速,安裝使用非常方便?;赗ESTful接口。ElasticSearch具有廣泛的用戶,如DELL,GitHub,Wikipedia等。ElasticSearch和關系型數(shù)據(jù)庫之間的對比如表1所示:
5.1 Elasticsearch-RTF
RTF是Ready To Fly的縮寫,在航模里面,表示無需組裝零件即可直接上手即飛的航空模型。Elasticsearch-RTF是針對中文的一個發(fā)行版,即使用最新穩(wěn)定的Elasticsearch版本,并且下載測試好對應的插件,如中文分詞插件等,目的是可以下載下來就可以直接的使用。項目構建過程中選擇的是Elasticsearch-RTF 5.1.1版本。安裝后啟動,效果如圖2所示:
5.2 Elasticsearch-head
ElasticSearch-head是一個Web前端插件,用于瀏覽ElasticSearch集群并與之進行交互,它可以作為ElasticSearch插件運行,一般首選這種方式,當然它也可以作為獨立的Web應用程序運行。它的通用工具有三大操作:ClusterOverview,顯示當前集群的拓撲,并允許執(zhí)行索引和節(jié)點級別的操作;有幾個搜索接口可以查詢原生Json或表格格式的檢索結果;顯示集群狀態(tài)的幾個快速訪問選項卡;一個允許任意調用RESTful API的輸入部分。
5.3 Kibana
Kibana是一個開源的分析與可視化平臺,設計出來用于和Elasticsearch一起使用的??梢杂胟ibana搜索、查看、交互存放在Elasticsearch索引里的數(shù)據(jù),使用各種不同的圖表、表格、地圖等。kibana能夠很輕易地展示高級數(shù)據(jù)分析與可視化。Kibana使理解大量數(shù)據(jù)變得容易。它簡單、基于瀏覽器的接口能快速創(chuàng)建和分享實時展現(xiàn)Elasticsearch查詢變化的動態(tài)儀表盤。Kibana啟動完成后,可看到插入數(shù)據(jù)和頁面查詢顯示結果如圖3所示:
6 結論
通過對爬蟲理論的相關理解,將互聯(lián)網(wǎng)上海量的信息按需要加以分類和存儲,并最終展示給特定用戶的特定領域需求的信息,避免網(wǎng)上海量信息的視覺沖擊,從而達到準確,高效檢索的目的。利用Python語言以及其豐富的知識庫,結合開源的Scrapy爬蟲框架,能夠高效的將網(wǎng)上海量的信息爬取下來,并利用Redis分布式數(shù)據(jù)庫的特點,將數(shù)據(jù)安全,快速的存入,方便后期的獲取與檢索,使用開源的Django框架搭建搜索引擎網(wǎng)站,提供靈活便捷的可視化操作界面,方便廣大用戶的使用,結合ElasticSearch強大的搜索功能,將所有組件結合到一起,完成搜索引擎的全部功能,最終達到搜索的目的。
參考文獻:
[1] 郭一峰.分布式在線圖書爬蟲系統(tǒng)的設計與實現(xiàn)[D].北京交通大學,2016.
[2] 王敏.分布式網(wǎng)絡爬蟲的研究與實現(xiàn)[D].東南大學,2017.
[3] 胡慶寶,姜曉巍,石京燕,程耀東,梁翠萍.基于Elasticsearch的實時集群日志采集和分析系統(tǒng)實現(xiàn)[J].科研信息化技術與應用,2016,7.
[4] 曾亞飛.基于Elasticsearch的分布式智能搜索引擎的研究與實現(xiàn)[D].重慶大學,2016.
[5] 姚經(jīng)緯,楊福軍.Redis分布式緩存技術在Hadoop平臺上的應用[J].計算機技術與發(fā)展,2017,27(6):146-150+155.
[6] 馬聯(lián)帥.基于Scrapy的分布式網(wǎng)絡新聞抓取系統(tǒng)設計與實現(xiàn)[D].西安電子科技大學,2015.
[7] 吳霖.分布式微信公眾平臺爬蟲系統(tǒng)的研究與應用[D].南華大學,2015.
[8] 李春生.基于WEB信息采集的分布式網(wǎng)絡爬蟲搜索引擎的研究[D].吉林大學,2009.
【通聯(lián)編輯:梁書】