轉載自公衆號:easypython
爬蟲速度太慢?在這裏推薦幾個值得關注的異步爬蟲庫,給你的爬蟲提速。看看有沒有你沒聽過的?
類似 Requests 的庫
爲什麼要推薦類似 Requests 的庫呢?Requests 不夠好嗎?
雖然 Requests 對於新手很容易上手,但它是同步的、並不是異步設計的。在 HTTP 請求的時候是需要 IO 等待的。比如說,當你使用 Requests 庫進行請求,網站進行返回的時候,這時 IO 就會阻塞,程序就需要等待網站的返回,這就讓爬取速度變慢了。
那麼異步的好處在哪呢?(侯爵老師興奮的停不下來,繼續說着)
Python 的代碼是一行行去執行。也就是說,如果哪一行是非常耗時間的,之後的所有事情都會等到它完成才執行。因此 Python 異步編程也就應運而生用來解決這個問題。異步的方式在於你寫的這些代碼中哪些是執行時間非常短的,那麼就先執行,耗時的操作會被擱在後面,並且執行這個過程完全都由 Python 的異步庫自己來進行調控。
這樣的好處就是隻寫少量的代碼也能達到不錯的效率,同時在代碼可讀性上也變得更加直觀了。
下面這幾個庫,都是類似 Requests 的用法但是基於異步的設計。
https://github.com/aio-libs/aiohttp
最推薦:aiohttp
aiohttp 是純粹的異步框架,同時支持 HTTP 客戶端和 HTTP 服務端,可以快速實現異步爬蟲。坑比其他框架少。並且 aiohttp 解決了requests 的一個痛點,aiohttp 可以輕鬆實現自動轉碼,對於中文編碼就很方便了。
https://github.com/theelous3/asks
第二推薦:asks
Python 自帶一個異步的標準庫 asyncio,但是這個庫很多人覺得不好用,甚至是 Flask 庫的作者公開抱怨自己花了好長時間才理解這玩意,於是就有好事者撇開它造了兩個庫叫做 curio 和 trio,而這裏的 ask 則是封裝了 curio 和 trio 的一個 http 請求庫。
用起來和 Requests 90%相似,新手也可以很快上手。
https://github.com/vibora-io/vibora
第三推薦:vibora
號稱是現在最快的異步請求框架,跑分是最快的。寫爬蟲、寫服務器響應都可以用。
但這個項目一直在重構,這誰受得了。現在頁面上還掛着項目正在重構的警告,使用需謹慎啊。
類似 Selenium ****的庫
Selenium +webdriver 可以用來模擬用來模擬瀏覽器請求,它也是同步的、而不是異步設計的。而下面這些庫不光是從效率上,還有易用性上也比 selenium 進化了不少。
https://github.com/miyakogi/pyppeteer
最推薦:Pyppeteer
Pyppeteer 是異步無頭瀏覽器(Headless Chrome),從跑分來看比 Selenium + webdriver 快,使用方式是最接近於瀏覽器的自身的設計接口的。它本身是來自 Google 維護的 puppeteer,但是按照 Python 社區的梗,作者進行了封裝並且把名字中的 u 改成了 y 🙈
特點是異步的設計,接口非常瀏覽器化,注入 JS 也很方便。
https://github.com/tryolabs/requestium
第二推薦:Requestium
Requests 的作者 Kenneth Reitz 曾經轉發稱讚過這個庫。
Requestium 是 Requests 和 Selenium 封裝的產物,並且提供了友好的接口切換,這樣就可以根據需求切換了。
值得一提的是,Requestium 有一個 Wait Until 的方便設計,它的作用是確保頁面中的某一個元素出現了纔會進行下面的代碼,這樣一來就很輕鬆的避免了一些詭異的錯誤。GitHub 頁面上有一組示例,是使用 Requestium 以及使用 Requests + Selenium + lxml 的對比,可以很明顯看出區別。
https://github.com/HDE/arsenic
第三推薦:arsenic
HDE 公司用在了實際生產中的項目抽離出來的框架。和 selenium 接口幾乎一致,學習成本相對較低。不同在於是異步的設計。不過文檔有點糟糕。
框架
https://github.com/lorien/grab
**最推薦:Grab **
前端圈很流行說漸進式框架,那麼 Grab 可以說是爬蟲界的漸進式框架。想簡單用時有簡單的用法,想複雜使用時也有複雜的用法。封裝的很好,基於生成器異步的設計。
https://github.com/kkyon/botflow
**第二推薦:botflow **
國人作者。概念很新穎,定位成了處理數據工作流的框架,可以用來爬蟲、機器學習、量化交易等等。
https://github.com/howie6879/ruia
**第三推薦:ruia **
國人作者。比較接近 Scrapy 的使用方式,異步設計。作者也在知乎但是很低調 @howie
非 Python 框架
https://github.com/gocolly/colly
**Golang 爬蟲框架 **
應該是 Golang 裏使用量最多的爬蟲框架了。Golang 語言本身就對併發支持很好。讓你在使用時只考慮業務本身就可以。框架結構化、清晰、代碼好讀。
https://github.com/yujiosaka/headless-chrome-crawler
**nodejs 爬蟲框架 **
JS 圈裏的一個奇葩,整個爬蟲都基於 Chrome ,並且自帶一個調度隊列。實際測試速度和穩定性均不俗。