今天就跟大家聊聊有關(guān)Python爬蟲如何使用Scrapy框架,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括鐵西網(wǎng)站建設(shè)、鐵西網(wǎng)站制作、鐵西網(wǎng)頁制作以及鐵西網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,鐵西網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到鐵西省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
scrapy結(jié)構(gòu)圖:
scrapy組件:
(1)ENGINE:引擎,框架的核心,其它所有組件在其控制下協(xié)同工作。
(2)SCHEDULER:調(diào)度器,負(fù)責(zé)對SPIDER提交的下載請求進(jìn)行調(diào)度。
(3)DOWNLOADER:下載器,負(fù)責(zé)下載頁面(發(fā)送HTTP請求/接收HTTP響應(yīng))。
(4)SPIDER:爬蟲,負(fù)責(zé)提取頁面中的數(shù)據(jù),并產(chǎn)生對新頁面的下載請求。
(5)MIDDLEWARE:中間件,負(fù)責(zé)對Request對象和Response對象進(jìn)行處理。
(6)ITEM PIPELINE:數(shù)據(jù)管道,負(fù)責(zé)對爬取到的數(shù)據(jù)進(jìn)行處理。
對于用戶來說,Spider是最核心的組件,Scrapy爬蟲開發(fā)是圍繞實(shí)現(xiàn)Spider展開的。
框架中的數(shù)據(jù)流:
(1)REQUEST:scrapy中的HTTP請求對象。
(2)RESPONSE:scrapy中的HTTP響應(yīng)對象。
(3)ITEM:從頁面中爬取的一項(xiàng)數(shù)據(jù)。
Request和Response是HTTP協(xié)議中的術(shù)語,即HTTP請求和HTTP響應(yīng),Scrapy框架中定義了相應(yīng)的Request和Response類,這里的Item代表Spider從頁面中爬取的一項(xiàng)數(shù)據(jù)。
scrapy大致工作流程:
(1)當(dāng)SPIDER要爬取某URL地址的頁面時(shí),需使用該URL構(gòu)造一個(gè)Request對象,提交給ENGINE。
(2)ENGINE將Request對象傳給SCHEDULER,SCHEDULER對URL進(jìn)行去重,按某種算法進(jìn)行排隊(duì),之后的某個(gè)時(shí)刻SCHEDULER將其出隊(duì),將處理好的Request對象返回給ENGINE。
(3)ENGINE將SCHEDULER處理后的Request對象發(fā)送給DOWNLOADER下載頁面。
(4)DOWNLOADER根據(jù)MIDDLEWARE的規(guī)則,使用Request對象中的URL地址發(fā)送一次HTTP請求到網(wǎng)站服務(wù)器,之后用服務(wù)器返回的HTTP響應(yīng)構(gòu)造出一個(gè)Response對象,其中包含頁面的HTML文本。DOWNLOADER將結(jié)果Resopnse對象傳給ENGINE。
(5)ENGINE將Response對象發(fā)送給SPIDER的頁面解析函數(shù)(構(gòu)造Request對象時(shí)指定)進(jìn)行處理,頁面解析函數(shù)從頁面中提取數(shù)據(jù),封裝成Item后提交給ENGINE。
(6)ENGINE將Item送往ITEMPIPELINES進(jìn)行處理,最終以某種數(shù)據(jù)格式寫入文件(csv,json)或者存儲(chǔ)到數(shù)據(jù)庫中。
整個(gè)流程的核心都是圍繞著ENGINE進(jìn)行的。
Request對象
Request對象用來描述一個(gè)HTTP請求,下面是其構(gòu)造器方法的參數(shù)列表。
Request(url, callback=None, method='GET', headers=None, body=None, cookies=None, meta=None, encoding='utf-8', priority=0, dont_filter=False, errback=None, flags=None) # url(必選):請求頁面的url地址,bytes或str類型,如'http://www.baidu.com'。 # callback:頁面解析函數(shù), Callable類型,Request對象請求的頁面下載完成后,由該參數(shù)指定的頁面解析函數(shù)被調(diào)用。如果未傳遞 該參數(shù),默認(rèn)調(diào)用Spider的parse方法。 # method:HTTP請求的方法,默認(rèn)為'GET'。 # headers:HTTP請求的頭部字典,dict類型,例如{'Accept':'text/html', 'User-Agent':Mozilla/5.0'}。如果其中某項(xiàng)的值為 None,就表示不發(fā)送該項(xiàng)HTTP頭部,例如{'Cookie':None},禁止發(fā)送Cookie。 # body:HTTP請求的正文,bytes或str類型。 # cookies:Cookie信息字典,dict類型,例如{'currency': 'USD','country': 'UY'}。 # meta:Request的元數(shù)據(jù)字典,dict類型,用于給框架中其他組件傳遞信息,比如中間件Item Pipeline。其他組件可以使用 Request對象的meta屬性訪問該元數(shù)據(jù)字典(request.meta),也用于給響應(yīng)處理函數(shù)傳遞信息, # 詳見Response的meta屬性。 # encoding:url和body參數(shù)的編碼默認(rèn)為'utf-8'。如果傳入的url或body參數(shù)是str類型,就使用該參數(shù)進(jìn)行編碼。 # priority:請求的優(yōu)先級默認(rèn)值為0,優(yōu)先級高的請求優(yōu)先下載。 # dont_filter:默認(rèn)情況下(dont_filter=False),對同一個(gè)url地址多次提交下載請求,后面的請求會(huì)被去重過濾器過濾 (避免重復(fù)下載)。如果將該參數(shù)置為True,可以使請求避免被過濾,強(qiáng)制下載。例如,在多次爬取 # 一個(gè)內(nèi)容隨時(shí)間而變化的頁面時(shí)(每次使用相同的url),可以將該參數(shù)置為True。 # errback:請求出現(xiàn)異?;蛘叱霈F(xiàn)HTTP錯(cuò)誤時(shí)(如404頁面不存在)的回調(diào)函數(shù)。
雖然參數(shù)很多,但除了url參數(shù)外,其他都帶有默認(rèn)值。在構(gòu)造Request對象時(shí),通常我們只需傳遞一個(gè)url參數(shù)或再加一個(gè)callback參數(shù),其他使用默認(rèn)值即可。
Response對象:
Response對象用來描述一個(gè)HTTP響應(yīng),Response只是一個(gè)基類,根據(jù)響應(yīng)內(nèi)容的不同有如下子類:
(1)TextResponse
(2)HtmlResponse
(3)XmlResponse
當(dāng)一個(gè)頁面下載完成時(shí),下載器依據(jù)HTTP響應(yīng)頭部中的Content-Type信息創(chuàng)建某個(gè)Response的子類對象。我們通常爬取的網(wǎng)頁,其內(nèi)容是HTML文本,創(chuàng)建的便是HtmlResponse對象,其中HtmlResponse和XmlResponse是TextResponse的子類。實(shí)際上,這3個(gè)子類只有細(xì)微的差別,這里以HtmlResponse為例進(jìn)行講解。
下面是HtmlResponse對象的屬性及方法。
url:HTTP響應(yīng)的url地址,str類型。 status:HTTP響應(yīng)的狀態(tài)碼,int類型,例如200,404。 headers:HTTP響應(yīng)的頭頭部,類字典類型,可以調(diào)用get或getlist方法對其進(jìn)行訪問,例如:response.headers.get('Content-Type') response.headers.getlist('Set-Cookie') body:HTTP響應(yīng)正文,bytes類型。 text:文本形式的HTTP響應(yīng)正文,str類型,它是由response.body使用response.encoding解碼得到的,即reponse.text = response.body.decode(response.encoding) encoding:HTTP響應(yīng)正文的編碼,它的值可能是從HTTP響應(yīng)頭部或正文中解析出來的。 request:產(chǎn)生該HTTP響應(yīng)的Request對象。 meta:即response.request.meta,在構(gòu)造Request對象時(shí),可將要傳遞給響應(yīng)處理函數(shù)的信息通過meta參數(shù)傳入;響應(yīng)處理函數(shù)處理 響應(yīng)時(shí),通過response.meta將信息取出。 selector:Selector對象用于在Response中提取數(shù)據(jù)。 xpath(query):使用XPath選擇器在Response中提取數(shù)據(jù),實(shí)際上它是response.selector.xpath方法的快捷方式。 css(query):使用CSS選擇器在Response中提取數(shù)據(jù),實(shí)際上它是response.selector.css方法的快捷方式。 urljoin(url):用于構(gòu)造絕對url。當(dāng)傳入的url參數(shù)是一個(gè)相對地址時(shí),根據(jù)response.url計(jì)算出相應(yīng)的絕對url。例如: response.url為http://www.example.com/a,url為b/index.html,調(diào)用response.urljoin(url)的結(jié)果為http://www.example.com /a/b/index.html。
雖然HtmlResponse對象有很多屬性,但最常用的是以下的3個(gè)方法:
(1)xpath(query)
(2)css(query)
(3)urljoin(url)
前兩個(gè)方法用于提取數(shù)據(jù),后一個(gè)方法用于構(gòu)造絕對url。
spied開發(fā)流程
實(shí)現(xiàn)一個(gè)Spider子類的過程很像是完成一系列填空題,Scrapy框架提出以下問題讓用戶在Spider子類中作答:
(1)爬蟲從哪個(gè)或哪些頁面開始爬???
(2)對于一個(gè)已下載的頁面,提取其中的哪些數(shù)據(jù)?
(3)爬取完當(dāng)前頁面后,接下來爬取哪個(gè)或哪些頁面?
實(shí)現(xiàn)一個(gè)Spider只需要完成下面4個(gè)步驟:
(1)繼承scrapy.Spider。
(2)為Spider取名。
(3)設(shè)定起始爬取點(diǎn)。
(4)實(shí)現(xiàn)頁面解析函數(shù)。
scrapy.Spider基類實(shí)現(xiàn)了以下內(nèi)容:
(1)供Scrapy引擎調(diào)用的接口,例如用來創(chuàng)建Spider實(shí)例的類方法from_crawler。
(2)供用戶使用的實(shí)用工具函數(shù),例如可以調(diào)用log方法將調(diào)試信息輸出到日志。
(3)供用戶訪問的屬性,例如可以通過settings屬性訪問配置文件中的配置。
關(guān)于起始URL start_urls:
start_urls通常被實(shí)現(xiàn)成一個(gè)列表,其中放入所有起始爬取點(diǎn)的url(例子中只有一個(gè)起始點(diǎn))。看到這里,大家可能會(huì)想,請求頁面下載不是一定要提交Request對象么?而我們僅定義了url列表,是誰
暗中構(gòu)造并提交了相應(yīng)的Request對象呢?
1.我們將起始URL提交給ENGINE。
2.ENGINE調(diào)用start_requests方法,我們沒有實(shí)現(xiàn)整個(gè)方法,所以調(diào)用了基類的start_requests方法。
3.通過閱讀Spider基類的源碼可以看到如下內(nèi)容:
4.基類的start_requests將我們的URL封裝成Request對象。
由此我們知道Request對象是調(diào)用基類start_requests方法產(chǎn)生的,因此我們也可以自己定義start_requests方法(覆蓋基類Spider的start_requests方法),直接構(gòu)造并提交起始爬取點(diǎn)的Request對象。在某些場景下使用這種方式更加靈活,例如有時(shí)想為Request添加特定的HTTP請求頭部,或想為Request指定特定的頁面解析函數(shù)。
頁面解析函數(shù)parse:
頁面解析函數(shù)也就是構(gòu)造Request對象時(shí)通過callback參數(shù)指定的回調(diào)函數(shù)(或默認(rèn)的parse方法)。頁面解析函數(shù)是實(shí)現(xiàn)Spider中最核心的部分,它需要完成以下兩項(xiàng)工作:
(1)使用選擇器提取頁面中的數(shù)據(jù),將數(shù)據(jù)封裝后(Item或字典)提交給Scrapy引擎。
(2)使用選擇器或LinkExtractor提取頁面中的鏈接,用其構(gòu)造新的Request對象并提交給Scrapy引擎(下載鏈接頁面)。
一個(gè)頁面中可能包含多項(xiàng)數(shù)據(jù)以及多個(gè)鏈接,因此頁面解析函數(shù)被要求返回一個(gè)可迭代對象(通常被實(shí)現(xiàn)成一個(gè)生成器函數(shù)),每次迭代返回一項(xiàng)數(shù)據(jù)(Item或字典)或一個(gè)Request對象。
內(nèi)容小結(jié):
(1)了解scrapy的六個(gè)組件的功能。
(2)理解scrapy工作流程。
看完上述內(nèi)容,你們對Python爬蟲如何使用Scrapy框架有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
當(dāng)前名稱:Python爬蟲如何使用Scrapy框架
鏈接URL:http://jinyejixie.com/article36/ijjssg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、靜態(tài)網(wǎng)站、電子商務(wù)、網(wǎng)站制作、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)