摘要:分布式爬蟲(chóng)框架詳解隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展與應(yīng)用的普及,網(wǎng)絡(luò)作為信息的載體,已經(jīng)成為社會(huì)大眾參與社會(huì)生活的一種重要信息渠道。下載器中間件位于引擎和下載器之間的框架,主要是處理引擎與下載器之間的請(qǐng)求及響應(yīng)。
scrapy-redis分布式爬蟲(chóng)框架詳解
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展與應(yīng)用的普及,網(wǎng)絡(luò)作為信息的載體,已經(jīng)成為社會(huì)大眾參與社會(huì)生活的一種重要信息渠道。由于互聯(lián)網(wǎng)是開(kāi)放的,每個(gè)人都可以在網(wǎng)絡(luò)上發(fā)表信息,內(nèi)容涉及各個(gè)方面。小到心情日志,大到國(guó)家大事。
互聯(lián)網(wǎng)已成為思想文化信息的集散地,并具有傳統(tǒng)媒體無(wú)法相比的優(yōu)勢(shì):便捷性,虛擬性,互動(dòng)性,多元性。網(wǎng)絡(luò)新聞熱點(diǎn)通常形成迅速,多是人們對(duì)于日常生活中的各種問(wèn)題發(fā)表的各種意見(jiàn),評(píng)論,態(tài)度,情緒等,隨著事件的發(fā)展而變化,是反映社會(huì)熱點(diǎn)的重要載體之一。
相比較而言,編寫爬蟲(chóng)程序獲取到的海量數(shù)據(jù)更為真實(shí)、全面,在信息繁榮的互聯(lián)網(wǎng)時(shí)代更為行之有效。因此編寫爬蟲(chóng)程序成為大數(shù)據(jù)時(shí)代信息收集的必備技能。
本文主要介紹爬蟲(chóng)收集數(shù)據(jù)優(yōu)點(diǎn)、爬蟲(chóng)原理、scrapy爬蟲(chóng)框架,并以新聞爬取為例,詳細(xì)講解使用scrapy爬取數(shù)據(jù)的步驟以及scrapy-redis分布式。
一、爬蟲(chóng)收集數(shù)據(jù)的優(yōu)點(diǎn)大數(shù)據(jù)時(shí)代下,人類社會(huì)的數(shù)據(jù)正以前所未有的速度增長(zhǎng),傳統(tǒng)的獲取數(shù)據(jù)的方式如問(wèn)卷調(diào)查、訪談法等,其樣本容量小、信度低、且受經(jīng)費(fèi)和地域范圍所限,因而收集的數(shù)據(jù)往往無(wú)法客觀反映研究對(duì)象,有著較大的局限性。
以不能滿足高質(zhì)量研究的需求。正如Ivor的理論所揭示的,如果輸入的是無(wú)效信息,無(wú)論處理的程序如何精良,輸出的都是無(wú)用信息“Garbage In,Garbage Out”??梢?jiàn),對(duì)比傳統(tǒng)的數(shù)據(jù)收集方法,立足于海量數(shù)據(jù)的研究有以下的優(yōu)點(diǎn):
(一)數(shù)據(jù)的真實(shí)性
數(shù)據(jù)的真實(shí)性,使用問(wèn)卷調(diào)查法收集的數(shù)據(jù),調(diào)查者難以了解被調(diào)查者是認(rèn)真填寫還是敷衍了事。使得得到的數(shù)據(jù)真實(shí)性不可靠,而通過(guò)爬蟲(chóng)技術(shù)能快速獲取真實(shí)、客觀的用戶信息,如在社交網(wǎng)絡(luò)上對(duì)一個(gè)公司的評(píng)價(jià)顯然要比問(wèn)卷調(diào)查真實(shí),淘寶、美團(tuán)上消費(fèi)者對(duì)賣家的評(píng)論就比較客觀的反應(yīng)了商品的質(zhì)量。
(二)樣本容量
人類當(dāng)初發(fā)明計(jì)算機(jī)是因?yàn)樵诙?zhàn)時(shí)期工程師們已經(jīng)無(wú)法計(jì)算導(dǎo)彈的飛行軌跡,龐大的計(jì)算量迫使了計(jì)算機(jī)的發(fā)明,可見(jiàn)計(jì)算機(jī)天生就是來(lái)處理大規(guī)模批量的數(shù)據(jù),把人們從繁重的勞動(dòng)中解放出來(lái)。在同樣的成本下,人工采集和計(jì)算機(jī)采集的數(shù)據(jù)量不是一個(gè)量級(jí)的,爬蟲(chóng)可以對(duì)互聯(lián)網(wǎng)上的海量數(shù)據(jù)進(jìn)行收集、分析,能更好的反應(yīng)客觀事實(shí),而數(shù)據(jù)越全面,分析研究的結(jié)果也就越真實(shí)。
網(wǎng)絡(luò)爬蟲(chóng)(Web crawler),是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本,我們?yōu)g覽的網(wǎng)頁(yè)數(shù)以億計(jì),它們?cè)谑澜绺鞯氐姆?wù)器上存儲(chǔ)著。用戶點(diǎn)擊一個(gè)網(wǎng)頁(yè)的超鏈接以跳轉(zhuǎn)的方式來(lái)獲取另一個(gè)頁(yè)面的信息,而跳轉(zhuǎn)的頁(yè)面又有鏈接存在,網(wǎng)頁(yè)便由超鏈接組成一個(gè)巨大且錯(cuò)綜復(fù)雜的網(wǎng)。而Web爬蟲(chóng)(Crawler),也稱蜘蛛(Spider),則是穿梭在這巨大的互聯(lián)網(wǎng)中下載網(wǎng)頁(yè)解析內(nèi)容的程序。它們被廣泛用于互聯(lián)網(wǎng)搜索引擎,可以自動(dòng)采集所有其能夠訪問(wèn)到的頁(yè)面內(nèi)容,以獲取或更新這些網(wǎng)站的內(nèi)容和檢索方式。
(一)爬蟲(chóng)的應(yīng)用
在商務(wù)智能上,企業(yè)使用爬蟲(chóng)收集競(jìng)爭(zhēng)對(duì)手的情報(bào)或在社交網(wǎng)絡(luò)、虛擬社區(qū)上爬取用戶對(duì)企業(yè)的評(píng)價(jià)從而在產(chǎn)品服務(wù)上做出改進(jìn)等。在數(shù)據(jù)研究上,爬蟲(chóng)能快速收集互聯(lián)網(wǎng)上的信息,為數(shù)據(jù)分析提供原始資料。
(二)爬蟲(chóng)算法流程
從功能上來(lái)講,爬蟲(chóng)一般分為數(shù)據(jù)采集,處理,儲(chǔ)存三個(gè)部分。傳統(tǒng)爬蟲(chóng)從一個(gè)或若干初始網(wǎng)頁(yè)的URL開(kāi)始,獲得初始網(wǎng)頁(yè)上的URL,在抓取網(wǎng)頁(yè)的過(guò)程中,不斷從當(dāng)前頁(yè)面上抽取新的URL放入隊(duì)列,直到滿足系統(tǒng)的一定停止條件。聚焦爬蟲(chóng)的工作流程較為復(fù)雜,需要根據(jù)一定的網(wǎng)頁(yè)分析算法過(guò)濾與主題無(wú)關(guān)的鏈接,保留有用的鏈接將其放入等待抓取的URL隊(duì)列。然后,它將根據(jù)一定的搜索策略從隊(duì)列中選擇下一步要抓取的網(wǎng)頁(yè)URL,并重復(fù)上述過(guò)程,直到達(dá)到系統(tǒng)的某一條件時(shí)停止。另外,所有被爬蟲(chóng)抓取的網(wǎng)頁(yè)將會(huì)被系統(tǒng)存貯,進(jìn)行一定的分析、過(guò)濾,并建立索引,以便之后的查詢和檢索;對(duì)于聚焦爬蟲(chóng)來(lái)說(shuō),這一過(guò)程所得到的分析結(jié)果還可能對(duì)以后的抓取過(guò)程給出反饋和指導(dǎo)。
圖1:爬蟲(chóng)算法流程圖
Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架??梢詰?yīng)用在包括數(shù)據(jù)挖掘,信息處理或存儲(chǔ)歷史數(shù)據(jù)等一系列的程序中。其最初是為了頁(yè)面抓取 (更確切來(lái)說(shuō), 網(wǎng)絡(luò)抓取 )所設(shè)計(jì)的, 也可以應(yīng)用在獲取API所返回的數(shù)據(jù)(例如 Amazon Associates Web Services ) 或者通用的網(wǎng)絡(luò)爬蟲(chóng)。Scrapy用途廣泛,可以用于數(shù)據(jù)挖掘、監(jiān)測(cè)和自動(dòng)化測(cè)試。
(一)scrapy整體架構(gòu)圖
圖2:scrapy架構(gòu)圖 (二)Scrapy主要組件 1、引擎(Scrapy): 用來(lái)處理整個(gè)系統(tǒng)的數(shù)據(jù)流處理, 觸發(fā)事務(wù)(框架核心)。 2、調(diào)度器(Scheduler): 用來(lái)接受引擎發(fā)過(guò)來(lái)的請(qǐng)求, 壓入隊(duì)列中, 并在引擎再次請(qǐng)求的時(shí)候返回. 可以想像成一個(gè)URL(抓取網(wǎng)頁(yè)的網(wǎng)址或者說(shuō)是鏈接)的優(yōu)先隊(duì)列, 由它來(lái)決定下一個(gè)要抓取的網(wǎng)址是什么, 同時(shí)去除重復(fù)的網(wǎng)址。 3、下載器(Downloader): 用于下載網(wǎng)頁(yè)內(nèi)容, 并將網(wǎng)頁(yè)內(nèi)容返回給蜘蛛(Scrapy下載器是建立在twisted這個(gè)高效的異步模型上的)。 4、爬蟲(chóng)(Spiders): 爬蟲(chóng)是主要干活的, 用于從特定的網(wǎng)頁(yè)中提取自己需要的信息, 即所謂的實(shí)體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續(xù)抓取下一個(gè)頁(yè)面。 5、項(xiàng)目管道(Pipeline): 負(fù)責(zé)處理爬蟲(chóng)從網(wǎng)頁(yè)中抽取的實(shí)體,主要的功能是持久化實(shí)體、驗(yàn)證實(shí)體的有效性、清除不需要的信息。當(dāng)頁(yè)面被爬蟲(chóng)解析后,將被發(fā)送到項(xiàng)目管道,并經(jīng)過(guò)幾個(gè)特定的次序處理數(shù)據(jù)。 6、下載器中間件(Downloader Middlewares): 位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請(qǐng)求及響應(yīng)。 7、爬蟲(chóng)中間件(Spider Middlewares): 介于Scrapy引擎和爬蟲(chóng)之間的框架,主要工作是處理蜘蛛的響應(yīng)輸入和請(qǐng)求輸出。 8、調(diào)度中間件(Scheduler Middewares): 介于Scrapy引擎和調(diào)度之間的中間件,從Scrapy引擎發(fā)送到調(diào)度的請(qǐng)求和響應(yīng)。四、爬蟲(chóng)實(shí)戰(zhàn)項(xiàng)目
(一)scrapy安裝
Scrapy框架官方網(wǎng)址:http://doc.scrapy.org/en/latest
Scrapy中文維護(hù)站點(diǎn):http://scrapy-chs.readthedocs...
1、Ubuntu下安裝
sudo pip install scrapy
2、mac下安裝
sudo pip install scrapy
3、Windows下安裝
Windows下安裝scrapy會(huì)出現(xiàn)各種依賴和不兼容,個(gè)人建議先安裝anaconda,它是一個(gè)開(kāi)源的、免費(fèi)的python類庫(kù)的集合,貌似一下就安裝了200+的包,各種依賴包各種搞定,專治各種不服。anaconda下載鏈接。
安裝命令: conda install scrapy
4、安裝后,只要在命令終端輸入 scrapy,提示類似以下結(jié)果,代表已經(jīng)安裝成功
圖3:scrapy安裝成功 (二)新建scrapy項(xiàng)目(scrapy startproject)
在開(kāi)始爬取之前,必須創(chuàng)建一個(gè)新的Scrapy項(xiàng)目。進(jìn)入自定義的項(xiàng)目目錄中,運(yùn)行下列命令,命令執(zhí)行完后程序目錄結(jié)構(gòu)大致如下:
scrapy startproject tutorial #創(chuàng)建項(xiàng)目
圖4:目錄結(jié)構(gòu)圖
下面來(lái)簡(jiǎn)單介紹一下各個(gè)主要文件的作用:
scrapy.cfg:項(xiàng)目的配置文件
tutorial/:項(xiàng)目的Python模塊,將會(huì)從這里引用代碼
tutorial/items.py:項(xiàng)目的字段定義文件
tutorial/pipelines.py:項(xiàng)目的管道文件
tutorial/settings.py:項(xiàng)目的設(shè)置文件
tutorial/spiders/:存儲(chǔ)爬蟲(chóng)代碼目錄
(三)定義存儲(chǔ)對(duì)象(tutorial/items.py)
Items是裝載我們抓取數(shù)據(jù)的容器。它們工作像簡(jiǎn)單的Python字典,它提供更多的保護(hù),比如對(duì)未定義的字段提供填充功能防止出錯(cuò).
Itmes.py
(四)制作爬蟲(chóng) (tutorial/spiders/)
1、在當(dāng)前目錄下輸入命令,將在tutorial/spider目錄下創(chuàng)建一個(gè)名為hsw的爬蟲(chóng),并指定爬取域的范圍:
`scrapy genspider hsw "hsw.cn"` #創(chuàng)建爬蟲(chóng)
2、打開(kāi) tutorial/spider目錄里的 hsw.py,默認(rèn)增加了下列代碼:
hsw.py
3、要建立一個(gè)Spider, 你必須用scrapy.Spider類創(chuàng)建一個(gè)子類,并確定了三個(gè)強(qiáng)制的屬性 和 一個(gè)方法。
(1) name ="":這個(gè)爬蟲(chóng)的識(shí)別名稱,必須是唯一的,在不同的爬蟲(chóng)必須定義不同的名字。
(2) allow_domains=[]是搜索的域名范圍,也就是爬蟲(chóng)的約束區(qū)域,規(guī)定爬蟲(chóng)只爬取這個(gè)域名下的網(wǎng)頁(yè),不存在的URL會(huì)被忽略。
(3) start_urls=():爬取的URL元祖/列表。爬蟲(chóng)從這里開(kāi)始抓取數(shù)據(jù),所以,第一次下載的數(shù)據(jù)將會(huì)從這些urls開(kāi)始。其他子URL將會(huì)從這些起始URL中繼承性生成。
(4) parse(self,
response):解析的方法,每個(gè)初始URL完成下載后將被調(diào)用,調(diào)用的時(shí)候傳入從每一個(gè)URL傳回的Response對(duì)象來(lái)作為唯一參數(shù),主要作用如下:
a) 負(fù)責(zé)解析返回的網(wǎng)頁(yè)數(shù)據(jù)(response.body),提取結(jié)構(gòu)化數(shù)據(jù)(生成item) b) 生成需要下一頁(yè)的URL請(qǐng)求。
4、修改parse方法,添加parse_item方法
現(xiàn)在我們修改hsw.py文件將start_urls的值修改為需要爬取的第一個(gè)url
start_urls = ["http://finance.hsw.cn/hyxw/index.shtml"]
這里先簡(jiǎn)單介紹下xpath語(yǔ)法(詳見(jiàn)官方文檔:http://www.w3school.com.cn/xm...)
(1) //div[@class="listleft"]/ul/li/h3/a/@href
表示選擇所有含有屬性class等于listleft的dev元素下方的ul->li->h3下方a標(biāo)簽的herf屬性,取列表頁(yè)所有內(nèi)容頁(yè)url。
(2) //div[@class="hd"]/h1/text()
表示選擇所有含有屬性class等于hd的dev元素下方的h1標(biāo)簽,取文章標(biāo)題。
(3) //div[@class="photoarea"]//p/text()|//div[@class="contentBox
cf"]//p/text() 同上,由于網(wǎng)頁(yè)中存在多種不同的頁(yè)面結(jié)構(gòu),需要兼容,故使用“|”語(yǔ)法,表示或的意思,取文章正文。
(4) //span[@class="article-time"]/text() 語(yǔ)法同上,取文章的發(fā)布時(shí)間。
5、然后運(yùn)行一下看看,在tutorial目錄下執(zhí)行:
scrapy crawl hws -o hws.csv
輸出信息保存csv格式,用Excel打開(kāi)數(shù)據(jù)如下圖所示:
圖6:Excel數(shù)據(jù)
scrapy保存信息的最簡(jiǎn)單的方法主要有四種,-o 輸出指定格式的文件,命令如下:
json格式,默認(rèn)為Unicode編碼
scrapy crawl hws -o hws.json
json lines格式,默認(rèn)為Unicode編碼
scrapy crawl hws -o hws.jsonl
csv 逗號(hào)表達(dá)式,可用Excel打開(kāi)
scrapy crawl hws -o hws.csv
xml格式
scrapy crawl hws -o hws.xml五、scrapy-redis分布式
scrapy是python界出名的一個(gè)爬蟲(chóng)框架。Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架??梢詰?yīng)用在包括數(shù)據(jù)挖掘,信息處理或存儲(chǔ)歷史數(shù)據(jù)等一系列的程序中。
雖然scrapy能做的事情很多,但是要做到大規(guī)模的分布式應(yīng)用則捉襟見(jiàn)肘。有能人改變了scrapy的隊(duì)列調(diào)度,將起始的網(wǎng)址從start_urls里分離出來(lái),改為從redis讀取,多個(gè)客戶端可以同時(shí)讀取同一個(gè)redis,從而實(shí)現(xiàn)了分布式的爬蟲(chóng)。
(一)scrapy-redis安裝
安裝:pip install scrapy-redis 官方站點(diǎn):https://github.com/rolando/scrapy-redis
(二)scrapy-redis架構(gòu)
圖7:scrapy-redis架構(gòu)
(三)scrapy-Redis組件詳解
如上圖所示,scrapy-redis在scrapy的架構(gòu)上增加了redis,基于redis的特性拓展了如下四種組件:Scheduler,Duplication Filter,Item Pipeline,Base Spider
1、Scheduler: scrapy改造了python本來(lái)的collection.deque(雙向隊(duì)列)形成了自己的Scrapy
queue,但是Scrapy多個(gè)spider不能共享待爬取隊(duì)列Scrapy
queue,即Scrapy本身不支持爬蟲(chóng)分布式,scrapy-redis 的解決是把這個(gè)Scrapy
queue換成redis數(shù)據(jù)庫(kù)(也是指redis隊(duì)列),從同一個(gè)redis-server存放要爬取的request,便能讓多個(gè)spider去同一個(gè)數(shù)據(jù)庫(kù)里讀取。Scrapy中跟“待爬隊(duì)列”直接相關(guān)的就是調(diào)度器Scheduler,它負(fù)責(zé)對(duì)新的request進(jìn)行入列操作(加入Scrapy
queue),取出下一個(gè)要爬取的request(從Scrapy
queue中取出)等操作。它把待爬隊(duì)列按照優(yōu)先級(jí)建立了一個(gè)字典結(jié)構(gòu),然后根據(jù)request中的優(yōu)先級(jí),來(lái)決定該入哪個(gè)隊(duì)列,出列時(shí)則按優(yōu)先級(jí)較小的優(yōu)先出列。為了管理這個(gè)比較高級(jí)的隊(duì)列字典,Scheduler需要提供一系列的方法。但是原來(lái)的Scheduler已經(jīng)無(wú)法使用,所以使用Scrapy-redis的scheduler組件。
2、Duplication Filter
Scrapy中用集合實(shí)現(xiàn)這個(gè)request去重功能,Scrapy中把已經(jīng)發(fā)送的request指紋放入到一個(gè)集合中,把下一個(gè)request的指紋拿到集合中比對(duì),如果該指紋存在于集合中,說(shuō)明這個(gè)request發(fā)送過(guò)了,如果沒(méi)有則繼續(xù)操作。這個(gè)核心的判重功能是這樣實(shí)現(xiàn)的:
在scrapy-redis中去重是由Duplication Filter組件來(lái)實(shí)現(xiàn)的,它通過(guò)redis的set不重復(fù)的特性,巧妙的實(shí)現(xiàn)了DuplicationFilter去重。scrapy-redis調(diào)度器從引擎接受request,將request的指紋存入redis的set檢查是否重復(fù),并將不重復(fù)的request push寫入redis的 request queue。引擎請(qǐng)求request(Spider發(fā)出的)時(shí),調(diào)度器從redis的request queue隊(duì)列里根據(jù)優(yōu)先級(jí)pop 出?個(gè)request 返回給引擎,引擎將此request發(fā)給spider處理。
3、Item Pipeline:
引擎將(Spider返回的)爬取到的Item給Item Pipeline,scrapy-redis 的Item Pipeline將爬取到的
Item 存入redis的 items queue。修改過(guò)Item Pipeline可以很方便的根據(jù) key 從 items queue
提取item,從而實(shí)現(xiàn) items processes集群。
4、Base Spider
不在使用scrapy原有的Spider類,重寫的RedisSpider繼承了Spider和RedisMixin這兩個(gè)類,RedisMixin是用來(lái)從redis讀取url的類。當(dāng)我們生成一個(gè)Spider繼承RedisSpider時(shí),調(diào)用setup_redis函數(shù),這個(gè)函數(shù)會(huì)去連接redis數(shù)據(jù)庫(kù),然后會(huì)設(shè)置signals(信號(hào)):一個(gè)是當(dāng)spider空閑時(shí)候的signal,會(huì)調(diào)用spider_idle函數(shù),這個(gè)函數(shù)調(diào)用schedule_next_request函數(shù),保證spider是一直活著的狀態(tài),并且拋出DontCloseSpider異常。一個(gè)是當(dāng)抓到一個(gè)item時(shí)的signal,會(huì)調(diào)用item_scraped函數(shù),這個(gè)函數(shù)會(huì)調(diào)用schedule_next_request函數(shù),獲取下一個(gè)request。
5、 總結(jié)
總結(jié)一下scrapy-redis的總體思路:這套組件通過(guò)重寫scheduler和spider類,實(shí)現(xiàn)了調(diào)度、spider啟動(dòng)和redis的交互;實(shí)現(xiàn)新的dupefilter和queue類,達(dá)到了判重和調(diào)度容器和redis的交互,因?yàn)槊總€(gè)主機(jī)上的爬蟲(chóng)進(jìn)程都訪問(wèn)同一個(gè)redis數(shù)據(jù)庫(kù),所以調(diào)度和判重都統(tǒng)一進(jìn)行統(tǒng)一管理,達(dá)到了分布式爬蟲(chóng)的目的;當(dāng)spider被初始化時(shí),同時(shí)會(huì)初始化一個(gè)對(duì)應(yīng)的scheduler對(duì)象,這個(gè)調(diào)度器對(duì)象通過(guò)讀取settings,配置好自己的調(diào)度容器queue和判重工具dupefilter;
每當(dāng)一個(gè)spider產(chǎn)出一個(gè)request的時(shí)候,scrapy引擎會(huì)把這個(gè)reuqest遞交給這個(gè)spider對(duì)應(yīng)的scheduler對(duì)象進(jìn)行調(diào)度,scheduler對(duì)象通過(guò)訪問(wèn)redis對(duì)request進(jìn)行判重,如果不重復(fù)就把他添加進(jìn)redis中的調(diào)度器隊(duì)列里。當(dāng)調(diào)度條件滿足時(shí),scheduler對(duì)象就從redis的調(diào)度器隊(duì)列中取出一個(gè)request發(fā)送給spider,讓他爬取;
當(dāng)spider爬取的所有暫時(shí)可用url之后,scheduler發(fā)現(xiàn)這個(gè)spider對(duì)應(yīng)的redis的調(diào)度器隊(duì)列空了,于是觸發(fā)信號(hào)spider_idle,spider收到這個(gè)信號(hào)之后,直接連接redis讀取strart_url池,拿去新的一批url入口,然后再次重復(fù)上邊的工作。
(四)從零搭建scrapy-redis分布式爬蟲(chóng)
1、scrapy-Redis分布式策略:
Slaver端從Master端拿任務(wù)(Request/url/ID)進(jìn)行數(shù)據(jù)抓取,在抓取數(shù)據(jù)的同時(shí)也生成新任務(wù),并將任務(wù)拋給Master。Master端只有一個(gè)Redis數(shù)據(jù)庫(kù),負(fù)責(zé)對(duì)Slaver提交的任務(wù)進(jìn)行去重、加入待爬隊(duì)列。優(yōu)點(diǎn):scrapy-redis默認(rèn)使用的就是這種策略,我們實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,因?yàn)槿蝿?wù)調(diào)度等工作scrapy-redis都已經(jīng)幫我們做好了,我們只需要繼承RedisSpider、指定redis_key就行了。
缺點(diǎn):scrapy-redis調(diào)度的任務(wù)是Request對(duì)象,里面信息量比較大(不僅包含url,還有callback函數(shù)、headers等信息),導(dǎo)致的結(jié)果就是會(huì)降低爬蟲(chóng)速度、而且會(huì)占用Redis大量的存儲(chǔ)空間。當(dāng)然我們可以重寫方法實(shí)現(xiàn)調(diào)度url。
圖6:scrapy-redis分布式策略
2、安裝Redis
下載redis:http://redis.io/download
安裝完成后,拷貝一份Redis安裝目錄下的redis.conf到任意目錄,建議保存到:/etc/redis/redis.conf 打開(kāi)你的redis.conf配置文件,示例: 非Windows系統(tǒng): sudo vim /etc/redis/redis.conf Master端redis.conf里注釋bind 127.0.0.1,Slave端才能遠(yuǎn)程連接到Master端的Redis數(shù)據(jù)庫(kù)。
3、創(chuàng)建項(xiàng)目
使用上面的scrapy的項(xiàng)目我們來(lái)修改一下,這個(gè)爬蟲(chóng)繼承了RedisSpider,它能夠支持分布式的抓取,采用的是basic spider,需要寫parse函數(shù)。其次就是不再有start_urls了,取而代之的是redis_key,scrapy-redis將key從Redis里pop出來(lái),成為請(qǐng)求的url地址。
修改spiders/hsw.py
修改settings.py
4、執(zhí)行程序
通過(guò)runspider方法執(zhí)行爬蟲(chóng)的py文件(也可以分次執(zhí)行多條),爬蟲(chóng)(們)將處于等待準(zhǔn)備狀態(tài):
scrapy runspider hsw.py
在Master端的redis-cli輸入push指令,參考格式:
$redis > lpush myspider:start_urls http://finance.hsw.cn/hyxw/
5、獲取數(shù)據(jù)
所有Slaver端將開(kāi)始爬取數(shù)據(jù),數(shù)據(jù)將保存在Redis數(shù)據(jù)庫(kù)中,并共享Redis數(shù)據(jù)庫(kù)的請(qǐng)求隊(duì)列、請(qǐng)求指紋集合和數(shù)據(jù)隊(duì)列。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41516.html
摘要:上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)爬蟲(chóng)框架的安裝下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)部署相關(guān)庫(kù)的安裝的安裝是一個(gè)中支持渲染的工具,本節(jié)來(lái)介紹一下它的安裝方式。另外一個(gè)是的庫(kù)的安裝,安裝之后即可在中使用服務(wù)。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---10、爬蟲(chóng)框架的安裝:PySpider、Scrapy下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---12、部署相關(guān)庫(kù)的安裝:Docker、Scrapyd Scrap...
摘要:想辦法區(qū)分爬蟲(chóng)程序和正常的用戶。爬蟲(chóng)是工具性程序,對(duì)速度和效率要求較高。生態(tài)圈完善,是最大對(duì)手。最要命的是爬蟲(chóng)需要經(jīng)常修改部分代碼。爬蟲(chóng)分類通用爬蟲(chóng)也就是百度搜狐等搜索引擎。原本是為測(cè)試來(lái)測(cè)試網(wǎng)站的,后來(lái)成了爬蟲(chóng)工程師最喜愛(ài)的工具。 一、爬蟲(chóng)的基本知識(shí): 1. 什么是爬蟲(chóng) 爬蟲(chóng)的英文翻譯為spider或者crawder,意為蜘蛛或者爬行者,從字面意思我們可以體會(huì)到:爬蟲(chóng)就是把自己當(dāng)做蜘...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:布隆去重的優(yōu)點(diǎn)和缺點(diǎn)優(yōu)點(diǎn)相比于其它的數(shù)據(jù)結(jié)構(gòu),布隆過(guò)濾器在空間和時(shí)間方面都有巨大的優(yōu)勢(shì)。下載布隆過(guò)濾器文件,將其拷貝至包中。修改其函數(shù)按照分布式爬蟲(chóng)部署步驟,繼續(xù)進(jìn)行即可使用布隆去重策略 scrapy-redis的布隆去重 - 為什么要使用布隆去重? scrapy自帶去重機(jī)制,即將所需要爬取的網(wǎng)頁(yè)放在set中來(lái)達(dá)到去重的目的,但是在實(shí)際工作中,我們需要更新數(shù)據(jù)的時(shí)候往往不需要爬取已經(jīng)爬...
閱讀 3854·2021-09-06 15:00
閱讀 2183·2019-08-30 15:53
閱讀 3291·2019-08-23 16:44
閱讀 953·2019-08-23 15:19
閱讀 1400·2019-08-23 12:27
閱讀 4201·2019-08-23 11:30
閱讀 592·2019-08-23 10:33
閱讀 376·2019-08-22 16:05