大數(shù)據(jù)采集與預(yù)處理課件:Scrapy各組件的用法 -2_第1頁(yè)
大數(shù)據(jù)采集與預(yù)處理課件:Scrapy各組件的用法 -2_第2頁(yè)
大數(shù)據(jù)采集與預(yù)處理課件:Scrapy各組件的用法 -2_第3頁(yè)
大數(shù)據(jù)采集與預(yù)處理課件:Scrapy各組件的用法 -2_第4頁(yè)
大數(shù)據(jù)采集與預(yù)處理課件:Scrapy各組件的用法 -2_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

使用Scrapy爬蟲(chóng)框架采集數(shù)據(jù)——爬取汽車(chē)之家數(shù)據(jù) 本章學(xué)習(xí)目標(biāo)了解Scrapy爬蟲(chóng)框架的工作原理了解Scrapy爬蟲(chóng)框架的安裝過(guò)程以及各組件的基本含義和用法掌握Scrapy爬蟲(chóng)框架采集數(shù)據(jù)的實(shí)例6.3.3DownloaderMiddleware DownloaderMiddleware是一個(gè)掛鉤到Scrapy的請(qǐng)求/響應(yīng)處理的框架。這是一個(gè)輕型、低層次的系統(tǒng),用于全局地修改Scrapy的請(qǐng)求和響應(yīng)。要激活DownloaderMiddleware組件,請(qǐng)將其添加到downloader_middleware設(shè)置中,該設(shè)置是一個(gè)dict,其鍵是中間件類(lèi)路徑,其值是中間件順序值(按照優(yōu)先級(jí)排序的值,值越小越靠近Scrapy引擎,優(yōu)先級(jí)越高;值越大越靠近DownloaderMiddleware。)。DOWNLOADER_MIDDLEWARES={'myproject.middlewares.CustomDownloaderMiddleware':543,}DOWNLOADER_MIDDLEWARES設(shè)置與DOWNLOADER_MIDDLEWARES_BASE設(shè)置一起合并設(shè)置定義Scrapy(而不是要覆蓋),然后按順序排序,得到最終的中間件使用的分類(lèi)列表):第一個(gè)中間件是更接近接近引擎的,最后一個(gè)中間件是更接近于下載器的。換句話(huà)說(shuō),將以遞增的中間件順序(100、200、300、…)調(diào)用每個(gè)中間件的process_request()方法,并以遞減的順序調(diào)用每個(gè)中間件的process_response()方法。每個(gè)DownloaderMiddleware組件都是一個(gè)Python類(lèi),該類(lèi)定義了以下一種或多種方法。1.process_request(request,spider)通過(guò)下載中間件的每個(gè)請(qǐng)求都會(huì)調(diào)用的方法。process_request()應(yīng)該是返回None、返回響應(yīng)對(duì)象、返回請(qǐng)求對(duì)象或引發(fā)IgnoreRequest。如果返回None,Scrapy將繼續(xù)處理這個(gè)請(qǐng)求,執(zhí)行所有其他中間件,直到最后調(diào)用適當(dāng)?shù)南螺d器處理程序來(lái)調(diào)用執(zhí)行的請(qǐng)求(以及下載的響應(yīng))。如果返回響應(yīng)對(duì)象,Scrapy不會(huì)調(diào)用任何其他process_request(),process_exception()方法或適當(dāng)?shù)南螺d函數(shù);它會(huì)返回那個(gè)響應(yīng)對(duì)象。在每個(gè)響應(yīng)對(duì)象上總是調(diào)用已安裝中間件的process_response()方法。如果返回請(qǐng)求對(duì)象,Scrapy將停止調(diào)用process_request方法并重新調(diào)度返回的請(qǐng)求。一旦執(zhí)行了新返回的請(qǐng)求,將在下載的響應(yīng)上調(diào)用適當(dāng)?shù)闹虚g件鏈。如果返回IgnoreRequest,將調(diào)用已安裝的下載程序中間件的process_exception()方法。如果它們都不處理異常,則調(diào)用請(qǐng)求的errback函數(shù)(request.errback)。如果沒(méi)有代碼處理引發(fā)的異常,則會(huì)忽略它,并且不記錄它。2.process_response(request,response,spider)process_response()應(yīng)該返回一個(gè)響應(yīng)對(duì)象,返回一個(gè)請(qǐng)求對(duì)象,或者引發(fā)一個(gè)IgnoreRequest異常。如果它返回一個(gè)響應(yīng)對(duì)象(可以是相同的給定響應(yīng),也可以是一個(gè)全新的響應(yīng)),那么該響應(yīng)將繼續(xù)使用鏈中下一個(gè)中間件的process_response()進(jìn)行處理。如果它返回一個(gè)請(qǐng)求對(duì)象,中間件鏈將被停止,返回的請(qǐng)求將被重新安排,以便在將來(lái)下載。這與從process_request()返回請(qǐng)求的行為相同。如果它引發(fā)了IgnoreRequest異常,就會(huì)調(diào)用請(qǐng)求的errback函數(shù)(request.errback)。如果沒(méi)有代碼處理引發(fā)的異常,它將被忽略,并且不會(huì)被記錄。3.process_exception(request,exception,spider)當(dāng)下載處理程序或process_request()(來(lái)自下載器中間件)引發(fā)異常(包括IgnoreRequest異常)時(shí),Scrapy調(diào)用process_exception()。process_exception()應(yīng)該返回None、響應(yīng)對(duì)象或請(qǐng)求對(duì)象。如果它不返回任何異常,Scrapy將繼續(xù)處理這個(gè)異常,執(zhí)行已安裝中間件的任何其他process_exception()方法,直到?jīng)]有任何中間件留下,并啟用默認(rèn)異常處理。如果它返回一個(gè)響應(yīng)對(duì)象,則啟動(dòng)已安裝中間件的process_response()方法鏈,Scrapy不會(huì)費(fèi)心調(diào)用中間件的任何其他process_exception()方法。如果它返回一個(gè)請(qǐng)求對(duì)象,返回的請(qǐng)求將被重新安排,以便在將來(lái)下載。就像返回響應(yīng)一樣,這將停止中間件的process_exception()方法的執(zhí)行.4.from_crawler(cls,crawler)如果存在,則調(diào)用此類(lèi)方法從爬蟲(chóng)創(chuàng)建中間件實(shí)例。它必須返回中間件的一個(gè)新實(shí)例。爬蟲(chóng)對(duì)象提供對(duì)Scrapy所有的核心組件的訪問(wèn),如設(shè)置和信號(hào);它是中間件訪問(wèn)它們并將其功能與Scrapy掛鉤的一種方法。6.3.4ItemPipeline 在一個(gè)Item被爬蟲(chóng)爬去之后,它被發(fā)送到項(xiàng)目管道ItemPipeline,該管道通過(guò)順序執(zhí)行的幾個(gè)組件處理它。每個(gè)項(xiàng)目管道組件(有時(shí)簡(jiǎn)稱(chēng)為“項(xiàng)目管道”)是一個(gè)Python類(lèi),它實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的方法。它們接收到一個(gè)Item并對(duì)其執(zhí)行一個(gè)操作,還可以決定該項(xiàng)目是繼續(xù)通過(guò)管道,還是刪除,不再處理。項(xiàng)目管道的典型用途有:清理HTML數(shù)據(jù),驗(yàn)證爬取的數(shù)據(jù)(檢查項(xiàng)目是否包含某些字段),檢查是否有副本(并刪除它們),是否將爬取的項(xiàng)目存儲(chǔ)在數(shù)據(jù)庫(kù)中。每個(gè)項(xiàng)目管道組件都是Python類(lèi),必須實(shí)現(xiàn)以下方法。1.process_item(self,item,spider)對(duì)每個(gè)項(xiàng)目管道組件調(diào)用此方法。process_item()必須返回一個(gè)帶有數(shù)據(jù)的dict,返回一個(gè)Item(或任何子類(lèi))對(duì)象,返回一個(gè)TwistedDeferred或raiseDropItem異常。已刪除的Item不再由其他管道組件處理。2.open_spider(self,spider)當(dāng)啟動(dòng)爬行器時(shí)調(diào)用此方法。3.close_spider(self,spider)當(dāng)關(guān)閉爬行器時(shí)調(diào)用此方法。4.from_crawler(cls,crawler)如果存在,則調(diào)用此類(lèi)方法從爬蟲(chóng)創(chuàng)建管道實(shí)例。它必須返回管道的新實(shí)例。爬蟲(chóng)對(duì)象提供對(duì)Scrapy所有的核心組件的訪問(wèn),如設(shè)置和信號(hào);這是一種管道訪問(wèn)它們并將其功能連接到Scrapy的方法?!緦?shí)例6-4】看看下面這個(gè)假想的管道,它調(diào)整不包含VAT(price_excludedes_vat屬性)的條目的price屬性,并刪除不包含price的條目。fromscrapy.exceptionsimportDropItemclassPricePipeline(object):vat_factor=1.15defprocess_item(self,item,spider):ifitem['price']:ifitem['price_excludes_vat']:item['price']=item['price']*self.vat_factorreturnitemelse:raiseDropItem("沒(méi)有價(jià)格in%s"%item)【實(shí)例6-5】下面的管道將所有來(lái)自爬蟲(chóng)的Items存儲(chǔ)到單個(gè)Items.jl文件,每行包含一個(gè)JSON格式序列化的項(xiàng)目。importjsonclassJsonWriterPipeline(object):defopen_spider(self,spider):self.file=open('items.jl','w')defclose_spider(self,spider):self.file.close()defprocess_item(self,item,spider):line=json.dumps(dict(item))+"\n"self.file.write(line)returnitem要激活項(xiàng)目管道組件,必須將其類(lèi)添加到item_pipeline設(shè)置。ITEM_PIPELINES={'myproject.pipelines.PricePipeline':300,'myproject.pipelines.JsonWriterPipeline':800,}在這個(gè)設(shè)置中,您為類(lèi)分配的整數(shù)值決定了它們運(yùn)行的順序:項(xiàng)目從低值類(lèi)到高值類(lèi)。通常在0-1000范圍內(nèi)定義這些數(shù)字。下面將實(shí)現(xiàn)連接MySQL,并將數(shù)據(jù)插入到指定數(shù)據(jù)庫(kù)中?!緦?shí)例6-6】首先確保已經(jīng)正確安裝了MySQL,然后創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)file123,并在該數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)表table123。其中,表tables123的SQL生成語(yǔ)句為:CREATETABLEtable123(titleVARCHAR(255)NULL,contentVARCHAR(255)NULL)接著實(shí)現(xiàn)一個(gè)類(lèi)MysqlPipeline,代碼如下:classMysqlPipeline():def_init_(self,host,database,user,password,port):self.host=hostself.database=databaseself.user=userself.password=passwordself.port=portdeffrom_crawler(cls,crawler):returncls(host=crawler.settings.get(‘MYSQL_HOST’),database=crawler.settings.get(‘MYSQL_DATABASE’),user=crawler.settings.get(‘MYSQL_USER’),password=crawler.settings.get(‘MYSQL_PASSWORD’),port=crawler.settings.get(‘MYSQL_PORT’),)defopen_spider(self,spider):self.db=pymysql.connect(self.host,self.user,self.password,self.database,charset=’utf-8’,port=self.port)self.cursor=self.db.cursor()defclose_spider(self,spider):self.db.close()defprocess_item(self,item,spider):data=dict(item)keys=‘,’.join(data.keys())values=‘,’.join([‘%s’]*len(data))sql=‘insertinto%s(%s)values(%s)’%(item.table,keys,values)self.cursor.execute(sql,tuple(data.values()))self.dbmit()returnitem最后,需要在settings.py里面配置MySQL的幾個(gè)變量,代碼如下:MYSQL_HOST=‘localhost’MYSQL_DATABASE=‘file123’MYSQL_USER=‘root’MYSQL_PASSWORD=‘123456’MYSQL_PORT=‘3306’

這樣,就分別定義了MySQL的主機(jī),數(shù)據(jù)庫(kù),用戶(hù)名,密碼和端口,從而實(shí)現(xiàn)了MySQLPipeline。Scrapy提供了可重用的項(xiàng)目管道,用于下載附加到特定項(xiàng)目的文件(例如,當(dāng)您提取產(chǎn)品并希望在本地下載它們的圖像時(shí))。這些管道共享一些功能和結(jié)構(gòu)(我們將它們稱(chēng)為媒體管道),但是通常您要么使用文件管道,要么使用圖像管道。

管道還保留那些正在計(jì)劃下載的媒體url的內(nèi)部隊(duì)列,并將包含相同媒體的響應(yīng)連接到該隊(duì)列。這樣,當(dāng)多個(gè)項(xiàng)目共享同一媒體時(shí),就可以避免多次下載該媒體。1.在使用FilesPipeline時(shí)(1)在爬蟲(chóng)中,您提取一個(gè)item,并將所需的url放入file_urls字段中。(2)item從爬蟲(chóng)返回并進(jìn)入項(xiàng)目管道。(3)當(dāng)item到達(dá)FilesPipeline時(shí),file_urls字段中的url將被安排使用標(biāo)準(zhǔn)的Scrapy調(diào)度器和下載加載器(這意味著調(diào)度器和下載加載器中間件被重用)進(jìn)行下載,但是具有更高的優(yōu)先級(jí),在其他頁(yè)面被清理之前對(duì)它們進(jìn)行處理。在文件下載完成(或由于某種原因失敗)之前,該項(xiàng)目在特定的管道階段保持“鎖定”狀態(tài)。(4)當(dāng)下載文件時(shí),將用結(jié)果填充另一個(gè)字段(文件)。該字段將包含關(guān)于下載文件的信息的dicts列表,例如下載的路徑、原始爬取的url(從file_urls字段中獲取)和文件校驗(yàn)和。文件字段列表中的文件將保持原始file_urls字段的順序。如果某些文件下載失敗,將記錄一個(gè)錯(cuò)誤,文件將不會(huì)出現(xiàn)在files字段中。2.在使用ImagesPipeline時(shí)(1)使用ImagesPipeline與使用FilesPipeline非常相似,不同之處是使用的默認(rèn)字段名不同:您將image_urls用于item的圖像url,它將填充一個(gè)images字段,用于下載圖像的信息。(2)使用ImagesPipeline處理圖像文件的優(yōu)點(diǎn)是,您可以配置一些額外的函數(shù),如生成縮略圖和根據(jù)圖像的大小過(guò)濾圖像。(3)ImagesPipeline使用Pillow將圖像固定并規(guī)范化為JPEG/RGB格式,因此您需要安裝這個(gè)庫(kù)才能使用它。PythonImagingLibrary(PIL)在大多數(shù)情況下也可以工作,但眾所周知,它會(huì)在一些設(shè)置中帶來(lái)麻煩,所以我們建議使用Pillow而不是PIL。要啟用媒體管道,必須首先將其添加到項(xiàng)目item_pipeline設(shè)置中。對(duì)于圖像管道,使用:ITEM_PIPELINES={'scrapy.pipelines.images.ImagesPipeline':1}對(duì)于文件管道,使用:ITEM_PIPELINES={'scrapy.pipelines.files.FilesPipeline':1}然后,將目標(biāo)存儲(chǔ)設(shè)置配置為用于存儲(chǔ)下載圖像的有效值。否則,管道將保持禁用狀態(tài),即使在item_pipeline設(shè)置中包含管道。對(duì)于文件管道,設(shè)置FILES_STORE設(shè)置:FILES_STORE='/path/to/valid/dir'對(duì)于圖像管道,設(shè)置IMAGES_STORE設(shè)置:IMAGES_STORE='/path/to/valid/dir'3.在自定義文件管道中重寫(xiě)的方法(1)get_media_requests(item,info)。正如在工作流中看到的,管道將從item中獲得要下載的圖像的url。為了做到這一點(diǎn),可以覆蓋get_media_requests()方法,并為每個(gè)文件URL返回一個(gè)請(qǐng)求:defget_media_requests(self,item,info):forfile_urlinitem['file_urls']:yieldscrapy.Request(file_url)這些請(qǐng)求將由管道處理,當(dāng)它們完成下載后,結(jié)果將作為一個(gè)包含2個(gè)元素的元組列表發(fā)送到item_completed()方法。每個(gè)元組將包含(success,file_info_or_error)。success是一個(gè)布爾值,如果下載成功,則為T(mén)rue;如果由于某種原因失敗,則為False。file_info_or_error是一個(gè)包含以下鍵的字典(如果success是True),或者是一個(gè)有問(wèn)題的Twisted失敗。url:下載文件的url。這是get_media_requests()方法返回的請(qǐng)求的url。path:存儲(chǔ)文件的路徑(相對(duì)于FILES_STORE)。checksum圖像內(nèi)容的MD5散列item_completed()接收的元組列表保證保持從get_media_requests()方法返回的請(qǐng)求的相同順序。默認(rèn)情況下,get_media_requests()方法不返回任何值,這意味著該項(xiàng)目沒(méi)有要下載的文件。(2)item_completed(results,

item,

info)。

當(dāng)對(duì)單個(gè)項(xiàng)目的所有文件請(qǐng)求都已完成(要么完成下載,要么由于某種原因失敗)時(shí),調(diào)用FilesPipeline.item_completed()方法。item_completed()方法必須返回將發(fā)送到后續(xù)項(xiàng)目管道階段的輸出,因此必須像在任何管道中一樣返回(或刪除)項(xiàng)目。默認(rèn)情況下,item_completed()方法返回item。4.在自定義圖像管道中重寫(xiě)的方法ImagesPipeline是FilesPipeline的擴(kuò)展,用于自定義字段名并為圖像添加自定義行為。(1)get_media_requests(item,

info)。方法的工作方式與FilesPipeline.get_me

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論