《數(shù)據(jù)采集與預(yù)處理》課件15:爬蟲(chóng)框架-scrapy框架深入_第1頁(yè)
《數(shù)據(jù)采集與預(yù)處理》課件15:爬蟲(chóng)框架-scrapy框架深入_第2頁(yè)
《數(shù)據(jù)采集與預(yù)處理》課件15:爬蟲(chóng)框架-scrapy框架深入_第3頁(yè)
《數(shù)據(jù)采集與預(yù)處理》課件15:爬蟲(chóng)框架-scrapy框架深入_第4頁(yè)
《數(shù)據(jù)采集與預(yù)處理》課件15:爬蟲(chóng)框架-scrapy框架深入_第5頁(yè)
已閱讀5頁(yè),還剩35頁(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)介

爬蟲(chóng)框架-scrapy框架深入復(fù)習(xí)Itempipeline中數(shù)據(jù)處理函數(shù)有哪些?在爬取圖片過(guò)程中的處理思路?1、理解通用爬蟲(chóng)CrawlSpider的編寫(xiě)思路2、能編寫(xiě)middlewares的python類(lèi)進(jìn)行動(dòng)態(tài)網(wǎng)頁(yè)爬取3、了解常用的反爬蟲(chóng)設(shè)置教學(xué)目標(biāo)1Scrapy動(dòng)態(tài)網(wǎng)頁(yè)爬取爬蟲(chóng)框架-scrapy框架深入通用爬蟲(chóng)CrawlSpider23

反爬蟲(chóng)設(shè)置通用爬蟲(chóng)CrawlSpiderCrawlSpider基于Spider,但是可以說(shuō)是為全站爬取而生。CrawlSpider是Scrapy提供的一個(gè)通用Spider。在Spider里,可以指定一些爬取規(guī)則來(lái)實(shí)現(xiàn)頁(yè)面的提取,這些爬取規(guī)則由一個(gè)專(zhuān)門(mén)的數(shù)據(jù)結(jié)構(gòu)Rule表示。Rule里包含提取和跟進(jìn)頁(yè)面的配置,Spider會(huì)根據(jù)Rule來(lái)確定當(dāng)前頁(yè)面中的哪些鏈接需要繼續(xù)爬取、哪些頁(yè)面的爬取結(jié)果需要用哪個(gè)方法解析等。CrawlSpider和BasicSpider模板文件有什么不同?CrawlSpider模板文件也是通過(guò)命令“scrapygenspider”生成,與生成basicspider模板文件的不同的是需要增加參數(shù)“-tcrawl”。使用名人名言quotes案例來(lái)進(jìn)行講述,生成一個(gè)新的CrawlSpider模板文件,爬蟲(chóng)名為quotes。參考代碼如下。

scrapygenspider-tcrawlquotes通用爬蟲(chóng)CrawlSpider在spiders文件夾中找到quotes.py文件,瀏覽生成的模板文件。CrawlSpider類(lèi)使用鏈接提取器和一組規(guī)則,其主要目的是提取鏈接。參考模板代碼如下。鏈接提取器LinkExtractor和提取規(guī)則Rule通用爬蟲(chóng)CrawlSpider1、鏈接提取器LinkExtractor鏈接提取器是從scrapy.http.Response對(duì)象中提取鏈接的對(duì)象。在Scrapy中,有內(nèi)置提取器,如scrapy.linkextractorsimportLinkExtractor。鏈接提取器有多個(gè),每個(gè)鏈接提取器都有一個(gè)名為extract_links的公共方法,其中包含一個(gè)Response對(duì)象并返回一個(gè)scrapy.link.Link對(duì)象列表。鏈接提取器只能實(shí)例化一次,并多次調(diào)用extract_links方法以提取具有不同響應(yīng)的鏈接。通用爬蟲(chóng)CrawlSpider1、鏈接提取器LinkExtractor默認(rèn)情況下,鏈接提取器是LinkExtractor,其功能與LxmlLinkExtractor相同。是一個(gè)高度推薦的鏈接提取器,因?yàn)樗哂蟹奖愕倪^(guò)濾選項(xiàng),使用LXML庫(kù)強(qiáng)大的HTMLParser的解析器。鏈接提取器的基本語(yǔ)法格式如下。classscrapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow=(),deny=(),#允許、拒絕url地址,使用正則表達(dá)式進(jìn)行匹配allow_domains=(),deny_domains=(),deny_extensions=None,#允許或拒絕的域名restrict_xpaths=(),restrict_css=(),#使用xpath、CSS表達(dá)式提取指定區(qū)域鏈接tags=('a','area'),attrs=('href',),#html標(biāo)記或?qū)傩蕴崛rocess_value=None)#回調(diào)函數(shù)通用爬蟲(chóng)CrawlSpider2、提取規(guī)則RuleRule的作用是定義抽取鏈接的規(guī)則,多個(gè)規(guī)則組成rules?;菊Z(yǔ)法格式如下。rules={Rule(LinkExtractor鏈接提取器,callback,follow),}參數(shù)說(shuō)明LinkExtractor提取器:設(shè)定提取規(guī)則,一般為正則表達(dá)式。Callback:回調(diào)函數(shù)Follow:是否跟進(jìn)。當(dāng)Callback為None時(shí),默認(rèn)follow為true。當(dāng)Callback不為None時(shí),follow為False。通用爬蟲(chóng)CrawlSpider2、提取規(guī)則RuleRule的作用是定義抽取鏈接的規(guī)則,多個(gè)規(guī)則組成rules。規(guī)則中常用正則表達(dá)式的含義如下表模式描述^匹配字符串的開(kāi)頭$匹配字符串的末尾.匹配任意字符,除了換行符[]用來(lái)表示一組字符,單獨(dú)列出:[am]匹配'a','m're*匹配0個(gè)或多個(gè)的表達(dá)式re+匹配1個(gè)或多個(gè)的表達(dá)式re?匹配0個(gè)或1個(gè)由前面的正則表達(dá)式定義的片段\d匹配任意數(shù)字,等價(jià)于[0-9].\D匹配任意非數(shù)字\S匹配任意非空字符\s匹配任意空白字符\w匹配字母數(shù)字及下劃線(xiàn)\W匹配非字母數(shù)字及下劃線(xiàn)

表常用的正則表達(dá)式模式語(yǔ)法通用爬蟲(chóng)CrawlSpider案例1:以名人名言案例quotes的分頁(yè)功能為例來(lái)進(jìn)行講解。使用瀏覽器開(kāi)發(fā)者工具,選取元素“Next”,分頁(yè)按鈕的html結(jié)構(gòu)從圖中很容易觀察出,分頁(yè)功能是通過(guò)在域名后追加參數(shù)“/page/頁(yè)碼”實(shí)現(xiàn)的。在前面使用BasicSpider編寫(xiě)爬蟲(chóng)如果要實(shí)現(xiàn)此分頁(yè)功能,需要在解析函數(shù)parse中通過(guò)XPath表達(dá)式或CSS提取下一頁(yè)按鈕下a標(biāo)簽的href屬性,然后通過(guò)scrapy.Request再次發(fā)送請(qǐng)求,從而實(shí)現(xiàn)分頁(yè)。通用爬蟲(chóng)CrawlSpider案例1:以名人名言案例quotes的分頁(yè)功能為例來(lái)進(jìn)行講解。BasicSpider模塊的爬蟲(chóng)quoteCrawlSpider實(shí)現(xiàn)的爬蟲(chóng)quotes通用爬蟲(chóng)CrawlSpiderCrawlSpider的基本工作原理和BasicSpider雷同。不同點(diǎn)在于獲取響應(yīng)對(duì)象后,通過(guò)鏈接提取器LinkExtractor獲取請(qǐng)求鏈接,如果提取規(guī)則中配置了follow=True即跟進(jìn),則將提取的請(qǐng)求url鏈接傳遞給調(diào)度器,然后循環(huán)發(fā)送請(qǐng)求。如果follow=False,將不再發(fā)送請(qǐng)求。跟進(jìn)的過(guò)程中有可能出現(xiàn)請(qǐng)求重復(fù)發(fā)送,Scrapy框架默認(rèn)會(huì)過(guò)濾重復(fù)請(qǐng)求?;竟ぷ髟砣鐖D所示。1Scrapy動(dòng)態(tài)網(wǎng)頁(yè)爬取爬蟲(chóng)框架-scrapy框架深入通用爬蟲(chóng)CrawlSpider23

反爬蟲(chóng)設(shè)置Scrapy動(dòng)態(tài)網(wǎng)頁(yè)爬取單純的Scrapy爬蟲(chóng)只能實(shí)現(xiàn)靜態(tài)網(wǎng)頁(yè)爬取,如果頁(yè)面中采用了動(dòng)態(tài)網(wǎng)頁(yè)相關(guān)技術(shù),使用javascript腳本動(dòng)態(tài)生成,我們就無(wú)法獲取頁(yè)面HTML文本內(nèi)容。解決動(dòng)態(tài)網(wǎng)頁(yè)爬取的問(wèn)題依然是逆向分析法或模擬法。逆向分析法適用于較為簡(jiǎn)單的動(dòng)態(tài)網(wǎng)頁(yè),對(duì)于分析難度較大的動(dòng)態(tài)網(wǎng)頁(yè)我們采用模擬法,Scrapy框架與Selenium、Splash、PyV8、Ghost等模擬瀏覽器的運(yùn)行庫(kù)相結(jié)合綜合來(lái)解決動(dòng)態(tài)網(wǎng)頁(yè)問(wèn)題。由于前面講解過(guò)Selenium相關(guān)技術(shù),采用Scrapy結(jié)合Selenium來(lái)解決動(dòng)態(tài)網(wǎng)頁(yè)問(wèn)題。1、逆向分析法

以名人名言網(wǎng)站/js為例來(lái)進(jìn)行講解。這個(gè)網(wǎng)站和之前爬取的名人名言網(wǎng)站不同,增加了參數(shù)js,這個(gè)網(wǎng)站是動(dòng)態(tài)的。使用瀏覽器打開(kāi)網(wǎng)站后,鼠標(biāo)右鍵,選擇“查看網(wǎng)頁(yè)源代碼(V)”會(huì)發(fā)現(xiàn)顯示的數(shù)據(jù)隱藏在javascript腳本中,以對(duì)象的形式存儲(chǔ)。如圖1所示。Scrapy動(dòng)態(tài)網(wǎng)頁(yè)爬取然后通過(guò)JavaScript腳本動(dòng)態(tài)生成Dom結(jié)構(gòu)。如圖2所示。解析方法只需要從返回HTML中提取JavaScript中Data變量的值,然后按照字典的形式進(jìn)行獲取就可實(shí)現(xiàn)數(shù)據(jù)爬取。Scrapy動(dòng)態(tài)網(wǎng)頁(yè)爬取根據(jù)以上分析,爬蟲(chóng)編寫(xiě)思路為使用通用網(wǎng)絡(luò)爬蟲(chóng)CrawlSpider來(lái)實(shí)現(xiàn)分頁(yè)功能,使用正則表達(dá)式提取腳本中的數(shù)據(jù)后進(jìn)行解析。分別使用startproject、genspider命令創(chuàng)建項(xiàng)目toscrape并生成通用爬蟲(chóng)模板,爬蟲(chóng)名稱(chēng)為quotes。解析方法參考代碼如下。對(duì)于分析難度不高的動(dòng)態(tài)網(wǎng)頁(yè),建議采用逆向分析法,可有效提升爬取的效率。Scrapy動(dòng)態(tài)網(wǎng)頁(yè)爬取2、模擬法

對(duì)于復(fù)雜度比較高的動(dòng)態(tài)網(wǎng)頁(yè),使用逆向分析法代價(jià)較大。這時(shí)就比較適合使用模擬法,Scrapy框架與Selenium、Splash、PyV8、Ghost等模擬瀏覽器運(yùn)行庫(kù)組合使用,能夠快速解決動(dòng)態(tài)網(wǎng)頁(yè)爬取問(wèn)題。

由于前面動(dòng)態(tài)網(wǎng)頁(yè)爬取已經(jīng)講解過(guò)Selenium庫(kù)使用方法,所以模擬瀏覽器運(yùn)行庫(kù)選擇Selenium。Selenium主要負(fù)責(zé)發(fā)送請(qǐng)求,并將響應(yīng)文本返回給response,作用于下載器中間件。只需要編寫(xiě)下載器(middlewares文件),覆蓋init和process_request兩個(gè)方法:Init方法用于初始化瀏覽器驅(qū)動(dòng),配置無(wú)界面模式。process_request方法用于發(fā)送請(qǐng)求,將返回結(jié)果包裝成httpResponse對(duì)象返回即可。Scrapy動(dòng)態(tài)網(wǎng)頁(yè)爬取基本實(shí)現(xiàn)思路如下:Class

SeleniumMiddleware():

def__init__(self):

#1、初始化瀏覽器驅(qū)動(dòng),#2、配置selenium無(wú)頭模式,提高響應(yīng)效率

defprocess_request(self,request,spider):

#1、發(fā)送請(qǐng)求,模擬點(diǎn)擊實(shí)現(xiàn)分頁(yè)功能

#2、將page_souce返回的Html文本包裝為httpResponse返回以上實(shí)現(xiàn)思路沒(méi)有繼承任何中間件基本類(lèi),似乎不符合邏輯。這是由于當(dāng)process_request方法返回Response對(duì)象的時(shí)候,接下來(lái)更低優(yōu)先級(jí)的DownloaderMiddleware的process_request和process_exception方法就不會(huì)被繼續(xù)調(diào)用了,轉(zhuǎn)而依次開(kāi)始執(zhí)行每個(gè)DownloaderMiddleware的process_response方法,調(diào)用完畢之后直接將Response對(duì)象發(fā)送給Spider來(lái)處理。HtmlResponse對(duì)象,它是Response的子類(lèi),同樣滿(mǎn)足此條件,返回之后便會(huì)順次調(diào)用每個(gè)DownloaderMiddleware的process_response方法,而在process_response中沒(méi)有對(duì)其做特殊處理,接著他就會(huì)被發(fā)送給Spider,傳給Request的回調(diào)函數(shù)進(jìn)行解析。Scrapy動(dòng)態(tài)網(wǎng)頁(yè)爬取下面結(jié)合名人名言案例,來(lái)講解Scrapy框架和Selenium的組合使用方法。首先打開(kāi)文件middlewares.py編寫(xiě)下載器中間件,新建類(lèi)SeleniumMiddleware。參考代碼如下:fromseleniumimportwebdriver#瀏覽器驅(qū)動(dòng)

frommon.exceptionsimportTimeoutException#超時(shí)處理fromscrapy.httpimportHtmlResponse#scrapy響應(yīng)對(duì)象

importtime

classSeleniumMiddleware():#初始化瀏覽器驅(qū)動(dòng),設(shè)置無(wú)界面模式

def__init__(self):#配置無(wú)界面瀏覽器模式,使用Chrom瀏覽器

chorme_options=Options()#實(shí)例化驅(qū)動(dòng)選項(xiàng)#瀏覽器無(wú)界面模式。Linux下如果系統(tǒng)不支持可視化不加這條會(huì)啟動(dòng)失敗

chorme_options.add_argument("--headless")

#禁用gpu,谷歌文檔提到需要加上這個(gè)屬性來(lái)規(guī)避bug

chorme_options.add_argument("--disable-gpu")self.browser=webdriver.Chrome(chrome_options=chorme_options)#實(shí)例化瀏覽器驅(qū)動(dòng)

super().__init__()#發(fā)送請(qǐng)求,返回響應(yīng)對(duì)象Scrapy動(dòng)態(tài)網(wǎng)頁(yè)爬取下面結(jié)合名人名言案例,來(lái)講解Scrapy框架和Selenium的組合使用方法。首先打開(kāi)文件middlewares.py編寫(xiě)下載器中間件,新建類(lèi)SeleniumMiddleware。參考代碼如下:defprocess_request(self,request,spider):

try:

self.browser.get(request.url)#發(fā)送請(qǐng)求

time.sleep(4)#設(shè)置等待時(shí)間,等待時(shí)間可在settings.py文件中配置#返回response對(duì)象,其中參數(shù)self.browser.page_source為返回html文本

returnHtmlResponse(url=request.url,body=self.browser.page_source,

request=request,encoding='utf-8')exceptTimeoutException:

returnHtmlResponse(url=request.url,status=500,request=request)Scrapy動(dòng)態(tài)網(wǎng)頁(yè)爬取其次,配置下載器中間件。編寫(xiě)完中間件后,不要忘記在settings.py文件中配置下載器中間件。參考配置如下。DOWNLOADER_MIDDLEWARES={

#類(lèi)路徑中的toscrape自行調(diào)整'toscrape.middlewares.SeleniumMiddleware':543,}最后,修改爬蟲(chóng)代碼。解析函數(shù)可以使用與靜態(tài)網(wǎng)頁(yè)爬蟲(chóng)同樣的解析方法。由于名人名言案例的分頁(yè)功能沒(méi)有采用JavaScript相關(guān)技術(shù),我們沒(méi)有在下載器中間件中沒(méi)有編寫(xiě)模擬點(diǎn)擊實(shí)現(xiàn)功能的代碼。分頁(yè)功能通過(guò)通用網(wǎng)絡(luò)爬蟲(chóng)的鏈接提取器實(shí)現(xiàn)。參考代碼如下。1Scrapy動(dòng)態(tài)網(wǎng)頁(yè)爬取爬蟲(chóng)框架-scrapy框架深入通用爬蟲(chóng)CrawlSpider23

反爬蟲(chóng)設(shè)置反爬蟲(chóng)設(shè)置1、設(shè)置用戶(hù)代理

通過(guò)設(shè)置User-Agent模仿正常瀏覽器,是一個(gè)常用的應(yīng)對(duì)服務(wù)器反爬蟲(chóng)的策略。在Scrapy項(xiàng)目中通過(guò)設(shè)置User-Agent實(shí)現(xiàn)。打開(kāi)58同城二手房爬蟲(chóng)項(xiàng)目,在Settings.py文件中找到其默認(rèn)的User-Agent設(shè)置。默認(rèn)配置如下:

取消注釋后,使用瀏覽器開(kāi)發(fā)者工具,攔截任意請(qǐng)求,拷貝User-Agent。參考配置如下。這樣就設(shè)置好了Scrapy默認(rèn)使用的User-Agent,無(wú)論是項(xiàng)目中的爬蟲(chóng)還是運(yùn)行shell,框架都會(huì)使用Settings.py中的User-Agent作為默認(rèn)的用戶(hù)代理。#USER_AGENT='house(+)'USER_AGENT='Mozilla/5.0(WindowsNT10.0;Win64;x64)\AppleWebKit/537.36(KHTML,likeGecko)Chrome/86.0.4240.111Safari/537.36'反爬蟲(chóng)設(shè)置1、設(shè)置用戶(hù)代理

由于用戶(hù)代理是請(qǐng)求頭headers的一部分,所以也可通過(guò)修改缺省請(qǐng)求頭的方式來(lái)實(shí)現(xiàn)。在settings.py文件中,找到默認(rèn)的請(qǐng)求頭headers。取消注釋后,增加User-Agent。參考配置如下。DEFAULT_REQUEST_HEADERS={

'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'Accept-Language':'en',

'USER_AGENT':'Mozilla/5.0(WindowsNT10.0;Win64;x64)\

AppleWebKit/537.36(KHTML,likeGecko)\

Chrome/86.0.4240.111Safari/537.36'

}除了這兩種方式外,也可在使用scrapy.Request方法發(fā)送請(qǐng)求是增加請(qǐng)求頭。這種修改方式具有最高的優(yōu)先級(jí)別,也就是說(shuō)高于默認(rèn)配置中的User-Agent。反爬蟲(chóng)設(shè)置2、設(shè)置下載延遲、Cookies可以通過(guò)設(shè)置下載延時(shí),限制爬蟲(chóng)訪(fǎng)問(wèn)速度,避免因過(guò)快訪(fǎng)問(wèn)服務(wù)器,被爬蟲(chóng)禁止。設(shè)置下載延時(shí)是一種非常有效的應(yīng)對(duì)反爬蟲(chóng)措施。我們應(yīng)該盡量克制爬取的速度,避免占用過(guò)多的服務(wù)器資源,以免影響正常用戶(hù)使用??梢栽趕ettings.py中找到DOWNLOAD_DELAY配置項(xiàng),去掉注釋?zhuān)鶕?jù)情況調(diào)整下載延時(shí)時(shí)間,單位為秒,設(shè)置支持小數(shù)。58同城二手房爬蟲(chóng)就是通過(guò)設(shè)置下載延遲應(yīng)對(duì)反爬蟲(chóng)的。Scrapy框架在設(shè)置了DOWNLOAD_DELAY的情況下,默認(rèn)開(kāi)啟了隨機(jī)等待。這樣從相同的網(wǎng)站獲取數(shù)據(jù)時(shí),實(shí)際的下載延遲時(shí)間為隨機(jī)等待時(shí)間(0.5-1.5的隨機(jī)值)乘以下載延遲時(shí)間。這樣就降低了爬蟲(chóng)被檢測(cè)到的概率,因?yàn)槟承┚W(wǎng)站會(huì)分析請(qǐng)求,查找請(qǐng)求間隔相似性。Scrapy框架會(huì)自動(dòng)處理Cookies,也就是模仿瀏覽器去跟蹤C(jī)ookies。在爬取大量數(shù)據(jù)時(shí),很容易被服務(wù)器發(fā)現(xiàn),可以通過(guò)設(shè)置,禁止使用Cookies。在settings.py文件中找到#COOKIES_ENABLED=False,去掉注釋?zhuān)_(kāi)啟禁用Cookies。反爬蟲(chóng)設(shè)置3、自動(dòng)限速擴(kuò)展DOWNLOAD_DELAY選項(xiàng)是設(shè)置了一個(gè)固定的下載延時(shí),一般很難知道到底設(shè)置幾秒合適。我們希望快速穩(wěn)定地爬取,可以通過(guò)使用自動(dòng)限速擴(kuò)展解決這個(gè)問(wèn)題。該擴(kuò)展能根據(jù)Scrapy服務(wù)器以及目標(biāo)網(wǎng)站的負(fù)載,自動(dòng)限制爬取速度。它可以自動(dòng)調(diào)整Scrapy來(lái)優(yōu)化下載速度,使用戶(hù)不用調(diào)節(jié)下載延遲以及并發(fā)請(qǐng)求數(shù)來(lái)找到優(yōu)化值。用戶(hù)只需指定允許的最大并發(fā)數(shù),剩下的交給擴(kuò)展來(lái)完成??梢酝ㄟ^(guò)settings.py設(shè)置自動(dòng)限速擴(kuò)展,找到#AUTOTHROTTLE_ENABLED=True,去掉注釋?zhuān)_(kāi)啟自動(dòng)限速擴(kuò)展。反爬蟲(chóng)設(shè)置4、設(shè)置隨機(jī)用戶(hù)代理下載器中間件介于Scrapy引擎和Scrapy下載器之間。Scrapy發(fā)出的請(qǐng)求Request和響應(yīng)Response都會(huì)經(jīng)過(guò)下載器中間件,如果想全局地修改Scrapy的Request和Response,就可以通過(guò)下載器中間件來(lái)完成。要使用下載器中間件,首先需要激活下載器中間件組件,在setting.py文件中將其加入到DOWNLOADER_MIDDLEWARES中。該設(shè)置是一個(gè)字典,鍵為用戶(hù)編寫(xiě)的中間件類(lèi)路徑,值為中間件的執(zhí)行順序,數(shù)字越小優(yōu)先級(jí)別越高。打開(kāi)項(xiàng)目house下的settings.py文件,默認(rèn)情況下包含DOWNLOADER_MIDDLEWARES設(shè)置,只是被注釋掉了。參考代碼如下。#Enableordisabledownloadermiddlewares

#See/en/latest/topics/downloader-middleware.html

#DOWNLOADER_MIDDLEWARES={

#'house.middlewares.HouseDownloaderMiddleware':543,

#}HouseDownloaderMiddleware類(lèi)文件保存在middlewares.py文件中,每個(gè)中間件類(lèi)必須實(shí)現(xiàn)process_request方法。反爬蟲(chóng)設(shè)置4、設(shè)置隨機(jī)用戶(hù)代理要設(shè)置隨機(jī)用戶(hù)代理UserAgent,要先收集一批可用的UserAgent,為了便于統(tǒng)一更改設(shè)置,將這些UserAgent以列表的形式添加到項(xiàng)目的settings.py文件中。參考用戶(hù)代理配置如下。反爬蟲(chóng)設(shè)置4、設(shè)置隨機(jī)用戶(hù)代理配置完成后,下面開(kāi)始編寫(xiě)中間件。打開(kāi)項(xiàng)目中的middlewares.py文件,缺省情況下文件中存在HouseDownloaderMiddleware中間件類(lèi),保留原樣即可。由于隨機(jī)用戶(hù)代理中間件是在UserAgentMiddleware中間件基礎(chǔ)上通過(guò)重寫(xiě)process_request方法實(shí)現(xiàn)的,因此隨機(jī)代理中間件類(lèi)RandomUserAgent必須繼承UserAgentMiddleware。實(shí)現(xiàn)的主要邏輯是通過(guò)random.choice方法從配置的用戶(hù)代理列表中隨機(jī)取出一個(gè)用戶(hù)代理賦值給請(qǐng)求頭。參考代碼如下。反爬蟲(chóng)設(shè)置4、設(shè)置隨機(jī)用戶(hù)代理編寫(xiě)后中間件類(lèi)RandomUserAgent后需要在settings.py中激活編寫(xiě)好的中間件。參考配置如下。#See/en/latest/topics/downloader-middleware.html

DOWNLOADER_MIDDLEWARES={

'house.middlewares.RandomUserAgent':543,#自定義的用戶(hù)代理中間件

'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,#禁用缺省中間件

}啟用中間件的配置為“'house.middlewares.RandomUserAgent':543”。前邊的鍵是類(lèi)路徑,也就是house文件夾下的middlewares.py模塊中的RandomUserAgent'類(lèi)。后邊的值是中間件的執(zhí)行順序,必須是0-1000的整數(shù)值。反爬蟲(chóng)設(shè)置4、設(shè)置隨機(jī)用戶(hù)代理以上完整實(shí)現(xiàn)了自定義隨機(jī)切換用戶(hù)代理中間件。比較麻煩的是UserAgent的收集,收集太少效果不明顯,太多又很繁瑣。其實(shí)也可以通過(guò)第三方庫(kù)fake_useragent來(lái)獲取隨機(jī)代理,settings.py中配置的User-Agents直接可以省略掉。fake_useragent安裝方法很簡(jiǎn)單,使用pip直接安裝即可。用戶(hù)代理是通過(guò)fake_useragent.UserAgent().random來(lái)獲取,每次生成的都是一個(gè)新的用戶(hù)代理。參考代碼如下。fromscrapy.downloadermiddlewares.useragentimportUserAgentMiddleware

importfake_useragent#導(dǎo)包,用戶(hù)代理第三方庫(kù)

classRandomUserAgent(UserAgentMiddleware):

defprocess_request(self,request,spider):

ua=fake_useragent.UserAgent().random#生成隨機(jī)的用戶(hù)代理

request.headers.setdefault('User-Agent',ua)反爬蟲(chóng)設(shè)置5、隨機(jī)IP代理

設(shè)置隨機(jī)IP代理是應(yīng)對(duì)反爬蟲(chóng)限制的最有效的措施,尤其對(duì)大型爬取任務(wù)。但是由于IPV4時(shí)代資源的有限性以及免費(fèi)而又穩(wěn)定的代理IP很少,購(gòu)買(mǎi)商業(yè)的代理IP是處理大型爬蟲(chóng)的首選,能夠有效減少維護(hù)爬蟲(chóng)的工作量?,F(xiàn)在設(shè)置隨機(jī)IP代理,從網(wǎng)上查找?guī)讉€(gè)免費(fèi)可用的代理IP作為案例,練習(xí)時(shí)IPPOOL列表中的IP需要再次選取。實(shí)現(xiàn)隨機(jī)IP代理和設(shè)置隨機(jī)用戶(hù)代理的步驟雷同。首先,在settings.py中配置代理IP列表,列表中的元素依然是字典形式,字典的鍵讀者可自行定義,value值是我們選取的代理IP。參考配置如下。IPPOOL=[

{"ipaddr":"26:4516"},

{"ipaddr":"50:4578"},

{"ipaddr":"7:4572"},

{"ipaddr":"8:4503"},

{"ipaddr":"26:4556"},

]反爬蟲(chóng)設(shè)置5、隨機(jī)IP代理其次,打開(kāi)middlewares.py,編寫(xiě)一個(gè)繼承HttpProxyMiddleware的類(lèi)。類(lèi)名自定義,我們將其命名為IPProxiesMiddleware,類(lèi)必須覆蓋process_request方法。實(shí)現(xiàn)思路與隨機(jī)用戶(hù)代理相同,使用random.choice()方法從IPPOOL列表中隨機(jī)選取一個(gè)字典,獲取字典屬性后賦值給request.meta["proxy"]。參考代碼如下。fromscrapy.downloadermiddlewares.httpproxyimportHttpProxyMiddleware#導(dǎo)入代理包fromhouse.settingsimportIPPOOL#導(dǎo)包,獲取當(dāng)前項(xiàng)目的配置項(xiàng)

importrandom

classIPProxiesMiddleware(HttpProxyMiddleware):#必須使用繼承

defprocess_request(self,request,spider):

current_ip=random.choice(IPPOOL)#隨機(jī)獲取一個(gè)ip字典

ua=fake_useragent.UserAgent().random#獲取隨機(jī)用戶(hù)代理

request.headers.setdefault('User-Agent',ua)#設(shè)置請(qǐng)求頭

request.meta["proxy"]=current_ip.get("ipaddr")#設(shè)置ip代理反爬蟲(chóng)設(shè)置5、隨機(jī)IP代理以上代碼中也使用了隨機(jī)用戶(hù)代理,這是由于設(shè)置IP代理時(shí),請(qǐng)求頭被替換,需要重新設(shè)置,否則有可能出現(xiàn)如下錯(cuò)誤提示最后需要在settings.py文件中激活編寫(xiě)好的中間件。參考配置如下。#See/en/latest/topics/downloader-middleware.html

DOWNLOADER_MIDDLEWARES={

'house.middlewares.IPProxiesMiddleware':100,

'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware':None}#禁用缺省中間件反爬蟲(chóng)設(shè)置5、隨機(jī)IP代理在大型爬蟲(chóng)項(xiàng)目中,不可能只是簡(jiǎn)單使用幾個(gè)IP地址就能完成大量數(shù)據(jù)的爬取,這時(shí)就需要購(gòu)買(mǎi)商業(yè)IP來(lái)應(yīng)對(duì)反爬蟲(chóng)。提供商業(yè)IP的服務(wù)方一般可以通過(guò)API接口獲取IP地址,從而時(shí)爬蟲(chóng)程序更加穩(wěn)定高效。以極光爬蟲(chóng)代理為例進(jìn)行講解。在極光爬蟲(chóng)代理網(wǎng)站注冊(cè)后,登錄獲取免費(fèi)的IP地址(需要聯(lián)系客服進(jìn)行測(cè)試)。參考頁(yè)面如圖1所示。選擇提取數(shù)量、數(shù)據(jù)格式、端口位數(shù)、ip去重等選項(xiàng)后,點(diǎn)擊“生成API鏈接”按鈕后生成API鏈接。如圖2所示。反爬蟲(chóng)設(shè)置5、隨機(jī)IP代理點(diǎn)擊“打開(kāi)鏈接”,訪(fǎng)問(wèn)生成的鏈接,返回可用的IP。生成的鏈接如下所示。#參數(shù)num為獲取ip的數(shù)量/getip?num=1&type

溫馨提示

  • 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)論