Python3做採集

出於某些目的,需要在網上爬一些數據。考慮到Python有各種各樣的庫,以前想試試Pycharm這個IDE,就決定用它了。首先翻完《深入Python3》這本書,瞭解了它的語法之類的。下面就以下載http://www.meinv68.cn/爲例子開始幹活了:

  1. Http協議的實現。那本書裏有介紹一個叫httplib2的庫,看起來挺好。就用這個庫把網頁內容抓下來先。
  2. Html解析。之前有用過一些解析xml的庫,但是想着html代碼可能不會太嚴禁,就找到了一個傳說中對html容錯度很高的庫:BeautifulSoup。Python3得用這個庫的第四版,導入時也是要導「bs4」庫。解析挺簡單,我用的基本還是xml那一套。
  3. 數據保存。呃,沒啥說的,就是用內建方法open()打開一個文件,會返回一個文件對象,然後調用它的各種方法就可以了。

採集的有點慢。需要採集的數據有三十多萬條。但是一個頁面只有十條數據,而且每三四秒左右才能從服務器抓到一個頁面。剛開始想着用多線程之類的加速,但想着抓一次就好了,而且有人鄙視說,抓太快對服務器負擔太大,就讓它跑了個通宵。只抓了十萬條數據,而且還有漏的。

 

然後就找到另外一個網站,繼續抓。這個時候蛋疼了,那網頁裏的內容大部分都是js之類生成的。第一反應就是看看有沒人用Python實現一個js的解釋器。結果發現這個工具量太大,很多庫都必須依靠瀏覽器來解析,太重量級。先放一放,就先看看這個js裏有些啥,會不會直接有需要的數據。

以前沒有網頁開發的經驗,只是問過同學什麼js,asp語言是幹嘛用的。但是Firefox很久之前就裝了FireBug這個插件,就拿出來隨便點點。很容易看到了加載的js,但是看了半天沒發現有想要的東西。然後繼續隨便點點,發現加載的不只一個腳本,最後在控制檯裏,發現Get了一個aspx文件,裏面就有想要的數據。

QQ截圖20130731143612

 

下面繼續是Python的事了:

  1. 瞄了下那個url裏,有關於日期的參數。首先很純潔的想到我需要一個能處理日期的類。嗯,我也找到了,datetime。這貨能很方便的處理關於 「時間」的功能,比如一個時間的前一天,前一秒是什麼時候,計算兩個時間相差多少等等,而完全不用考慮類似潤年哇,加了幾小時後就成了另外一天之類的問題。也能很方便的把日期用字符串按指定的格式打印出來。
  2. 抓到這裏面的文件後,需要進行分析。就簡單的用正則表達式了。用到的庫是re。呃,用法也很簡單,可以先用編譯一個正則表達式,然後可以查看一個字符串能不能被這個正則表達式匹配,返回匹配部分等等。

因爲這個腳本很小,比起抓整個網頁來說,效率好太多了,一秒鐘左右抓一個頁面,而且一個頁面大概有170條數據。跑了二十分鐘左右就抓完了。

 

後:

以前用C++這樣的靜態類型語言,一個表達式的值,一個函數的返回值只能是一種類型。但是Python則不同,比如open()會根據你打開模式返回不同的類型的對象。雖然說C++的parser做起來很難,但是隻要做出來,就能很容器確定一個變量的類型(模板中的除外,所以C++11放棄Concept的時候還是略讓人蛋疼的),然後IDE就能進行很好的自動補全建議。但是動態類型語言這方面則略爲蛋疼了,對IDE要求高了一點。好處則是很方便靈活,寫函數裏也不怎麼糾結參數的實際類型,全特麼是模板參數……好在PyCharm能根據一個函數的docstring判斷參數的類型。

還有就是Python裏對機器的控制弱了點。因爲數據量有點大,所以不得不關心了下list的實現。它類似C++ stl裏的vector,但是又沒有提供設置容量的方法。現在就用collection.deque將就了一下。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章