愛瑪士關於爬蟲的scrapy框架的心得

前言

Scrapy是爬蟲必須學會的一個框架!通常人確實很難搞的透徹!不過他的功能方面確實特別好用。python

scrapy

scrapy 是一個異步爬蟲框架,使用它,能夠屏蔽不少複雜的底層設計,只須要解析下載下來的頁面,更多了咱們須要關注的是目標網站/頁面爬取的難易程度,該怎麼來實現它。雖然是,可是在爬取大量網站可能須要 用分佈式的爬蟲,固然scrapy 也有web

操做流程圖

指定一個起始url後,scrapy就能夠根據以上原理圖進行工做了。一個最簡單的頁面,指定頁面的url進行第一次請求,通過引擎,交給調度器,而後調度器再返回給引擎,去下載這個頁面,拿到這個頁面就能夠進行解析了。 這裏明顯看的出來繞了一個圈子,若是最簡單的的頁面,這樣子會發現多了調度這一步。可是通常在實際業務中,特別是分佈式爬蟲,會有不少url 須要爬取,並且一些url是動態添加到待爬隊列的,
咱們將全部的待爬都在調度器進行分配,固然這裏也有其餘操做,好比,一個url已經調度過,那麼會進行標識,作到再也不重複爬取。面試

隊列

scrapy 默認的隊列redis

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 中選者一個,形如框架

SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"

scrapy注意事項

這裏說一下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'

以後,纔是纔是請求呢。你不會用的時候,以爲不少地方不合理。你就以爲工具很爛,應該是你用的很差。

相關文章
相關標籤/搜索