為什麼寫網路爬蟲天然就是擇Python而用

王平發表於2018-12-02

關於這個問題,老猿就先從自己的經歷講起吧。很多年前,大約11年前,老猿我接手了一個搜尋引擎的網路爬蟲,那是一個用C++寫的通用搜尋引擎的爬蟲。C++的語言,多執行緒的實現,爬蟲的執行效率非常高。但是,找bug很困難,實現新的功能很繁瑣。

寫網路爬蟲為什麼用python最好

記得有次發現有些網頁抓不下來,開始好久都找不著頭腦,廢了九牛二虎之力,終於發現是http請求處理的問題。深入程式碼才看到,http協議的這部分程式碼都是寫這個人自己實現的,只是實現了最基本的協議,也就是,建立socket連線,傳送請求,然後透過socket接收資料,解析響應頭(response headers)。然而這個響應頭連http重定向都沒有處理,凡是重定向的響應就都失敗了,自然那些網頁就抓不下來了。

為了抓到那些響應,我們就不得不繼續完善http協議的解析功能,貢獻了很多程式碼~~

為什麼要自己實現基本的http協議呢?難道就沒有好的第三方庫可以用嗎?現在想來,那個爬蟲也就是看上去能用,聽上去高大上,實際上問題很多。

那個網路爬蟲程式維護了一兩年最終放棄了,後來的爬蟲技術都開始用Python來實現了。

現在如果讓我實現一個網路爬蟲,二話不說,肯定是要用Python。究其原因,可能有已經幾點經驗和教訓跟小猿們分享一下。

1. 變幻莫測的網路爬蟲

寫過爬蟲的猿猿們可能都有這麼一個感覺,就是昨天跑的好好的爬蟲,今天可能就出問題,不work了。這裡面的原因可能就是,網頁的改版,網站的封鎖等等。遇到這種情況,我們就必須在最快的時間內除錯找出問題所在,並以最快的速度修復,使其儘快上線跑起來。

2. 隨機應變的Python

鑑於上述爬蟲複雜的變化,寫網路爬蟲就必須依賴一個快速開發、靈活的語言,同時又有完整豐富的庫支撐。而同時具備這些優點的語言,無疑就是Python了。所以,Python天然就是為爬蟲而生,爬蟲天然就是擇Python而用。

3. 簡潔豐富的Python

看到Python和網路爬蟲這種天然相連的關係,小猿們不禁要問,Python適合網路爬蟲的天然屬性都是哪些呢?不急,聽老夫慢慢道來。

3.1 簡潔的語法

Python的語法非常簡單,提倡簡潔而不簡單,Python開發者的哲學就是“用一種方法,最好是隻有一種方法來做一件事”,這種哲學讓你寫的程式碼沒有太多個人風格,易於讓他人看懂你的程式碼,也讓你輕易看懂別人的程式碼。Python的簡潔,也讓開發者可以僅用幾行程式碼就實現一個功能,而同樣的功能用Java可能要幾十行上百行,要用C++可能是幾百行。
小猿們可以試試在Python直譯器裡面執行import this,來品味一下Python的哲學:

>>> import this
> The Zen of Python
> by Tim Peters

> Beautiful is better than ugly.
> Explicit is better than implicit.
> Simple is better than complex.
> Complex is better than complicated.
> Flat is better than nested.
> Sparse is better than dense.
> Readability counts.
> Special cases aren't special enough to break the rules.
> Although practicality beats purity.
> Errors should never pass silently.
> Unless explicitly silenced.
> In the face of ambiguity, refuse the temptation to guess.
> There should be one-- and preferably only one --obvious way to do it.
> Although that way may not be obvious at first unless you're Dutch.
> Now is better than never.
> Although never is often better than *right* now.
> If the implementation is hard to explain, it's a bad idea.
> If the implementation is easy to explain, it may be a good idea.
> Namespaces are one honking great idea -- let's do more of those!

Python簡潔的語法,讓你實現、修改爬蟲都變得輕鬆起來。也就是說,寫起來賊快!人生苦短,何不Python ?

3.2 豐富的Python模組

小猿們應該已經聽說過Python模組(庫)的豐富性,或許只是還沒有時間和機會接觸過那麼多而已。這裡,身經百戰、見多識廣的老猿給你撂下一句話:“幾乎所有你想要的功能Python都有庫實現了”。這句話,似乎很狂妄,但滿足你90%的需求沒問題。所以,小猿們要記住這句話,在以後的開發過程中,需要什麼基本功能了,就不妨先去搜搜、問問,看看是不是已經有人實現了這個功能,並且上傳到pypi上了,而你要做到可能僅僅是pip install。同時,也驗證一下這句話是不是那麼回事兒。
比方說,
我要下載網頁就用,
Python標準模組urllib.request,還有好的沒話說的第三方開源模組requests
非同步http請求的有aiohttp

我要處理網址url就用:
Python自帶的模組urllib.parse

我要解析html就用:
基於C語言庫的高效率模組lxml, 好用的beautifulsoap

我要管理網址,記錄下載成功的、失敗的、未下載的各種url的狀態,就用:
Python封裝的key-value資料庫leveldb

我要用成熟的爬蟲框架,就用:
歷史悠久的scrapy,後起之秀pyspider

我要支援javascript和ajax,就用:
瀏覽器模擬框架Selenium,加上不需要桌面環境跑著Linux伺服器上的大名鼎鼎的Google Headless Chrome。
還有個Phantomjs,可惜已經停止開發了。

以上,只是老猿用過的寫網路爬蟲需要的一些基本模組,具體實踐中需要的基本功能都可以先搜搜看,沒準兒就已經有模組支援想要的功能了。還是那句話,“幾乎所有你想要的功能Python都有庫實現了”。你的工作,就是像搭積木一樣,把他們有機結合在一起實現你的業務邏輯。

對的,像搭積木一樣實現你的網路爬蟲,為什麼不選擇Python呢?
下一篇我們講:
寫網路爬蟲的三種難度

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章