標籤:
上次寫了一個爬世紀佳緣的爬蟲之後,今天再接再厲又寫了一個新浪部落格的爬蟲。寫完之後,我想了一會兒,要不要在部落格園裡面寫個文章記錄一下,因為我覺得這份代碼的含金量確實太低,有點炒冷飯的嫌疑,就是把上次的代碼精簡了一下,用在另外一個網站而已,而且爬別人的部落格總有一種做賊心虛的感覺,怕被各位園友認為是偷窺狂魔。但是這份代碼總歸是我花了精力去寫的,我也不想就此讓它深藏在硬碟之中(電腦實在太老了,可能過兩年硬碟壞了,這份代碼就消失了),還是貼出來權當作拋磚引玉。
說起要爬新浪部落格,總歸是有一個原因吧。我的原因呢也是什麼的簡單,就是這兩天在網上下載了一本python自然語言處理的一本書,就像嘗試著應用一下裡面的理論(其實我都還沒看呢 哈哈),當然照著書裡面的例子玩總歸是沒什麼成就感的,所以就想自己找點東西實驗一下。可能你覺得這個原因和爬新浪部落格沒什麼必然聯絡啊,確實如此,前面扯的東西太虛了,我寫這個東西就是為了滿足一下自己的偷窺慾望,把曾經女神的部落格都下載下來(大家不要噴。。),順便在用前面講的高大上的自然語言理論處理一下(估計很難,八成做不下去)。
講了這麼多廢話了,現在開始說一說爬蟲的工作原理。先原諒我粗糙的塗抹技術,因為實在不想把再出現上次文章中的情況,大家紛紛在評論中討論我在知乎看什麼。首先在新浪播客找到你要下載使用者的首頁,在地址欄中最後一般有一個數字對應於使用者的id,因為每頁放的文章有限,新浪部落格採用了分頁,對應於url裡面的page=2,就是第二頁的意思。在當前的頁面我們可以用Regex解析出文章的發表時間,“查看原文”的連結中找到文章的連結。
因為新浪部落格比較開放的原因,不登陸也能查看文章那個的內容,所以就直接用python裡的urllib2,也不需要設定cookies,省去了很多麻煩。唯一比較麻煩的是如果文章裡面有圖片是多媒體的連結,提取裡面的文字比較麻煩和繁瑣,因為這個介面比較簡單,當然也可以直接解析html,不過我已經習慣了Regex,雖然很麻煩,但還是硬著頭皮寫完了。其中Regex的替換字串的功能非常的好用,就重點講一講這個吧!
在遇到複雜的字串替換的時候,Regex的sub函數用起來非常的easy。貼一段簡單的代碼:
#-*- encoding:UTF-8 -*-import res = u‘‘‘<div class="class1">this is string1</div><div class="class2">這是字串二</DIV>‘‘‘def div_func(m): if m is None: return ‘‘ return m.group(1)if __name__ == ‘__main__‘: pattern = re.compile(u‘<div[\S ]*?>(.*?)</div>‘, re.U | re.S | re.I) print s sss = pattern.sub(div_func, s) print print sss
在網頁中,會碰到很多不同的格式,如代碼裡面的字串s,如果想把裡面的文字提取出來,對於比較複雜的替換要求,我們可以定義一個函數作為參數傳給sub進行處理,啟動並執行結果如所示,是不是非常的方便?
再講講python的中文編碼問題吧,最簡單的處理就是儘可能少的用str,儘可能多的用unicode。對於來自檔案的輸入資料,最好先解碼為unicode再做處理,這樣可以減少90%的亂碼問題。哦,對了,今天還發現了一個非常好用的一個函數,可以用來下載檔案
import urlliburllib.urlretrieve(url, path)
此函數可以將url中的檔案下載到本地路徑path中,是不是非常的簡單。最後展示一下。當然資料不多啦,女神也就一百多篇的文章,用資料庫有點殺雞用牛刀的感覺,直接輸出到一個文字檔裡面也是挺方便的哈!
最後的最後,還是把原始碼貼出來以供大家參考哈!(由於本人實在不擅長描述細節,所以寫的很粗,望大家多多見諒啊!)
連結:http://files.cnblogs.com/files/lrysjtu/xlblog.rar
python網路爬蟲 新浪部落格篇