版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章Scrapy核心組件與CrawlSpider類《Python網(wǎng)絡(luò)爬蟲(chóng)基礎(chǔ)教程》學(xué)習(xí)目標(biāo)/Target掌握Spiders組件,能夠應(yīng)用Spiders組件實(shí)現(xiàn)數(shù)據(jù)的抓取和解析掌握Item組件,能夠應(yīng)用Item組件實(shí)現(xiàn)封裝數(shù)據(jù)的功能掌握ItemPipeline組件,能夠應(yīng)用ItemPipeline組件實(shí)現(xiàn)處理后期數(shù)據(jù)的功能掌握DownloaderMiddlewares組件,能夠應(yīng)用DownloaderMiddlewares中間件應(yīng)對(duì)防爬蟲(chóng)行為掌握Settings組件,能夠應(yīng)用Settings組件中的配置項(xiàng)定制各個(gè)Scrapy組件的行為學(xué)習(xí)目標(biāo)/Target熟悉CrawlSpider類的用途,能夠歸納CrawlSpider與Spider的區(qū)別了解CrawlSpider類的工作原理,能夠說(shuō)出CrawlSpider類時(shí)如何工作的掌握Rule類的使用,能夠靈活應(yīng)用Rule類制定爬蟲(chóng)抓取規(guī)則掌握LinkExtractor類的使用,能夠靈活inkExtractor類提取需要跟蹤爬取的鏈接章節(jié)概述/Summary在第9章中,我們對(duì)Scrapy框架有了初步的認(rèn)識(shí),知道了Scrapy框架由多個(gè)組件組成,那么Scrapy中的各個(gè)組件是如何工作的呢?本章將繼續(xù)對(duì)Scrapy框架中Spiders、ItemPipeline、DownloadMiddleware、Settings這幾個(gè)組件或中間件以及CrawlSpider類進(jìn)行詳細(xì)介紹。目錄/Contents10.110.210.3Spiders組件ItemPipeline組件DownloaderMiddlewares組件目錄/Contents10.410.5Settings組件CrawlSpider類實(shí)踐項(xiàng)目:采集暢購(gòu)商城的華為手表信息10.6Spiders組件10.1掌握Spiders組件,能夠應(yīng)用Spiders組件實(shí)現(xiàn)數(shù)據(jù)的抓取和解析學(xué)習(xí)目標(biāo)10.1Spiders組件Spiders組件是Scrapy框架的核心組件,它定義了網(wǎng)絡(luò)爬蟲(chóng)抓取網(wǎng)站數(shù)據(jù)的方式,包括抓取的動(dòng)作,比如是否跟進(jìn)鏈接,以及如何從網(wǎng)頁(yè)內(nèi)容中提取結(jié)構(gòu)化數(shù)據(jù)。換言之,Spiders組件用于定義抓取網(wǎng)頁(yè)數(shù)據(jù)的動(dòng)作及解析網(wǎng)頁(yè)數(shù)據(jù)。10.1Spiders組件10.1Spiders組件(1)根據(jù)初始URL創(chuàng)建請(qǐng)求Request,并設(shè)置回調(diào)函數(shù),當(dāng)該Request請(qǐng)求完畢后并返回Response,并將Response作為參數(shù)傳遞給該回調(diào)函數(shù)。(2)在回調(diào)函數(shù)中分析返回的內(nèi)容。返回的內(nèi)容主要有兩種形式,分別是Item對(duì)象或Request對(duì)象,其中Request對(duì)象會(huì)經(jīng)過(guò)Scrapy處理,下載相應(yīng)的內(nèi)容,并調(diào)用設(shè)置的回調(diào)函數(shù)。使用Scrapy編寫的爬蟲(chóng)來(lái)說(shuō),循環(huán)抓取網(wǎng)頁(yè)數(shù)據(jù)的流程分為如下4個(gè)步驟。10.1Spiders組件使用Scrapy編寫的爬蟲(chóng)來(lái)說(shuō),循環(huán)抓取網(wǎng)頁(yè)數(shù)據(jù)的流程分為如下4個(gè)步驟。(3)在回調(diào)函數(shù)中,可以使用Selectors(Scrapy自帶的選擇器,用于從網(wǎng)頁(yè)源代碼中提取數(shù)據(jù))、BeautifulSoup、lxml或其他的解析器來(lái)解析網(wǎng)頁(yè)數(shù)據(jù),并根據(jù)解析的數(shù)據(jù)生成Item。(4)將Spiders返回的Item數(shù)據(jù)經(jīng)ItemPipeline組件處理后存儲(chǔ)到數(shù)據(jù)庫(kù)或文件中。Scrapy框架提供了Spider作為爬蟲(chóng)的基類,自定義的爬蟲(chóng)需要繼承這個(gè)類。scrapy.Spider類的常用屬性和方法。name屬性:設(shè)置爬蟲(chóng)名稱的字符串。由于爬蟲(chóng)名稱用于被Scrapy定位和初始化一個(gè)爬蟲(chóng),所以它必須是唯一的。allowed_domains屬性:設(shè)置爬蟲(chóng)允許抓取的域名列表。start_urls屬性:表示初始URL元組或列表。當(dāng)沒(méi)有指定URL時(shí),爬蟲(chóng)會(huì)從該列表中開(kāi)始抓取。__init__()方法:負(fù)責(zé)初始化爬蟲(chóng)名稱和初始URL列表。start_requests()方法:負(fù)責(zé)生成Requests對(duì)象,交給Scrapy下載并返回Response。parse(response)方法:負(fù)責(zé)解析Response,并返回Item或Requests(需指定回調(diào)函數(shù))。log(message[level,component])方法:負(fù)責(zé)發(fā)送日志信息。10.1Spiders組件ItemPipeline組件10.2掌握Item組件,能夠應(yīng)用Item組件實(shí)現(xiàn)封裝數(shù)據(jù)的功能學(xué)習(xí)目標(biāo)10.2ItemPipeline組件當(dāng)Item對(duì)象在Spiders中被收集之后,會(huì)被傳遞給ItemPipeline組件。ItemPipeline組件的功能代碼位于Scrapy項(xiàng)目的pipelines.py文件中,該文件中可以定義多個(gè)管道,這些管道會(huì)按照定義的順序依次處理Item對(duì)象。驗(yàn)證抓取的數(shù)據(jù),檢查Item對(duì)象中是否包含某些字段。查重并丟棄重復(fù)數(shù)據(jù)。將抓取結(jié)果保存到文件或者數(shù)據(jù)庫(kù)中。10.2ItemPipeline組件每個(gè)管道其實(shí)是一個(gè)獨(dú)立的Python類,該類中有3個(gè)核心方法:process_item()、open_spider()和close_spider(),其中process_item()方法是必須實(shí)現(xiàn)的,其他兩個(gè)方法是可選實(shí)現(xiàn)的。10.2ItemPipeline組件10.2ItemPipeline組件process_item()方法process_item()方法是每個(gè)管道默認(rèn)會(huì)調(diào)用的方法,用于對(duì)Item對(duì)象進(jìn)行處理或丟棄,比如,將Item對(duì)象存入文件或數(shù)據(jù)庫(kù)。process_item(self,item,spider)item:表示被采集的Item對(duì)象。spider:表示采集Item對(duì)象的Spider對(duì)象。process_item()方法執(zhí)行后會(huì)出現(xiàn)兩種情況,一種情況是返回一個(gè)Item對(duì)象,另一種情況是拋出DropItem異常。10.2ItemPipeline組件open_spider()方法open_spider()方法是Spider對(duì)象開(kāi)啟時(shí)被自動(dòng)調(diào)用的方法,該方法中可以做一些初始化操作,如創(chuàng)建數(shù)據(jù)庫(kù)連接。open_spider(self,spider)spider:表示被開(kāi)啟的Spider對(duì)象。10.2ItemPipeline組件close_spider()方法close_spider()方法是Spider對(duì)象關(guān)閉時(shí)被自動(dòng)調(diào)用的方法,該方法中可以做一些收尾操作,如關(guān)閉數(shù)據(jù)庫(kù)連接。close_spider(self,spider)spider:表示被關(guān)閉的Spider對(duì)象。10.2ItemPipeline組件將第9章案例中采集的某培訓(xùn)公司的講師信息進(jìn)行持久化存儲(chǔ),存儲(chǔ)到一個(gè)獨(dú)立的teacher.json文件中,具體步驟如下。(1)定義一個(gè)管道在pipelines.py文件中定義一個(gè)管道類MyspiderPipeline。importjsonclassMyspiderPipeline:def__init__(self):self.file=open("teacher.json","w",encoding="utf-8")defprocess_item(self,item,spider):
content=json.dumps(dict(item),ensure_ascii=False)+"\n"#將Item對(duì)象寫入文件self.file.write(content)returnitemdefclose_spider(self,spider):
self.file.close()#關(guān)閉文件10.2ItemPipeline組件(2)啟用管道如果希望啟用剛剛定義的管道,必須將該管道類MyspiderPipeline添加到settings.py文件的ITEM_PIPELINES配置項(xiàng)中。#Configureitempipelines#See/en/latest/topics/item-pipeline.htmlITEM_PIPELINES={'mySpider.pipelines.MyspiderPipeline':300,}ITEM_PIPELINES配置項(xiàng)中能夠同時(shí)定義多個(gè)管道,它的值是一個(gè)字典。字典中鍵是管道類名,值是一個(gè)整數(shù),用于確定多個(gè)管道的運(yùn)行順序。整數(shù)可以為0~1000范圍內(nèi)的任意值,整數(shù)的值越低,管道的優(yōu)先級(jí)越高。10.2ItemPipeline組件(3)修改爬蟲(chóng)類修改itcast.py文件的parse()方法,在該方法中將末尾的returnitem語(yǔ)句去掉,在for循環(huán)的末尾增加yielditem語(yǔ)句,使parse()方法變成一個(gè)生成器。defparse(self,response):items=[]#存儲(chǔ)所有講師的信息
foreachinresponse.xpath("http://div[@class='li_txt']"):#創(chuàng)建MyspiderItem類的對(duì)象
item=MyspiderItem()………items.append(item)#交由管道處理
yielditem10.2ItemPipeline組件使用以下命令重新啟動(dòng)爬蟲(chóng)。scrapycrawlitcast待爬蟲(chóng)執(zhí)行結(jié)束后,可以看到程序的當(dāng)前目錄中增加了teacher.json文件,并且該文件已經(jīng)包含了要采集的講師信息。[單擊查看源碼]DownloaderMiddlewares組件10.3DownloaderMiddlewares是下載中間件,它處于引擎和下載器之間,多個(gè)下載中間件可以被同時(shí)加載運(yùn)行。下載中間件可以在請(qǐng)求傳遞給下載器之前對(duì)請(qǐng)求進(jìn)行處理,比如為請(qǐng)求添加請(qǐng)求頭,也可以在響應(yīng)傳遞給引擎之前對(duì)響應(yīng)進(jìn)行處理,比如進(jìn)行g(shù)zip的解壓。Scrapy中提供了一些內(nèi)置中間件,我們也可以自定義中間件。10.3DownloaderMiddlewares組件掌握內(nèi)置下載中間件的使用,能夠在爬蟲(chóng)項(xiàng)目啟用下載中間件學(xué)習(xí)目標(biāo)10.3.1內(nèi)置下載中間件Scrapy中附帶了許多下載中間件,這些中間件被變量DOWNLOADER_MIDDLEWARES_BASE所定義。{'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware':100,'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware':300,.........'scrapy.downloadermiddlewares.stats.DownloaderStats':850,'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware':900,}10.3.1內(nèi)置下載中間件上述字典中每個(gè)鍵為Scrapy內(nèi)置的下載中間件名稱,每個(gè)鍵對(duì)應(yīng)的值為調(diào)用的優(yōu)先級(jí),值越小代表越靠近Scrapy引擎,下載中間件會(huì)被優(yōu)先調(diào)用。10.3.1內(nèi)置下載中間件Scrapy中常用的內(nèi)置下載中間件中間件說(shuō)明CookiesMiddleware用于處理需要使用Cookie的網(wǎng)站DefaultHeadersMiddleware用于指定所有的默認(rèn)請(qǐng)求頭DownloadTimeoutMiddleware用于為請(qǐng)求設(shè)置下載的超時(shí)時(shí)長(zhǎng)HttpAuthMiddleware用于對(duì)某些Spiders生成的所有請(qǐng)求進(jìn)行身份驗(yàn)證HttpCacheMiddleware用于為所有請(qǐng)求和響應(yīng)提供低級(jí)的緩存HttpProxyMiddleware用于為請(qǐng)求設(shè)置HTTP代理UserAgentMiddleware允許Spiders覆蓋默認(rèn)的User_Agent掌握自定義下載中間件的使用,能夠在爬蟲(chóng)項(xiàng)目中定義自定義下載中間件學(xué)習(xí)目標(biāo)10.3.2自定義下載中間件10.3.2自定義下載中間件盡管Scrapy框架中附帶的中間件提供了基本功能,但在開(kāi)發(fā)項(xiàng)目時(shí)往往需要自定義下載中間件。自定義下載中間件的方式非常簡(jiǎn)單,我們只需要定義一個(gè)Python類,并在該類中實(shí)現(xiàn)一些特殊的方法,包括process_request()方法和process_response()方法。
process_request()方法process_request()方法用于對(duì)Request進(jìn)行處理,它會(huì)在Request被引擎調(diào)度給下載器之前被自動(dòng)調(diào)用。process_request(self,request,spider)10.3.2自定義下載中間件request:表示要處理的Request對(duì)象。spider:表示該Request對(duì)應(yīng)的Spider對(duì)象。process_request()方法的返回值有3種情況,分別是None、Response對(duì)象、Request對(duì)象,另外可能會(huì)拋出IgnoreRequest異常。10.3.2自定義下載中間件若返回值為None
,Scrapy將繼續(xù)處理該Request對(duì)象,并執(zhí)行其他中間件的相應(yīng)方法,直到合適的下載器處理函數(shù)被調(diào)用,該Request對(duì)象被執(zhí)行。返回Response對(duì)象,Scrapy將不會(huì)調(diào)用任何process_request()方法、process_exception()方法,或相應(yīng)的下載函數(shù),而是返回該Response。已安裝的中間件的process_response()方法會(huì)在每個(gè)Response返回時(shí)被調(diào)用。返回Request對(duì)象,Scrapy將停止調(diào)用process_request()方法并重新調(diào)度返回的Request。當(dāng)新返回的Request被執(zhí)行后,相應(yīng)的中間件將會(huì)根據(jù)下載的Response被調(diào)用。若拋出IgnoreRequest異常,則安裝的下載中間件的process_exception()方法會(huì)被調(diào)用。如果沒(méi)有任何一個(gè)方法處理該異常,則Request的errback(Request.errback)方法會(huì)被調(diào)用;如果沒(méi)有代碼處理拋出的異常,則該異常被忽略且不記錄(不同于其他異常的處理方式)。
process_request()方法process_response()方法用于對(duì)Response進(jìn)行處理,它會(huì)在Response被引擎調(diào)度給Spider之前被自動(dòng)調(diào)用。10.3.2自定義下載中間件process_response(self,request,response,spider)request:表示Response對(duì)象所對(duì)應(yīng)的Request對(duì)象。response:表示被處理的Response對(duì)象。spider:表示Response對(duì)象對(duì)應(yīng)的Spider對(duì)象。
process_request()方法process_response()方法返回值有兩種情況,分別是Response對(duì)象或Request對(duì)象,另外可能會(huì)拋出一個(gè)IgnoreRequest異常。10.3.2自定義下載中間件若返回一個(gè)Response對(duì)象,該Response對(duì)象會(huì)被處于鏈中的其他中間件的process_response()方法處理。若返回一個(gè)Request對(duì)象,則中間件鏈停止,返回的Request對(duì)象會(huì)被重新調(diào)度下載。若拋出一個(gè)IgnoreRequest異常,則調(diào)用Request對(duì)象的errback(Request.errback)方法。如果沒(méi)有代碼處理拋出的異常,則該異常被忽略且不記錄。
process_request()方法10.3.2自定義下載中間件我們自定義一個(gè)下載中間件,通過(guò)該下載中間件實(shí)現(xiàn)隨機(jī)獲取Uesr-Agent的功能,具體步驟如下。(1)在settings.py同級(jí)目錄下的middlewares.py文件中定義RandomUserAgent類,在該類中實(shí)現(xiàn)process_rquests()方法。importrandomfromsettingsimportUSER_AGENTS#隨機(jī)的User-AgentclassRandomUserAgent:defprocess_request(self,request,spider):useragent=random.choice(USER_AGENTS)request.headers.setdefault("User-Agent",useragent)10.3.2自定義下載中間件(2)在settings.py文件中添加可用的USER_AGENTS列表,以及一些其他設(shè)置。添加USER_AGENTS列表。USER_AGENTS=["Mozilla/5.0(X11;U;Linux;en-US)AppleWebKit/527+(KHTML,likeGecko,Safari/419.3)Arora/0.6","Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:pre)Gecko/20070215K-Ninja/2.1.1",
………"Mozilla/5.0(Windows;U;WindowsNT5.1;zh-CN;rv:1.9)Gecko/20080705Firefox/3.0Kapiko/3.0","Mozilla/5.0(X11;Linuxi686;U;)Gecko/20070322Kazehakase/0.4.5"]掌握激活下載中間件,能夠在settings.py文件中添加自定義中間件學(xué)習(xí)目標(biāo)10.3.3激活下載中間件如果希望自定義的下載中間件能夠應(yīng)用到程序中,需要激活下載中間件。激活下載中間件只需要將該下載中間件添加到settings.py文件的配置項(xiàng)DOWNLOADER_MIDDLEWARES中。DOWNLOADER_MIDDLEWARES={'mySpider.middlewares.RandomUserAgent':1,}10.3.3激活下載中間件在settings.py中的配置項(xiàng)DOWNLOADER_MIDDLEWARES中添加10.3.2節(jié)自定義的中間件RandomUserAgent。自定義的下載中間件會(huì)與內(nèi)置的下載中間件合并,但不會(huì)覆蓋。如果希望禁用某個(gè)下載中間件,必須在DOWNLOADER_MIDDLEWARES中定義該下載中間件,并將該下載中間件的值設(shè)置為None。DOWNLOADER_MIDDLEWARES={'scrapy.downloadermiddlewares.cookies.CookiesMiddleware':None,}10.3.3激活下載中間件例如,禁用下載中間件CookiesMiddleware
,防止某些網(wǎng)站根據(jù)Cookie來(lái)封鎖網(wǎng)絡(luò)爬蟲(chóng)程序。Settings組件10.4Settings組件用于定制Scrapy中所有組件的行為,包括核心組件、擴(kuò)展組件、管道以及Spiders組件等。settings.py是Scrapy項(xiàng)目的標(biāo)準(zhǔn)配置文件,該文件是Settings組件應(yīng)用的地方,用于為Scrapy項(xiàng)目添加或更改配置。10.4Settings組件BOT_NAME用于設(shè)置使用Scrapy實(shí)現(xiàn)的bot名稱,也叫項(xiàng)目名稱,默認(rèn)名稱為scrapybot。該名稱用于構(gòu)造默認(rèn)的User-Agent,同時(shí)也用于記錄日志。CONCURRENT_ITEMS用于設(shè)置ItemPipeline組件可以同時(shí)處理每個(gè)Response的Item對(duì)象的最大值,默認(rèn)值為100。CONCURRENT_REQUESTS用于設(shè)置下載器可以處理并發(fā)請(qǐng)求(concurrentrequests)的最大值,默認(rèn)值為16。DEFAULT_REQUEST_HEADERS用于設(shè)置Request使用的請(qǐng)求頭。DEPTH_LIMIT用于設(shè)置抓取網(wǎng)站最大允許的深度(depth)值。默認(rèn)值為0,表示沒(méi)有限制。DOWNLOAD_DELAY用于設(shè)置下載器在下載同一網(wǎng)站的下一頁(yè)面前所需要等待的時(shí)間(單位為秒),默認(rèn)值為0。10.4Settings組件DOWNLOAD_TIMEOUT用于設(shè)置下載器的超時(shí)時(shí)間,單位為秒,默認(rèn)值為180。ITEM_PIPELINES用于設(shè)置管道的調(diào)用順序,它對(duì)應(yīng)的值是一個(gè)保存項(xiàng)目中啟用的管道及其調(diào)用順序的字典,默認(rèn)值為空。LOG_ENABLED用于設(shè)置是否啟用logging,默認(rèn)值是True。LOG_ENCODING用于設(shè)置logging使用的編碼,默認(rèn)值是'utf-8'。LOG_LEVEL用于設(shè)置log的最低級(jí)別,它支持的級(jí)別取值包括CRITICAL、ERROR、WARNING、INFO、DEBUG,默認(rèn)值是DEBUG。USER_AGENT用于設(shè)置抓取網(wǎng)站的數(shù)據(jù)時(shí)默認(rèn)使用的User-Agent,除非被覆蓋,該配置項(xiàng)的默認(rèn)值是"Scrapy/VERSION(+)"。COOKIES_ENABLED用于設(shè)置是否禁用Cookie,默認(rèn)值為True。為了不讓網(wǎng)站根據(jù)請(qǐng)求的Cookie識(shí)別出網(wǎng)絡(luò)爬蟲(chóng)的身份,一般會(huì)禁用Cookie的功能,將該配置項(xiàng)的值設(shè)置為False。10.4Settings組件CrawlSpider類10.5網(wǎng)頁(yè)上的數(shù)據(jù)往往是分頁(yè)顯示的,要獲取每個(gè)頁(yè)面上的數(shù)據(jù),我們可以通過(guò)分析網(wǎng)頁(yè)的URL地址格式,然后手動(dòng)更改URL的參數(shù)來(lái)實(shí)現(xiàn)。但其實(shí),Scrapy框架中專門提供了一個(gè)爬蟲(chóng)類CrawlSpider,該類用于全網(wǎng)站的自動(dòng)抓取,它能夠自動(dòng)抓取URL地址具有一定規(guī)則的網(wǎng)站上的所有網(wǎng)頁(yè)數(shù)據(jù)。10.5CrawlSpider類熟悉CrawlSpider類的用途,能夠歸納CrawlSpider與Spider的區(qū)別學(xué)習(xí)目標(biāo)10.5.1CrawlSpider類簡(jiǎn)介scrapy.spiders模塊中提供了CrawlSpider類專門用于自動(dòng)抓取,CrawlSpider類是Spider的子類,Spider類的設(shè)計(jì)原則是只抓取start_url列表中的網(wǎng)頁(yè),而CrawlSpider類定義了一些規(guī)則(Rule類對(duì)象)提供跟進(jìn)鏈接(LinkExtractor類對(duì)象)的機(jī)制,適用于從抓取的網(wǎng)頁(yè)中獲取鏈接并繼續(xù)執(zhí)行抓取數(shù)據(jù)的工作。scrapygenspider-tcrawl爬蟲(chóng)名稱爬蟲(chóng)域上述命令中,選項(xiàng)-t表示模板,crawl表示模板的名稱。10.5.1CrawlSpider類簡(jiǎn)介例如,創(chuàng)建一個(gè)名稱為baidu,爬蟲(chóng)域?yàn)榈腃rawlSpider類爬蟲(chóng)。scrapygenspider-tcrawlbaidu10.5.1CrawlSpider類簡(jiǎn)介當(dāng)創(chuàng)建好爬蟲(chóng)baidu,會(huì)在爬蟲(chóng)項(xiàng)目中自動(dòng)創(chuàng)建一個(gè)baidu.py文件,該文件內(nèi)容如下。importscrapyfromscrapy.linkextractorsimportLinkExtractorfromscrapy.spidersimportCrawlSpider,RuleclassBaiduSpider(CrawlSpider):name='baidu'allowed_domains=['']start_urls=['/']rules=(Rule(LinkExtractor(allow=r'Items/'),callback='parse_item',follow=True),)defparse_item(self,response):item={}#item['domain_id']=response.xpath('//input[@id="sid"]/@value').get()returnitem10.5.1CrawlSpider類簡(jiǎn)介多學(xué)一招Scrapy框架的爬蟲(chóng)文件模板如果希望知道Scapy框架中有哪些模板,可以通過(guò)“scrapygenspider–l”命令查看Scapy項(xiàng)目中擁有的爬蟲(chóng)文件模板。>C:\Users\admin>scrapygenspider-lAvailabletemplates:basiccrawlcsvfeedxmlfeed多學(xué)一招Scrapy框架的爬蟲(chóng)文件模板Scapy框架中提供了4個(gè)可用的爬蟲(chóng)文件模板。basic:提供的基礎(chǔ)模板,繼承自Spider類。crawl:提供更靈活的提取數(shù)據(jù)的方式,繼承自CrawlSpider類。csvfeed:提供從CSV格式文件中提取數(shù)據(jù)的方式,繼承自CSVFeedSpider類。xmlfeed:提供從XML格式文件中提取數(shù)據(jù)的方式,繼承自XMLFeedSpider類。多學(xué)一招Scrapy框架的爬蟲(chóng)文件模板若希望了解某一爬蟲(chóng)文件模板中的具體內(nèi)容,可以使用如下命令進(jìn)行查看。scrapygenspider-d模塊名稱例如,查看基于crawl模板創(chuàng)建的爬蟲(chóng)文件的內(nèi)容,具體命令如下所示。scrapygenspider-dcrawl在對(duì)幾個(gè)模板熟悉以后,我們就可以使用如下命令創(chuàng)建爬蟲(chóng)。scrapygenspider(-ttemplate)namedomain了解CrawlSpider類的工作原理,能夠說(shuō)出CrawlSpider類是如何工作的學(xué)習(xí)目標(biāo)10.5.2CrawlSpider類的工作原理CrawlSpider類由于繼承了Spider類,所以繼承了Spider類的所有公有成員。此外,CrawlSpider類自身也定義了一些屬性。在這里,我們著重了解一下rules屬性。rules屬性是一個(gè)包含一個(gè)或多個(gè)Rule對(duì)象給續(xù)會(huì)介紹的列表。每個(gè)Rule對(duì)象對(duì)抓取網(wǎng)站的動(dòng)作定義了特定表現(xiàn)。如果多個(gè)Rule對(duì)象匹配了同一個(gè)鏈接,則根據(jù)它們?cè)诒緦傩灾卸x的順序,使用第一個(gè)Rule對(duì)象。10.5.2CrawlSpider類的工作原理10.5.2CrawlSpider類的工作原理CrawlSpider類的方法方法說(shuō)明__init__()負(fù)責(zé)初始化,并調(diào)用_compile_rules()方法parse()
該方法進(jìn)行了重寫,在方法體中直接調(diào)用方法_parse_response(),并把parse_start_url()方法作為處理response的方法parse_start_url()該方法主要用于處理parse()方法返回的Response,比如提取出需要的數(shù)據(jù)等,它需要返回Item、Request,或者兩者組合的可迭代對(duì)象_requests_to_follow()該方法用于從Response中解析出目標(biāo)URL,并將其包裝成Request請(qǐng)求,該請(qǐng)求的回調(diào)方法是_response_downloaded()10.5.2CrawlSpider類的工作原理方法說(shuō)明_response_downloaded()該方法是_requests_to_follow()方法的回調(diào)方法,作用是調(diào)用_parse_response()方法,處理下載器返回的Response,設(shè)置Response的處理方法為rule.callback()方法_parse_response()該方法將Response交給參數(shù)callback代表的方法去處理,然后處理callback()方法的requests_or_item,再根據(jù)rule.followandspider._follow_links來(lái)判斷是否繼續(xù)采集,如果繼續(xù)那么就將Response交給_requests_to_follow()方法,根據(jù)規(guī)則提取相關(guān)的鏈接。spider._follow_links的值是從settings的CRAWLSPIDER_FOLLOW_LINKS值獲取到的_compile_rules()這個(gè)方法的作用是將rule中的字符串表示的方法改成實(shí)際的方法,方便以后使用CrawlSpider類的方法10.5.2CrawlSpider類的工作原理當(dāng)CrawlSpider爬蟲(chóng)運(yùn)行時(shí),首先由start_requests()方法對(duì)start_urls中的每一個(gè)URL發(fā)起請(qǐng)求,網(wǎng)頁(yè)請(qǐng)求發(fā)出后返回的Response會(huì)被parse()方法接收。CrawlSpider類中使用了parse()方法來(lái)解析Response。defparse(self,response):returnself._parse_response(response,self.parse_start_url,cb_kwargs={},follow=True)10.5.2CrawlSpider類的工作原理def_parse_response(self,response,callback,cb_kwargs,follow=True):#如果傳入callback,使用該callback解析頁(yè)面并獲取解析得到的request或itemifcallback:cb_res=callback(response,**cb_kwargs)or()cb_res=cess_results(response,cb_res)forrequests_or_iteminiterate_spider_output(cb_res):yieldrequests_or_item#判斷有無(wú)follow,用_requests_to_follow解析響應(yīng)是否有符合要求的link。
iffollowandself._follow_links:forrequest_or_iteminself._requests_to_follow(response):yieldrequest_or_itemCrawlSpider類中的parse()方法直接調(diào)用了_parse_response()方法,該方法用于處理response對(duì)象,它根據(jù)有無(wú)callback,follow和self.follow_links執(zhí)行不同的操作。10.5.2CrawlSpider類的工作原理_requests_to_follow()方法又會(huì)獲取link_extractor解析頁(yè)面得到的link(link_extractor.extract_links(response)),對(duì)URL進(jìn)行加工(process_links,需要自定義),對(duì)符合的link發(fā)起Request。def_requests_to_follow(self,response):ifnotisinstance(response,HtmlResponse):returnseen=set()forn,ruleinenumerate(self._rules):links=[lnkforlnkinrule.link_extractor.extract_links(response)iflnknotinseen]iflinksandcess_links:links=cess_links(links)forlinkinlinks:seen.add(link)r=self._build_request(n,link)yieldcess_request(r)在_requests_to_follow()方法中,使用了set集合來(lái)記錄提取出的鏈接,確保提取的鏈接沒(méi)有重復(fù)的。10.5.2CrawlSpider類的工作原理CrawlSpider類會(huì)在__init__()方法中調(diào)用_compile_rules()方法,然后在其中淺復(fù)制rules中的各個(gè)Rule獲取用于回調(diào)(callback)、要進(jìn)行處理的鏈接(process_links)和要進(jìn)行的處理請(qǐng)求(process_request)。def_compile_rules(self):defget_method(method):ifcallable(method):returnmethodelifisinstance(method,six.string_types):returngetattr(self,method,None)self._rules=[copy.copy(r)forrinself.rules]forruleinself._rules:rule.callback=get_method(rule.callback)cess_links=get_method(cess_links)cess_request=get_method(cess_request)掌握Rule類的使用,能夠靈活應(yīng)用Rule類制定爬蟲(chóng)爬取規(guī)則學(xué)習(xí)目標(biāo)10.5.3通過(guò)Rule類決定抓取規(guī)則10.5.3通過(guò)Rule類決定抓取規(guī)則CrawlSpider類使用rules屬性來(lái)決定爬蟲(chóng)的爬取規(guī)則,并將匹配后的URL請(qǐng)求提交給引擎。正常情況下,CrawlSpider類無(wú)須單獨(dú)手動(dòng)返回請(qǐng)求。在rules屬性中可以包含一個(gè)或多個(gè)Rule對(duì)象,每個(gè)Rule對(duì)象都對(duì)爬取網(wǎng)站的動(dòng)作定義了某種特定操作。Rule(link_extractor,callback=None,cb_kwargs=None,follow=None,process_links=None,process_request=None)link_extractor:是一個(gè)LinkExtractor對(duì)象,用于定義鏈接的解析規(guī)則。callback:指定了回調(diào)方法的名稱。cb_kwargs:是一個(gè)字典,包含了傳遞給回調(diào)方法的參數(shù),默認(rèn)值是None。follow:是一個(gè)布爾值,指定了根據(jù)本條Rule從response對(duì)象中提取的鏈接是否需要跟進(jìn)。process_links:指定回調(diào)方法的名稱,該回調(diào)方法用于過(guò)濾鏈接,處理根據(jù)link_extractor從response對(duì)象中獲取到的鏈接列表。process_request:指定回調(diào)方法的名稱,該回調(diào)方法用于根據(jù)本rule提取出來(lái)的request對(duì)象,其返回值必須是一個(gè)request對(duì)象或者None。掌握LinkExtractor類的使用,能夠靈活應(yīng)用LinkExtractor類提取需要跟蹤爬取的鏈接學(xué)習(xí)目標(biāo)10.5.4通過(guò)LinkExtractor類提取鏈接10.5.4通過(guò)LinkExtractor類提取鏈接LinkExtractor類負(fù)責(zé)從網(wǎng)頁(yè)中提取需要跟蹤抓取的鏈接,按照規(guī)定的提取規(guī)則提取鏈接。這個(gè)規(guī)則只適用于網(wǎng)頁(yè)的鏈接,不適用于網(wǎng)頁(yè)中的普通文本。Scrapy框架在scrapy.linkextractors模塊中提供了LinkExtractor類專門用于表示鏈接提取類,但是我們也可以自定義一個(gè)符合特定需求的鏈接提取類,只需要讓它實(shí)現(xiàn)一個(gè)簡(jiǎn)單的接口即可。10.5.4通過(guò)LinkExtractor類提取鏈接每個(gè)LinkExtractor都有唯一的公共方法extract_links(),該方法接收一個(gè)Response對(duì)象作為參數(shù),并返回一個(gè)類型為scrapy.link.Link的列表。在爬蟲(chóng)工作過(guò)程中,鏈接提取類只需要實(shí)例化一次,但是從響應(yīng)對(duì)象中提取鏈接時(shí)會(huì)多次調(diào)用extract_links()方法。鏈接提取類一般與若干Rules結(jié)合用于CrawlSpider類中,也用于其他與CrawlSpider類無(wú)關(guān)的場(chǎng)合。10.5.4通過(guò)LinkExtractor類提取鏈接LinkExtractor類的構(gòu)造方法的聲明如下所示。classscrapy.linkextractors.LinkExtractor(allow=(),deny=(),allow_domains=(),deny_domains=(),restrict_xpaths=(),tags=('a','area'),attrs=('href'),canonicalize=False,unique=True,process_value=None,deny_extensions=None,restrict_css=(),strip=True)allow:其值為一個(gè)或多個(gè)正則表達(dá)式組成的元組,只有匹配這些正則表達(dá)式的URL才會(huì)被提取。如果allow參數(shù)為空,則會(huì)匹配所有鏈接。deny:其值為一個(gè)或多個(gè)正則表達(dá)式組成的元組,滿足這些正則表達(dá)式的URL會(huì)被排除不被提?。▋?yōu)先級(jí)高于allow參數(shù))。如果deny參數(shù)為空,則不會(huì)排除任何URL。allow_domains:其值是一個(gè)或多個(gè)字符串組成的元組,表示會(huì)被提取的鏈接所在的域名。10.5.4通過(guò)LinkExtractor類提取鏈接deny_domains:其值是一個(gè)或多個(gè)字符串組成的元組,表示被排除不提取的鏈接所在的域名。restrict_xpaths:其值是一個(gè)或多個(gè)XPath表達(dá)式組成的元組,表示只在符合該XPath定義的文字區(qū)域搜尋鏈接。tags:用于識(shí)別要提取的鏈接標(biāo)簽,默認(rèn)值為('a','area')。attrs:其值是一個(gè)或多個(gè)字符串組成的元組,表示在提取鏈接時(shí)要識(shí)別的屬性(僅當(dāng)該屬性在tags規(guī)定的標(biāo)簽里出現(xiàn)時(shí)),默認(rèn)值是('href')。canonicalize:表示是否將提取到的URL標(biāo)準(zhǔn)化,默認(rèn)值為False。由于使用標(biāo)準(zhǔn)化后的URL訪問(wèn)服務(wù)器與使用原URL訪問(wèn)得到的結(jié)果可能不同,所以最好保持使用它的默認(rèn)值False。unique:表示是否要對(duì)提取的鏈接進(jìn)行去重過(guò)濾,默認(rèn)值為True。LinkExtractor類的構(gòu)造方法的聲明如下所示。10.5.4通過(guò)LinkExtractor類提取鏈接process_value:負(fù)責(zé)對(duì)提取的鏈接進(jìn)行處理的函數(shù),能夠?qū)︽溄舆M(jìn)行修改并返回一個(gè)新值,如果返回None則忽略該鏈接。如果不對(duì)process_value參數(shù)賦值,則使用它的默認(rèn)值“l(fā)ambdax:x”。deny_extensions:其值是一個(gè)字符串或者字符串列表,表示提取鏈接時(shí)應(yīng)被排除的文件擴(kuò)展名。例如,['bmp','gif','jpg',]表示排除包含有這些擴(kuò)展名的URL地址。restrict_css:其值是一個(gè)或多個(gè)css表達(dá)式組成的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全生產(chǎn)責(zé)任制課件
- 加油站的安全檢查
- 專項(xiàng)銷售會(huì)議服務(wù)合作協(xié)議2024年版版B版
- 二零二五年度鄰里糾紛打架賠償協(xié)議3篇
- 2024版國(guó)內(nèi)貨物運(yùn)輸協(xié)議范本版B版
- 2024版物業(yè)管理服務(wù)合同(含標(biāo)的:物業(yè)服務(wù)質(zhì)量保證)
- 中途退場(chǎng)2024年分包協(xié)議
- 2024藥房員工加班工資及休息休假勞動(dòng)合同3篇
- 2025年O2O電子商務(wù)代運(yùn)營(yíng)及客戶關(guān)系管理系統(tǒng)合同3篇
- 2024版景區(qū)品牌授權(quán)使用合同
- 《三本白皮書(shū)》全文內(nèi)容及應(yīng)知應(yīng)會(huì)知識(shí)點(diǎn)
- 藝術(shù)漆培訓(xùn)課件
- 專題14 思想方法專題:線段與角計(jì)算中的思想方法壓軸題四種模型全攻略(解析版)
- 建德海螺二期施工組織設(shè)計(jì)
- 山東省菏澤市2023-2024學(xué)年高一上學(xué)期期末測(cè)試物理試題(解析版)
- 2024年學(xué)校后勤日用品采購(gòu)合同范本2篇
- 中建中建機(jī)電工程聯(lián)動(dòng)調(diào)試實(shí)施方案范本
- 新《安全生產(chǎn)法》安全培訓(xùn)
- 山東省濟(jì)南市2023-2024學(xué)年高一上學(xué)期1月期末考試 物理 含答案
- 上海教育出版社 藝術(shù) 八年級(jí)上冊(cè)第三單元 鄉(xiāng)音鄉(xiāng)韻 京腔京韻系鄉(xiāng)情 教學(xué)設(shè)計(jì)
- 人教版(2024新教材)七年級(jí)上冊(cè)數(shù)學(xué)第一章《有理數(shù)》單元測(cè)試卷(含答案)
評(píng)論
0/150
提交評(píng)論