99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀Python之爬蟲框架概述
Python之爬蟲框架概述
2017-01-06
收藏
丨綜述

爬蟲入門之后,我們有兩條路可以走。

一個(gè)是繼續(xù)深入學(xué)習(xí),以及關(guān)于設(shè)計(jì)模式的一些知識(shí),強(qiáng)化Python相關(guān)知識(shí),自己動(dòng)手造輪子,繼續(xù)為自己的爬蟲增加分布式,多線程等功能擴(kuò)展。另一條路便是學(xué)習(xí)一些優(yōu)秀的框架,先把這些框架用熟,可以確保能夠應(yīng)付一些基本的爬蟲任務(wù),也就是所謂的解決溫飽問題,然后再深入學(xué)習(xí)它的源碼等知識(shí),進(jìn)一步強(qiáng)化。

就個(gè)人而言,前一種方法其實(shí)就是自己動(dòng)手造輪子,前人其實(shí)已經(jīng)有了一些比較好的框架,可以直接拿來用,但是為了自己能夠研究得更加深入和對(duì)爬蟲有更全面的了解,自己動(dòng)手去多做。后一種方法就是直接拿來前人已經(jīng)寫好的比較優(yōu)秀的框架,拿來用好,首先確保可以完成你想要完成的任務(wù),然后自己再深入研究學(xué)習(xí)。第一種而言,自己探索的多,對(duì)爬蟲的知識(shí)掌握會(huì)比較透徹。第二種,拿別人的來用,自己方便了,可是可能就會(huì)沒有了深入研究框架的心情,還有可能思路被束縛。

不過個(gè)人而言,我自己偏向后者。造輪子是不錯(cuò),但是就算你造輪子,你這不也是在基礎(chǔ)類庫上造輪子么?能拿來用的就拿來用,學(xué)了框架的作用是確保自己可以滿足一些爬蟲需求,這是最基本的溫飽問題。倘若你一直在造輪子,到最后都沒造出什么來,別人找你寫個(gè)爬蟲研究了這么長(zhǎng)時(shí)間了都寫不出來,豈不是有點(diǎn)得不償失?所以,進(jìn)階爬蟲我還是建議學(xué)習(xí)一下框架,作為自己的幾把武器。至少,我們可以做到了,就像你拿了把槍上戰(zhàn)場(chǎng)了,至少,你是可以打擊敵人的,比你一直在磨刀好的多吧?

丨框架概述

博主接觸了幾個(gè)爬蟲框架,其中比較好用的是 Scrapy 和PySpider。就個(gè)人而言,pyspider上手更簡(jiǎn)單,操作更加簡(jiǎn)便,因?yàn)樗黾恿?WEB 界面,寫爬蟲迅速,集成了phantomjs,可以用來抓取js渲染的頁面。Scrapy自定義程度高,比 PySpider更底層一些,適合學(xué)習(xí)研究,需要學(xué)習(xí)的相關(guān)知識(shí)多,不過自己拿來研究分布式和多線程等等是非常合適的。

在這里博主會(huì)一一把自己的學(xué)習(xí)經(jīng)驗(yàn)寫出來與大家分享,希望大家可以喜歡,也希望可以給大家一些幫助。

丨PySpider

PySpider是binux做的一個(gè)爬蟲架構(gòu)的開源化實(shí)現(xiàn)。主要的功能需求是:

· 抓取、更新調(diào)度多站點(diǎn)的特定的頁面
· 需要對(duì)頁面進(jìn)行結(jié)構(gòu)化信息提取
· 靈活可擴(kuò)展,穩(wěn)定可監(jiān)控
而這也是絕大多數(shù)python爬蟲的需求 —— 定向抓取,結(jié)構(gòu)化化解析。但是面對(duì)結(jié)構(gòu)迥異的各種網(wǎng)站,單一的抓取模式并不一定能滿足,靈活的抓取控制是必須的。為了達(dá)到這個(gè)目的,單純的配置文件往往不夠靈活,于是,通過腳本去控制抓取是最后的選擇。
而去重調(diào)度,隊(duì)列,抓取,異常處理,監(jiān)控等功能作為框架,提供給抓取腳本,并保證靈活性。最后加上web的編輯調(diào)試環(huán)境,以及web任務(wù)監(jiān)控,即成為了這套框架。

pyspider的設(shè)計(jì)基礎(chǔ)是:python腳本驅(qū)動(dòng)的抓取環(huán)模型爬蟲

· 通過python腳本進(jìn)行結(jié)構(gòu)化信息的提取,follow鏈接調(diào)度抓取控制,實(shí)現(xiàn)最大的靈活性

· 通過web化的腳本編寫、調(diào)試環(huán)境。web展現(xiàn)調(diào)度狀態(tài)

· 抓取環(huán)模型成熟穩(wěn)定,模塊間相互獨(dú)立,通過消息隊(duì)列連接,從單進(jìn)程到多機(jī)分布式靈活拓展
pyspider-arch


pyspider的架構(gòu)主要分為 scheduler(調(diào)度器), fetcher(抓取器), processor(腳本執(zhí)行):

· 各個(gè)組件間使用消息隊(duì)列連接,除了scheduler是單點(diǎn)的,fetcher 和 processor 都是可以多實(shí)例分布式部署的。 scheduler 負(fù)責(zé)整體的調(diào)度控制。

· 任務(wù)由 scheduler 發(fā)起調(diào)度,fetcher 抓取網(wǎng)頁內(nèi)容, processor 執(zhí)行預(yù)先編寫的python腳本,輸出結(jié)果或產(chǎn)生新的提鏈任務(wù)(發(fā)往 scheduler),形成閉環(huán)。

· 每個(gè)腳本可以靈活使用各種python庫對(duì)頁面進(jìn)行解析,使用框架API控制下一步抓取動(dòng)作,通過設(shè)置回調(diào)控制解析動(dòng)作。

丨Scrapy

Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。 可以應(yīng)用在包括數(shù)據(jù)挖掘,信息處理或存儲(chǔ)歷史數(shù)據(jù)等一系列的程序中。

其最初是為了頁面抓取 (更確切來說, 網(wǎng)絡(luò)抓取 )所設(shè)計(jì)的, 也可以應(yīng)用在獲取API所返回的數(shù)據(jù)(例如 Amazon Associates Web Services ) 或者通用的網(wǎng)絡(luò)爬蟲。Scrapy用途廣泛,可以用于數(shù)據(jù)挖掘、監(jiān)測(cè)和自動(dòng)化測(cè)試

Scrapy 使用了 Twisted 異步網(wǎng)絡(luò)庫來處理網(wǎng)絡(luò)通訊。整體架構(gòu)大致如下


Scrapy主要包括了以下組件:

· 引擎(Scrapy): 用來處理整個(gè)系統(tǒng)的數(shù)據(jù)流處理, 觸發(fā)事務(wù)(框架核心)

· 調(diào)度器(Scheduler): 用來接受引擎發(fā)過來的請(qǐng)求, 壓入隊(duì)列中, 并在引擎再次請(qǐng)求的時(shí)候返回. 可以想像成一個(gè)URL(抓取網(wǎng)頁的網(wǎng)址或者說是鏈接)的優(yōu)先隊(duì)列, 由它來決定下一個(gè)要抓取的網(wǎng)址是什么, 同時(shí)去除重復(fù)的網(wǎng)址

· 下載器(Downloader): 用于下載網(wǎng)頁內(nèi)容, 并將網(wǎng)頁內(nèi)容返回給蜘蛛(Scrapy下載器是建立在twisted這個(gè)高效的異步模型上的)

· 爬蟲(Spiders): 爬蟲是主要干活的, 用于從特定的網(wǎng)頁中提取自己需要的信息, 即所謂的實(shí)體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續(xù)抓取下一個(gè)頁面

· 項(xiàng)目管道(Pipeline): 負(fù)責(zé)處理爬蟲從網(wǎng)頁中抽取的實(shí)體,主要的功能是持久化實(shí)體、驗(yàn)證實(shí)體的有效性、清除不需要的信息。當(dāng)頁面被爬蟲解析后,將被發(fā)送到項(xiàng)目管道,并經(jīng)過幾個(gè)特定的次序處理數(shù)據(jù)。

· 下載器中間件(Downloader Middlewares): 位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請(qǐng)求及響應(yīng)。

· 爬蟲中間件(Spider Middlewares): 介于Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應(yīng)輸入和請(qǐng)求輸出。

· 調(diào)度中間件(Scheduler Middewares): 介于Scrapy引擎和調(diào)度之間的中間件,從Scrapy引擎發(fā)送到調(diào)度的請(qǐng)求和響應(yīng)。

Scrapy運(yùn)行流程大概如下:

· 首先,引擎從調(diào)度器中取出一個(gè)鏈接(URL)用于接下來的抓取

· 引擎把URL封裝成一個(gè)請(qǐng)求(Request)傳給下載器,下載器把資源下載下來,并封裝成應(yīng)答包(Response)

· 然后,爬蟲解析Response

· 若是解析出實(shí)體(Item),則交給實(shí)體管道進(jìn)行進(jìn)一步的處理。

· 若是解析出的是鏈接(URL),則把URL交給Scheduler等待抓取。


文 | 崔慶才
來源 | 靜覓


數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }