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