爲何寫爬蟲,咱們要選擇Python

記得有次發現有些網頁抓不下來,開始很久都找不着頭腦,廢了九牛二虎之力,終於發現是http請求處理的問題。深刻代碼纔看到,http協議的這部分代碼都是寫這我的本身實現的,只是實現了最基本的協議,也就是,創建socket鏈接,發送請求,而後經過socket接收數據,解析響應頭(response headers)。然而這個響應頭連http重定向都沒有處理,凡是重定向的響應就都失敗了,天然那些網頁就抓不下來了。javascript

爲了抓到那些響應,咱們就不得不繼續完善http協議的解析功能,貢獻了不少代碼。。html

爲何要本身實現基本的http協議呢?難道就沒有好的第三方庫能夠用嗎?如今想來,那個爬蟲也就是看上去能用,聽上去高大上,實際上問題不少。java

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

如今若是讓我實現一個網絡爬蟲,二話不說,確定是要用Python。究其緣由,可能有已經幾點經驗和教訓跟你們分享一下。web

1. 變幻莫測的網絡爬蟲ajax

寫過爬蟲,可能都有這麼一個感受,就是昨天跑的好好的爬蟲,今天可能就出問題,不work了。這裏面的緣由可能就是,網頁的改版,網站的封鎖等等。遇到這種狀況,咱們就必須在最快的時間內調試找出問題所在,並以最快的速度修復,使其儘快上線跑起來。數據庫

2. 隨機應變的Pythondjango

鑑於上述爬蟲複雜的變化,寫網絡爬蟲就必須依賴一個快速開發、靈活的語言,同時又有完整豐富的庫支撐。而同時具有這些優勢的語言,無疑就是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呢?

若是你依然在編程的世界裏迷茫,不知道本身的將來規劃,能夠加入咱們的Python學習扣qun:784758214,看看前輩們是如何學習的!交流經驗! 本身是一名高級python開發工程師,從基礎的python腳本到web開發、爬蟲、django、人工智能、數據挖掘等,零基礎到項目實戰的資料都有整理。 送給每一位python的小夥伴!分享一些學習的方法和須要注意的小細節,這裏是python學習者彙集地

點擊:python技術分享

相關文章
相關標籤/搜索