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