爱玛士关于爬虫的scrapy框架的心得
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
前言
Scrapy是爬蟲必須學會的一個框架!一般人確實很難搞的透徹!不過他的功能方面確實特別好用。
scrapy
scrapy 是一個異步爬蟲框架,使用它,可以屏蔽很多復雜的底層設計,只需要解析下載下來的頁面,更多了我們需要關注的是目標網(wǎng)站/頁面爬取的難易程度,該怎么來實現(xiàn)它。雖然是,但是在爬取大量網(wǎng)站可能需要 用分布式的爬蟲,當然scrapy 也有
操作流程圖
指定一個起始url后,scrapy就可以根據(jù)以上原理圖進行工作了。一個最簡單的頁面,指定頁面的url進行第一次請求,經(jīng)過引擎,交給調(diào)度器,然后調(diào)度器再返回給引擎,去下載這個頁面,拿到這個頁面就可以進行解析了。 這里明顯看的出來繞了一個圈子,如果最簡單的的頁面,這樣子會發(fā)現(xiàn)多了調(diào)度這一步。但是一般在實際業(yè)務中,特別是分布式爬蟲,會有很多url 需要爬取,而且一些url是動態(tài)添加到待爬隊列的,
我們將所有的待爬都在調(diào)度器進行分配,當然這里也有其他操作,比如,一個url已經(jīng)調(diào)度過,那么會進行標識,做到不再重復爬取。
隊列
scrapy 默認的隊列
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleLifoDiskQueue' SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.LifoMemoryQueue' SCHEDULER_PRIORITY_QUEUE = 'queuelib.PriorityQueue'一般我們不關心這個隊列結構,但是在做分布式時這個隊列就需要替換
scrapy_redis
scrapy 本身是異步,但是不支持分布式爬取。 要做到分布式爬取,那么需要一個公共的待爬隊列
scrapy_redis 需要制定隊列結構,可在 SpiderQueue,SpiderStack,
SpiderPriorityQueue 中選者一個,形如
scrapy注意事項
這里說一下scrapy的一個要注意的細節(jié)問題,對個人來說,其實他的文檔有些地方存在誤導,當然我指的是中文文檔,格式是標題加內(nèi)容,區(qū)分通過數(shù)字。
scrapy流程問題中下載和請求有什么區(qū)別
?
流程圖
?
如果對Python編程、網(wǎng)絡爬蟲、機器學習、數(shù)據(jù)挖掘、web開發(fā)、人工智能、面試經(jīng)驗交流。感興趣可以519970686,群內(nèi)會有不定期的發(fā)放免費的資料鏈接,這些資料都是從各個技術網(wǎng)站搜集、整理出來的,如果你有好的學習資料可以私聊發(fā)我,我會注明出處之后分享給大家。
spider通過engine產(chǎn)生Requests給Scheduler,之后通過Downloader產(chǎn)生Responses。這里有一個詭異的現(xiàn)象,比如我們通過request這個庫寫一個爬去百度的爬蟲
import request page = request.get('http://www.baidu.com')可能request拼錯了
這樣的一行命令,就已經(jīng)實現(xiàn)了把百度的頁面下載下來這個功能,那么請求和下載在這行代碼體現(xiàn)在哪里?
每一個請求的過程,就已經(jīng)實現(xiàn)了下載,換句話說,請求就是下載。
那么,所謂scrapy的請求和下載是什么?
請求,就是url
下載,就是請求url或者說訪問url
知道了這一點,很多東西都可以理解
比如,下載中間件這個東西
他是在parse函數(shù)前還是后執(zhí)行?肯定是前啊,因為parse是下載
還有就是scrapy.Request在中間件之前還是之后?按照文檔說法,Request通過下載中間件到下載啊,應該是之前啊,但其實,scrapy.Request在中間件后面執(zhí)行。因為它是下載里面的(請求就是下載)。
當然,如果上面你不相信的話,可以試一下?lián)Q代理,中間件需要這樣一句代碼
request.meta['proxy'] = 'http://192.13.2.2:8888'之后,才是才是請求呢。你不會用的時候,覺得很多地方不合理。你就覺得工具很爛,應該是你用的不好。
轉(zhuǎn)載于:https://my.oschina.net/u/3942476/blog/2252261
總結
以上是生活随笔為你收集整理的爱玛士关于爬虫的scrapy框架的心得的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教你用JS手写简单的秒表(精确到10ms
- 下一篇: st