【Python面試真題】- scrapy和scrapy-redis有什么區(qū)別?為什么選擇redis數(shù)據(jù)庫?
【Python面試真題】- scrapy和scrapy-redis有什么區(qū)別?為什么選擇redis數(shù)據(jù)庫?
1) scrapy是一個Python爬蟲框架,爬取效率極高,具有高度定制性,但是不支持分布式。而scrapy-redis一套基于redis數(shù)據(jù)庫、運(yùn)行在scrapy框架之上的組件,可以讓scrapy支持分布式策略,Slaver端共享Master端redis數(shù)據(jù)庫里的item隊列、請求隊列和請求指紋集合。
2) 為什么選擇redis數(shù)據(jù)庫,因為redis支持主從同步,而且數(shù)據(jù)都是緩存在內(nèi)存中的,所以基于redis的分布式爬蟲,對請求和數(shù)據(jù)的高頻讀取效率非常高。
2. 你用過的爬蟲框架或者模塊有哪些?談?wù)勊麄兊膮^(qū)別或者優(yōu)缺點?
Python自帶:urllib,urllib2
第?三?方:requests
框????架:Scrapy
urllib和urllib2模塊都做與請求URL相關(guān)的操作,但他們提供不同的功能。
urllib2.:urllib2.urlopen可以接受一個Request對象或者url,(在接受Request對象時候,并以此可以來設(shè)置一個URL 的headers),urllib.urlopen只接收一個url
urllib 有urlencode,urllib2沒有,因此總是urllib,urllib2常會一起使用的原因
scrapy是封裝起來的框架,他包含了下載器,解析器,日志及異常處理,基于多線程, twisted的方式處理,對于固定單個網(wǎng)站的爬取開發(fā),有優(yōu)勢,但是對于多網(wǎng)站爬取 100個網(wǎng)站,并發(fā)及分布式處理方面,不夠靈活,不便調(diào)整與括展。
request 是一個HTTP庫, 它只是用來,進(jìn)行請求,對于HTTP請求,他是一個強(qiáng)大的庫,下載,解析全部自己處理,靈活性更高,高并發(fā)與分布式部署也非常靈活,對于功能可以更好實現(xiàn).
Scrapy優(yōu)缺點:
優(yōu)點:scrapy 是異步的
采取可讀性更強(qiáng)的xpath代替正則
強(qiáng)大的統(tǒng)計和log系統(tǒng)
同時在不同的url上爬行
支持shell方式,方便獨(dú)立調(diào)試
寫middleware,方便寫一些統(tǒng)一的過濾器
通過管道的方式存入數(shù)據(jù)庫
缺點:基于Python的爬蟲框架,擴(kuò)展性比較差
基于twisted框架,運(yùn)行中的exception是不會干掉reactor,并且異步框架出錯后是不會停掉其他任務(wù)的,數(shù)據(jù)出錯后難以察覺。
聲明:文章來源于網(wǎng)絡(luò),侵刪!