![《Python網(wǎng)絡爬蟲基礎教程》 課件-第10章 Scrapy核心組件與CrawlSpider類_第1頁](http://file4.renrendoc.com/view11/M00/2E/10/wKhkGWd57tmAB-ljAACjQEVwhxU851.jpg)
![《Python網(wǎng)絡爬蟲基礎教程》 課件-第10章 Scrapy核心組件與CrawlSpider類_第2頁](http://file4.renrendoc.com/view11/M00/2E/10/wKhkGWd57tmAB-ljAACjQEVwhxU8512.jpg)
![《Python網(wǎng)絡爬蟲基礎教程》 課件-第10章 Scrapy核心組件與CrawlSpider類_第3頁](http://file4.renrendoc.com/view11/M00/2E/10/wKhkGWd57tmAB-ljAACjQEVwhxU8513.jpg)
![《Python網(wǎng)絡爬蟲基礎教程》 課件-第10章 Scrapy核心組件與CrawlSpider類_第4頁](http://file4.renrendoc.com/view11/M00/2E/10/wKhkGWd57tmAB-ljAACjQEVwhxU8514.jpg)
![《Python網(wǎng)絡爬蟲基礎教程》 課件-第10章 Scrapy核心組件與CrawlSpider類_第5頁](http://file4.renrendoc.com/view11/M00/2E/10/wKhkGWd57tmAB-ljAACjQEVwhxU8515.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第10章Scrapy核心組件與CrawlSpider類《Python網(wǎng)絡爬蟲基礎教程》學習目標/Target掌握Spiders組件,能夠應用Spiders組件實現(xiàn)數(shù)據(jù)的抓取和解析掌握Item組件,能夠應用Item組件實現(xiàn)封裝數(shù)據(jù)的功能掌握ItemPipeline組件,能夠應用ItemPipeline組件實現(xiàn)處理后期數(shù)據(jù)的功能掌握DownloaderMiddlewares組件,能夠應用DownloaderMiddlewares中間件應對防爬蟲行為掌握Settings組件,能夠應用Settings組件中的配置項定制各個Scrapy組件的行為學習目標/Target熟悉CrawlSpider類的用途,能夠歸納CrawlSpider與Spider的區(qū)別了解CrawlSpider類的工作原理,能夠說出CrawlSpider類時如何工作的掌握Rule類的使用,能夠靈活應用Rule類制定爬蟲抓取規(guī)則掌握LinkExtractor類的使用,能夠靈活inkExtractor類提取需要跟蹤爬取的鏈接章節(jié)概述/Summary在第9章中,我們對Scrapy框架有了初步的認識,知道了Scrapy框架由多個組件組成,那么Scrapy中的各個組件是如何工作的呢?本章將繼續(xù)對Scrapy框架中Spiders、ItemPipeline、DownloadMiddleware、Settings這幾個組件或中間件以及CrawlSpider類進行詳細介紹。目錄/Contents10.110.210.3Spiders組件ItemPipeline組件DownloaderMiddlewares組件目錄/Contents10.410.5Settings組件CrawlSpider類實踐項目:采集暢購商城的華為手表信息10.6Spiders組件10.1掌握Spiders組件,能夠應用Spiders組件實現(xiàn)數(shù)據(jù)的抓取和解析學習目標10.1Spiders組件Spiders組件是Scrapy框架的核心組件,它定義了網(wǎng)絡爬蟲抓取網(wǎng)站數(shù)據(jù)的方式,包括抓取的動作,比如是否跟進鏈接,以及如何從網(wǎng)頁內(nèi)容中提取結(jié)構(gòu)化數(shù)據(jù)。換言之,Spiders組件用于定義抓取網(wǎng)頁數(shù)據(jù)的動作及解析網(wǎng)頁數(shù)據(jù)。10.1Spiders組件10.1Spiders組件(1)根據(jù)初始URL創(chuàng)建請求Request,并設置回調(diào)函數(shù),當該Request請求完畢后并返回Response,并將Response作為參數(shù)傳遞給該回調(diào)函數(shù)。(2)在回調(diào)函數(shù)中分析返回的內(nèi)容。返回的內(nèi)容主要有兩種形式,分別是Item對象或Request對象,其中Request對象會經(jīng)過Scrapy處理,下載相應的內(nèi)容,并調(diào)用設置的回調(diào)函數(shù)。使用Scrapy編寫的爬蟲來說,循環(huán)抓取網(wǎng)頁數(shù)據(jù)的流程分為如下4個步驟。10.1Spiders組件使用Scrapy編寫的爬蟲來說,循環(huán)抓取網(wǎng)頁數(shù)據(jù)的流程分為如下4個步驟。(3)在回調(diào)函數(shù)中,可以使用Selectors(Scrapy自帶的選擇器,用于從網(wǎng)頁源代碼中提取數(shù)據(jù))、BeautifulSoup、lxml或其他的解析器來解析網(wǎng)頁數(shù)據(jù),并根據(jù)解析的數(shù)據(jù)生成Item。(4)將Spiders返回的Item數(shù)據(jù)經(jīng)ItemPipeline組件處理后存儲到數(shù)據(jù)庫或文件中。Scrapy框架提供了Spider作為爬蟲的基類,自定義的爬蟲需要繼承這個類。scrapy.Spider類的常用屬性和方法。name屬性:設置爬蟲名稱的字符串。由于爬蟲名稱用于被Scrapy定位和初始化一個爬蟲,所以它必須是唯一的。allowed_domains屬性:設置爬蟲允許抓取的域名列表。start_urls屬性:表示初始URL元組或列表。當沒有指定URL時,爬蟲會從該列表中開始抓取。__init__()方法:負責初始化爬蟲名稱和初始URL列表。start_requests()方法:負責生成Requests對象,交給Scrapy下載并返回Response。parse(response)方法:負責解析Response,并返回Item或Requests(需指定回調(diào)函數(shù))。log(message[level,component])方法:負責發(fā)送日志信息。10.1Spiders組件ItemPipeline組件10.2掌握Item組件,能夠應用Item組件實現(xiàn)封裝數(shù)據(jù)的功能學習目標10.2ItemPipeline組件當Item對象在Spiders中被收集之后,會被傳遞給ItemPipeline組件。ItemPipeline組件的功能代碼位于Scrapy項目的pipelines.py文件中,該文件中可以定義多個管道,這些管道會按照定義的順序依次處理Item對象。驗證抓取的數(shù)據(jù),檢查Item對象中是否包含某些字段。查重并丟棄重復數(shù)據(jù)。將抓取結(jié)果保存到文件或者數(shù)據(jù)庫中。10.2ItemPipeline組件每個管道其實是一個獨立的Python類,該類中有3個核心方法:process_item()、open_spider()和close_spider(),其中process_item()方法是必須實現(xiàn)的,其他兩個方法是可選實現(xiàn)的。10.2ItemPipeline組件10.2ItemPipeline組件process_item()方法process_item()方法是每個管道默認會調(diào)用的方法,用于對Item對象進行處理或丟棄,比如,將Item對象存入文件或數(shù)據(jù)庫。process_item(self,item,spider)item:表示被采集的Item對象。spider:表示采集Item對象的Spider對象。process_item()方法執(zhí)行后會出現(xiàn)兩種情況,一種情況是返回一個Item對象,另一種情況是拋出DropItem異常。10.2ItemPipeline組件open_spider()方法open_spider()方法是Spider對象開啟時被自動調(diào)用的方法,該方法中可以做一些初始化操作,如創(chuàng)建數(shù)據(jù)庫連接。open_spider(self,spider)spider:表示被開啟的Spider對象。10.2ItemPipeline組件close_spider()方法close_spider()方法是Spider對象關(guān)閉時被自動調(diào)用的方法,該方法中可以做一些收尾操作,如關(guān)閉數(shù)據(jù)庫連接。close_spider(self,spider)spider:表示被關(guān)閉的Spider對象。10.2ItemPipeline組件將第9章案例中采集的某培訓公司的講師信息進行持久化存儲,存儲到一個獨立的teacher.json文件中,具體步驟如下。(1)定義一個管道在pipelines.py文件中定義一個管道類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對象寫入文件self.file.write(content)returnitemdefclose_spider(self,spider):
self.file.close()#關(guān)閉文件10.2ItemPipeline組件(2)啟用管道如果希望啟用剛剛定義的管道,必須將該管道類MyspiderPipeline添加到settings.py文件的ITEM_PIPELINES配置項中。#Configureitempipelines#See/en/latest/topics/item-pipeline.htmlITEM_PIPELINES={'mySpider.pipelines.MyspiderPipeline':300,}ITEM_PIPELINES配置項中能夠同時定義多個管道,它的值是一個字典。字典中鍵是管道類名,值是一個整數(shù),用于確定多個管道的運行順序。整數(shù)可以為0~1000范圍內(nèi)的任意值,整數(shù)的值越低,管道的優(yōu)先級越高。10.2ItemPipeline組件(3)修改爬蟲類修改itcast.py文件的parse()方法,在該方法中將末尾的returnitem語句去掉,在for循環(huán)的末尾增加yielditem語句,使parse()方法變成一個生成器。defparse(self,response):items=[]#存儲所有講師的信息
foreachinresponse.xpath("http://div[@class='li_txt']"):#創(chuàng)建MyspiderItem類的對象
item=MyspiderItem()………items.append(item)#交由管道處理
yielditem10.2ItemPipeline組件使用以下命令重新啟動爬蟲。scrapycrawlitcast待爬蟲執(zhí)行結(jié)束后,可以看到程序的當前目錄中增加了teacher.json文件,并且該文件已經(jīng)包含了要采集的講師信息。[單擊查看源碼]DownloaderMiddlewares組件10.3DownloaderMiddlewares是下載中間件,它處于引擎和下載器之間,多個下載中間件可以被同時加載運行。下載中間件可以在請求傳遞給下載器之前對請求進行處理,比如為請求添加請求頭,也可以在響應傳遞給引擎之前對響應進行處理,比如進行g(shù)zip的解壓。Scrapy中提供了一些內(nèi)置中間件,我們也可以自定義中間件。10.3DownloaderMiddlewares組件掌握內(nèi)置下載中間件的使用,能夠在爬蟲項目啟用下載中間件學習目標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)置下載中間件上述字典中每個鍵為Scrapy內(nèi)置的下載中間件名稱,每個鍵對應的值為調(diào)用的優(yōu)先級,值越小代表越靠近Scrapy引擎,下載中間件會被優(yōu)先調(diào)用。10.3.1內(nèi)置下載中間件Scrapy中常用的內(nèi)置下載中間件中間件說明CookiesMiddleware用于處理需要使用Cookie的網(wǎng)站DefaultHeadersMiddleware用于指定所有的默認請求頭DownloadTimeoutMiddleware用于為請求設置下載的超時時長HttpAuthMiddleware用于對某些Spiders生成的所有請求進行身份驗證HttpCacheMiddleware用于為所有請求和響應提供低級的緩存HttpProxyMiddleware用于為請求設置HTTP代理UserAgentMiddleware允許Spiders覆蓋默認的User_Agent掌握自定義下載中間件的使用,能夠在爬蟲項目中定義自定義下載中間件學習目標10.3.2自定義下載中間件10.3.2自定義下載中間件盡管Scrapy框架中附帶的中間件提供了基本功能,但在開發(fā)項目時往往需要自定義下載中間件。自定義下載中間件的方式非常簡單,我們只需要定義一個Python類,并在該類中實現(xiàn)一些特殊的方法,包括process_request()方法和process_response()方法。
process_request()方法process_request()方法用于對Request進行處理,它會在Request被引擎調(diào)度給下載器之前被自動調(diào)用。process_request(self,request,spider)10.3.2自定義下載中間件request:表示要處理的Request對象。spider:表示該Request對應的Spider對象。process_request()方法的返回值有3種情況,分別是None、Response對象、Request對象,另外可能會拋出IgnoreRequest異常。10.3.2自定義下載中間件若返回值為None
,Scrapy將繼續(xù)處理該Request對象,并執(zhí)行其他中間件的相應方法,直到合適的下載器處理函數(shù)被調(diào)用,該Request對象被執(zhí)行。返回Response對象,Scrapy將不會調(diào)用任何process_request()方法、process_exception()方法,或相應的下載函數(shù),而是返回該Response。已安裝的中間件的process_response()方法會在每個Response返回時被調(diào)用。返回Request對象,Scrapy將停止調(diào)用process_request()方法并重新調(diào)度返回的Request。當新返回的Request被執(zhí)行后,相應的中間件將會根據(jù)下載的Response被調(diào)用。若拋出IgnoreRequest異常,則安裝的下載中間件的process_exception()方法會被調(diào)用。如果沒有任何一個方法處理該異常,則Request的errback(Request.errback)方法會被調(diào)用;如果沒有代碼處理拋出的異常,則該異常被忽略且不記錄(不同于其他異常的處理方式)。
process_request()方法process_response()方法用于對Response進行處理,它會在Response被引擎調(diào)度給Spider之前被自動調(diào)用。10.3.2自定義下載中間件process_response(self,request,response,spider)request:表示Response對象所對應的Request對象。response:表示被處理的Response對象。spider:表示Response對象對應的Spider對象。
process_request()方法process_response()方法返回值有兩種情況,分別是Response對象或Request對象,另外可能會拋出一個IgnoreRequest異常。10.3.2自定義下載中間件若返回一個Response對象,該Response對象會被處于鏈中的其他中間件的process_response()方法處理。若返回一個Request對象,則中間件鏈停止,返回的Request對象會被重新調(diào)度下載。若拋出一個IgnoreRequest異常,則調(diào)用Request對象的errback(Request.errback)方法。如果沒有代碼處理拋出的異常,則該異常被忽略且不記錄。
process_request()方法10.3.2自定義下載中間件我們自定義一個下載中間件,通過該下載中間件實現(xiàn)隨機獲取Uesr-Agent的功能,具體步驟如下。(1)在settings.py同級目錄下的middlewares.py文件中定義RandomUserAgent類,在該類中實現(xiàn)process_rquests()方法。importrandomfromsettingsimportUSER_AGENTS#隨機的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列表,以及一些其他設置。添加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文件中添加自定義中間件學習目標10.3.3激活下載中間件如果希望自定義的下載中間件能夠應用到程序中,需要激活下載中間件。激活下載中間件只需要將該下載中間件添加到settings.py文件的配置項DOWNLOADER_MIDDLEWARES中。DOWNLOADER_MIDDLEWARES={'mySpider.middlewares.RandomUserAgent':1,}10.3.3激活下載中間件在settings.py中的配置項DOWNLOADER_MIDDLEWARES中添加10.3.2節(jié)自定義的中間件RandomUserAgent。自定義的下載中間件會與內(nèi)置的下載中間件合并,但不會覆蓋。如果希望禁用某個下載中間件,必須在DOWNLOADER_MIDDLEWARES中定義該下載中間件,并將該下載中間件的值設置為None。DOWNLOADER_MIDDLEWARES={'scrapy.downloadermiddlewares.cookies.CookiesMiddleware':None,}10.3.3激活下載中間件例如,禁用下載中間件CookiesMiddleware
,防止某些網(wǎng)站根據(jù)Cookie來封鎖網(wǎng)絡爬蟲程序。Settings組件10.4Settings組件用于定制Scrapy中所有組件的行為,包括核心組件、擴展組件、管道以及Spiders組件等。settings.py是Scrapy項目的標準配置文件,該文件是Settings組件應用的地方,用于為Scrapy項目添加或更改配置。10.4Settings組件BOT_NAME用于設置使用Scrapy實現(xiàn)的bot名稱,也叫項目名稱,默認名稱為scrapybot。該名稱用于構(gòu)造默認的User-Agent,同時也用于記錄日志。CONCURRENT_ITEMS用于設置ItemPipeline組件可以同時處理每個Response的Item對象的最大值,默認值為100。CONCURRENT_REQUESTS用于設置下載器可以處理并發(fā)請求(concurrentrequests)的最大值,默認值為16。DEFAULT_REQUEST_HEADERS用于設置Request使用的請求頭。DEPTH_LIMIT用于設置抓取網(wǎng)站最大允許的深度(depth)值。默認值為0,表示沒有限制。DOWNLOAD_DELAY用于設置下載器在下載同一網(wǎng)站的下一頁面前所需要等待的時間(單位為秒),默認值為0。10.4Settings組件DOWNLOAD_TIMEOUT用于設置下載器的超時時間,單位為秒,默認值為180。ITEM_PIPELINES用于設置管道的調(diào)用順序,它對應的值是一個保存項目中啟用的管道及其調(diào)用順序的字典,默認值為空。LOG_ENABLED用于設置是否啟用logging,默認值是True。LOG_ENCODING用于設置logging使用的編碼,默認值是'utf-8'。LOG_LEVEL用于設置log的最低級別,它支持的級別取值包括CRITICAL、ERROR、WARNING、INFO、DEBUG,默認值是DEBUG。USER_AGENT用于設置抓取網(wǎng)站的數(shù)據(jù)時默認使用的User-Agent,除非被覆蓋,該配置項的默認值是"Scrapy/VERSION(+)"。COOKIES_ENABLED用于設置是否禁用Cookie,默認值為True。為了不讓網(wǎng)站根據(jù)請求的Cookie識別出網(wǎng)絡爬蟲的身份,一般會禁用Cookie的功能,將該配置項的值設置為False。10.4Settings組件CrawlSpider類10.5網(wǎng)頁上的數(shù)據(jù)往往是分頁顯示的,要獲取每個頁面上的數(shù)據(jù),我們可以通過分析網(wǎng)頁的URL地址格式,然后手動更改URL的參數(shù)來實現(xiàn)。但其實,Scrapy框架中專門提供了一個爬蟲類CrawlSpider,該類用于全網(wǎng)站的自動抓取,它能夠自動抓取URL地址具有一定規(guī)則的網(wǎng)站上的所有網(wǎng)頁數(shù)據(jù)。10.5CrawlSpider類熟悉CrawlSpider類的用途,能夠歸納CrawlSpider與Spider的區(qū)別學習目標10.5.1CrawlSpider類簡介scrapy.spiders模塊中提供了CrawlSpider類專門用于自動抓取,CrawlSpider類是Spider的子類,Spider類的設計原則是只抓取start_url列表中的網(wǎng)頁,而CrawlSpider類定義了一些規(guī)則(Rule類對象)提供跟進鏈接(LinkExtractor類對象)的機制,適用于從抓取的網(wǎng)頁中獲取鏈接并繼續(xù)執(zhí)行抓取數(shù)據(jù)的工作。scrapygenspider-tcrawl爬蟲名稱爬蟲域上述命令中,選項-t表示模板,crawl表示模板的名稱。10.5.1CrawlSpider類簡介例如,創(chuàng)建一個名稱為baidu,爬蟲域為的CrawlSpider類爬蟲。scrapygenspider-tcrawlbaidu10.5.1CrawlSpider類簡介當創(chuàng)建好爬蟲baidu,會在爬蟲項目中自動創(chuàng)建一個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類簡介多學一招Scrapy框架的爬蟲文件模板如果希望知道Scapy框架中有哪些模板,可以通過“scrapygenspider–l”命令查看Scapy項目中擁有的爬蟲文件模板。>C:\Users\admin>scrapygenspider-lAvailabletemplates:basiccrawlcsvfeedxmlfeed多學一招Scrapy框架的爬蟲文件模板Scapy框架中提供了4個可用的爬蟲文件模板。basic:提供的基礎模板,繼承自Spider類。crawl:提供更靈活的提取數(shù)據(jù)的方式,繼承自CrawlSpider類。csvfeed:提供從CSV格式文件中提取數(shù)據(jù)的方式,繼承自CSVFeedSpider類。xmlfeed:提供從XML格式文件中提取數(shù)據(jù)的方式,繼承自XMLFeedSpider類。多學一招Scrapy框架的爬蟲文件模板若希望了解某一爬蟲文件模板中的具體內(nèi)容,可以使用如下命令進行查看。scrapygenspider-d模塊名稱例如,查看基于crawl模板創(chuàng)建的爬蟲文件的內(nèi)容,具體命令如下所示。scrapygenspider-dcrawl在對幾個模板熟悉以后,我們就可以使用如下命令創(chuàng)建爬蟲。scrapygenspider(-ttemplate)namedomain了解CrawlSpider類的工作原理,能夠說出CrawlSpider類是如何工作的學習目標10.5.2CrawlSpider類的工作原理CrawlSpider類由于繼承了Spider類,所以繼承了Spider類的所有公有成員。此外,CrawlSpider類自身也定義了一些屬性。在這里,我們著重了解一下rules屬性。rules屬性是一個包含一個或多個Rule對象給續(xù)會介紹的列表。每個Rule對象對抓取網(wǎng)站的動作定義了特定表現(xiàn)。如果多個Rule對象匹配了同一個鏈接,則根據(jù)它們在本屬性中定義的順序,使用第一個Rule對象。10.5.2CrawlSpider類的工作原理10.5.2CrawlSpider類的工作原理CrawlSpider類的方法方法說明__init__()負責初始化,并調(diào)用_compile_rules()方法parse()
該方法進行了重寫,在方法體中直接調(diào)用方法_parse_response(),并把parse_start_url()方法作為處理response的方法parse_start_url()該方法主要用于處理parse()方法返回的Response,比如提取出需要的數(shù)據(jù)等,它需要返回Item、Request,或者兩者組合的可迭代對象_requests_to_follow()該方法用于從Response中解析出目標URL,并將其包裝成Request請求,該請求的回調(diào)方法是_response_downloaded()10.5.2CrawlSpider類的工作原理方法說明_response_downloaded()該方法是_requests_to_follow()方法的回調(diào)方法,作用是調(diào)用_parse_response()方法,處理下載器返回的Response,設置Response的處理方法為rule.callback()方法_parse_response()該方法將Response交給參數(shù)callback代表的方法去處理,然后處理callback()方法的requests_or_item,再根據(jù)rule.followandspider._follow_links來判斷是否繼續(xù)采集,如果繼續(xù)那么就將Response交給_requests_to_follow()方法,根據(jù)規(guī)則提取相關(guān)的鏈接。spider._follow_links的值是從settings的CRAWLSPIDER_FOLLOW_LINKS值獲取到的_compile_rules()這個方法的作用是將rule中的字符串表示的方法改成實際的方法,方便以后使用CrawlSpider類的方法10.5.2CrawlSpider類的工作原理當CrawlSpider爬蟲運行時,首先由start_requests()方法對start_urls中的每一個URL發(fā)起請求,網(wǎng)頁請求發(fā)出后返回的Response會被parse()方法接收。CrawlSpider類中使用了parse()方法來解析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解析頁面并獲取解析得到的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#判斷有無follow,用_requests_to_follow解析響應是否有符合要求的link。
iffollowandself._follow_links:forrequest_or_iteminself._requests_to_follow(response):yieldrequest_or_itemCrawlSpider類中的parse()方法直接調(diào)用了_parse_response()方法,該方法用于處理response對象,它根據(jù)有無callback,follow和self.follow_links執(zhí)行不同的操作。10.5.2CrawlSpider類的工作原理_requests_to_follow()方法又會獲取link_extractor解析頁面得到的link(link_extractor.extract_links(response)),對URL進行加工(process_links,需要自定義),對符合的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集合來記錄提取出的鏈接,確保提取的鏈接沒有重復的。10.5.2CrawlSpider類的工作原理CrawlSpider類會在__init__()方法中調(diào)用_compile_rules()方法,然后在其中淺復制rules中的各個Rule獲取用于回調(diào)(callback)、要進行處理的鏈接(process_links)和要進行的處理請求(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類的使用,能夠靈活應用Rule類制定爬蟲爬取規(guī)則學習目標10.5.3通過Rule類決定抓取規(guī)則10.5.3通過Rule類決定抓取規(guī)則CrawlSpider類使用rules屬性來決定爬蟲的爬取規(guī)則,并將匹配后的URL請求提交給引擎。正常情況下,CrawlSpider類無須單獨手動返回請求。在rules屬性中可以包含一個或多個Rule對象,每個Rule對象都對爬取網(wǎng)站的動作定義了某種特定操作。Rule(link_extractor,callback=None,cb_kwargs=None,follow=None,process_links=None,process_request=None)link_extractor:是一個LinkExtractor對象,用于定義鏈接的解析規(guī)則。callback:指定了回調(diào)方法的名稱。cb_kwargs:是一個字典,包含了傳遞給回調(diào)方法的參數(shù),默認值是None。follow:是一個布爾值,指定了根據(jù)本條Rule從response對象中提取的鏈接是否需要跟進。process_links:指定回調(diào)方法的名稱,該回調(diào)方法用于過濾鏈接,處理根據(jù)link_extractor從response對象中獲取到的鏈接列表。process_request:指定回調(diào)方法的名稱,該回調(diào)方法用于根據(jù)本rule提取出來的request對象,其返回值必須是一個request對象或者None。掌握LinkExtractor類的使用,能夠靈活應用LinkExtractor類提取需要跟蹤爬取的鏈接學習目標10.5.4通過LinkExtractor類提取鏈接10.5.4通過LinkExtractor類提取鏈接LinkExtractor類負責從網(wǎng)頁中提取需要跟蹤抓取的鏈接,按照規(guī)定的提取規(guī)則提取鏈接。這個規(guī)則只適用于網(wǎng)頁的鏈接,不適用于網(wǎng)頁中的普通文本。Scrapy框架在scrapy.linkextractors模塊中提供了LinkExtractor類專門用于表示鏈接提取類,但是我們也可以自定義一個符合特定需求的鏈接提取類,只需要讓它實現(xiàn)一個簡單的接口即可。10.5.4通過LinkExtractor類提取鏈接每個LinkExtractor都有唯一的公共方法extract_links(),該方法接收一個Response對象作為參數(shù),并返回一個類型為scrapy.link.Link的列表。在爬蟲工作過程中,鏈接提取類只需要實例化一次,但是從響應對象中提取鏈接時會多次調(diào)用extract_links()方法。鏈接提取類一般與若干Rules結(jié)合用于CrawlSpider類中,也用于其他與CrawlSpider類無關(guān)的場合。10.5.4通過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:其值為一個或多個正則表達式組成的元組,只有匹配這些正則表達式的URL才會被提取。如果allow參數(shù)為空,則會匹配所有鏈接。deny:其值為一個或多個正則表達式組成的元組,滿足這些正則表達式的URL會被排除不被提?。▋?yōu)先級高于allow參數(shù))。如果deny參數(shù)為空,則不會排除任何URL。allow_domains:其值是一個或多個字符串組成的元組,表示會被提取的鏈接所在的域名。10.5.4通過LinkExtractor類提取鏈接deny_domains:其值是一個或多個字符串組成的元組,表示被排除不提取的鏈接所在的域名。restrict_xpaths:其值是一個或多個XPath表達式組成的元組,表示只在符合該XPath定義的文字區(qū)域搜尋鏈接。tags:用于識別要提取的鏈接標簽,默認值為('a','area')。attrs:其值是一個或多個字符串組成的元組,表示在提取鏈接時要識別的屬性(僅當該屬性在tags規(guī)定的標簽里出現(xiàn)時),默認值是('href')。canonicalize:表示是否將提取到的URL標準化,默認值為False。由于使用標準化后的URL訪問服務器與使用原URL訪問得到的結(jié)果可能不同,所以最好保持使用它的默認值False。unique:表示是否要對提取的鏈接進行去重過濾,默認值為True。LinkExtractor類的構(gòu)造方法的聲明如下所示。10.5.4通過LinkExtractor類提取鏈接process_value:負責對提取的鏈接進行處理的函數(shù),能夠?qū)︽溄舆M行修改并返回一個新值,如果返回None則忽略該鏈接。如果不對process_value參數(shù)賦值,則使用它的默認值“l(fā)ambdax:x”。deny_extensions:其值是一個字符串或者字符串列表,表示提取鏈接時應被排除的文件擴展名。例如,['bmp','gif','jpg',]表示排除包含有這些擴展名的URL地址。restrict_css:其值是一個或多個css表達式組成的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 預制樓梯灌漿料 施工方案
- 項目自查報告怎么寫(共6篇)
- 國旗下講話:同伴的力量(心理健康)五篇模版
- 2025年度家用電器品牌代理銷售合同范本
- 2025年度虛擬現(xiàn)實增強現(xiàn)實內(nèi)容制作合同
- 2025年度綠色建筑項目可行性研究報告編制合同
- 電商物流成本控制與優(yōu)化方案
- 電商時代的教育資源整合與創(chuàng)新
- 現(xiàn)代教育中的編程教學新策略
- 現(xiàn)代建筑設計的材料與技術(shù)趨勢
- 《醫(yī)療機構(gòu)老年綜合評估規(guī)范(征求意見稿)》
- 2025屆鄭州市高三一診考試英語試卷含解析
- 新《安全生產(chǎn)法》安全培訓
- 《我國個人所得稅制下稅收征管問題研究》
- 建筑工程三通一平技術(shù)方案
- 綠化養(yǎng)護工安全培訓
- 腫瘤中醫(yī)治療及調(diào)養(yǎng)
- DB21-T 1720-2017海水源熱泵系統(tǒng)工程技術(shù)規(guī)程
- 組長競選課件教學課件
- 《基于UTAUT2模型的虛擬學術(shù)社區(qū)用戶持續(xù)使用意愿影響因素研究》
- 2022年公務員多省聯(lián)考《申論》真題(遼寧A卷)及答案解析
評論
0/150
提交評論