陶興海
摘 要根據互聯網實際情況,提出分布式爬蟲模型,基于Scrapy框架,進行代碼實現,且該開發方式可以迅速進行對不同主題的數據爬取的移植,滿足不同專業方向的基于互聯網大數據分析需要。
【關鍵詞】網絡爬蟲 Scrapy-redis 分布式
1 基本概念
分布式爬蟲:分布式方式是以共同爬取為目標,形成多爬蟲協同工作的模式,每個爬蟲需要獨立完成單項爬取任務,下載網頁并保存。
Scrapy-redis:一個三方的基于redis數據庫實現的分布式方式,配合scrapy爬蟲框架使用,讓scrapy具有了分布式爬取的功能。
2 分布式爬蟲技術方案
Scrapy-redis分布式爬蟲的基本設計理念為主從模式,由作為主控端負責所有網絡子爬蟲的管理,子爬蟲只需要從主控端那里接收任務,并把新生成任務提交給主控端,在整個爬取的過程中不必與其他爬蟲通信。
主要有幾個技術關鍵點:
2.1 子爬蟲爬取任務的分發
通過在主控端安裝一個redis數據庫,維護統一的任務列表,子爬蟲每次連接redis庫調用lpop()方法,生成一個任務,并生成一個request,接下去就是如同一般爬蟲工作。
2.2 用戶登錄
由于網站對于游客的訪問有限制,為了爬取所需信息,必須在程序中實現用戶登錄,其原理就是能獲取到有效的本地cookie,并利用該cookie進行網站訪問,除了一般能夠用第三方庫進行圖像識別的驗證方式外,一般采用瀏覽器中手動登錄,通過網絡工具截取有效的cookie,然后在爬蟲生成request時附帶上cookie。
2.3 url的去重
scrapy_redis有一個dupefilter文件中包含RFPDupeFilter類用于過濾新增的url,可以在該類request_seen中利用redis的key的查找功能,如果所爬取的任務數以億計則建議Bloomfilter去重的方式對于URL的存儲和操作方式進行優化,雖然該方式會造成小于萬分之一的過濾遺失率。
2.4 數據寫入
選擇非關系性數據庫MongoDB作為硬盤數據庫與scrapy進行搭配使用,在pipeline中對item數據進行MongoDB的寫入操作。
3 基本實現步驟
配置:Windows7 64-bit、Python:2.7.11、 Anaconda 4.0.0 (64-bit)、IDE:Pycharm 3.4.1、Scrapy:1.3.2Redis:X64-3.2、MongoDB:3.2.12
代碼實現需要對幾個文件進行設置和編寫:items、settings、spiders、pipelines。
Items:這是一個爬取數據的基礎數據結構類,由其來存放爬蟲爬取的鍵值性數據,關鍵的就是這條語句:_id = Field() _id表示的生成一個數據對象,在Items中可以根據需要設定多個數據對象。
Settings:ITEM_PIPELINES該參數決定了item的處理方法;DOWNLOAD_DELAY這個是下載的間隔時間;SCHEDULER指定作為總的任務協調器的類;SCHEDULER_QUEUE_CLASS這個參數是設定處理URL的隊列的工作模式一共有四種,一般選用SpiderSimpleQueue即可。
spiders:該文件就是爬蟲主要功能的實現,首先設定該爬蟲的基本信息:name、domain、redis_key、start_urls。爬蟲的第一步都是執行方法start_requests,其中核心語句yield Request(url,callback)用以根據url產生一個request并且將response結果回傳給callback方法。callback的方法中一般利用xpath或者正則表達式對response中包含的html代碼進行解析,產生所需要的數據以及新的任務url。
pipelines:該文件作為數據處理、存儲的代碼段,將在items數據被創建后被調用,其中process_item的方法就是被調用的方法,所以一定要將其重寫,根據實際需要把數據利用方法dict()轉化為字典數據,最后寫入MongoDB。
完成編寫后,在部署的時候,start_url的隊列只能是第一個運行的爬蟲進行初始化,后續運行的爬蟲只能是把新的url進行寫入不能對其進行再次初始化,部署爬蟲的步驟也很簡單,只需要把相關的代碼拷貝到目標電腦上,讓后cmd命令進入spiders的文件夾,運行命令scrapy crawl XXXX,其中XXXX就是爬蟲的名字,就完成了爬蟲的部署和運行了。
4 結語
爬蟲的實現,除了基本的步驟和參數設置之外,需要開發者根據實際網站以及數據情況,針對性的對爬取的策略、數據的去重、數據篩選進行處理,對于爬蟲的性能進行有效優化,為之后的數據分析做好良好的數據準備。同時,根據需要可以考慮時間的因素加入到數據結構中,這就要求爬蟲能夠通過數據的時間去進行增量爬取。
參考文獻
[1]使用redis如何實現一個網路分布式爬蟲[OL].http://www.oschina.net/code/snippet_209440_20495/.
[2]scrapy_redis的使用詳解[OL].http://www.cnblogs.com/kylinlin/p/5198233.html.http://blog.csdn.net/u012150179/article/details/38091411.
[3]scrapy_redis的去重優化[OL].http://blog.csdn.net/bone_ace/article/details/53099042.
[4]scrapy_redis實現分布式爬取分析[OL].http://blog.csdn.net/u012150179/article/details/38091411.
作者單位
廣西廣播電視大學教學資源中心 廣西壯族自治區南寧市 530023