python網絡爬蟲 新浪博客篇


上次寫了一個爬世紀佳緣的爬蟲之后,今天再接再厲又寫了一個新浪博客的爬蟲。寫完之后,我想了一會兒,要不要在博客園里面寫個帖子記錄一下,因為我覺得這份代碼的含金量確實太低,有點炒冷飯的嫌疑,就是把上次的代碼精簡了一下,用在另外一個網站而已,而且爬別人的博客總有一種做賊心虛的感覺,怕被各位園友認為是偷窺狂魔。但是這份代碼總歸是我花了精力去寫的,我也不想就此讓它深藏在硬盤之中(電腦實在太老了,可能過兩年硬盤壞了,這份代碼就消失了),還是貼出來權當作拋磚引玉。

說起要爬新浪博客,總歸是有一個原因吧。我的原因呢也是什么的簡單,就是這兩天在網上下載了一本python自然語言處理的一本書,就像嘗試着應用一下里面的理論(其實我都還沒看呢 哈哈),當然照着書里面的例子玩總歸是沒什么成就感的,所以就想自己找點東西實驗一下。可能你覺得這個原因和爬新浪博客沒什么必然聯系啊,確實如此,前面扯的東西太虛了,我寫這個東西就是為了滿足一下自己的偷窺欲望,把曾經女神的博客都下載下來(大家不要噴。。),順便在用前面講的高大上的自然語言理論處理一下(估計很難,八成做不下去)。

講了這么多廢話了,現在開始說一說爬蟲的工作原理。先原諒我粗糙的塗抹技術,因為實在不想把再出現上次帖子中的情況,大家紛紛在評論中討論我在知乎看什么。首先在新浪播客找到你要下載用戶的主頁,在地址欄中最后一般有一個數字對應於用戶的id,因為每頁放的文章有限,新浪博客采用了分頁,對應於url里面的page=2,就是第二頁的意思。在當前的頁面我們可以用正則表達式解析出文章的發表時間,“查看原文”的鏈接中找到文章的鏈接。

qingblog

因為新浪博客比較開放的原因,不登陸也能查看文章那個的內容,所以就直接用python里的urllib2,也不需要設置cookies,省去了很多麻煩。唯一比較麻煩的是如果文章里面有圖片是多媒體的鏈接,提取里面的文字比較麻煩和繁瑣,因為這個界面比較簡單,當然也可以直接解析html,不過我已經習慣了正則表達式,雖然很麻煩,但還是硬着頭皮寫完了。其中正則表達式的替換字符串的功能非常的好用,就重點講一講這個吧!

在遇到復雜的字符串替換的時候,正則表達式的sub函數用起來非常的easy。貼一段簡單的代碼:

#-*- encoding:UTF-8 -*-
import re

s = 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進行處理,運行的結果如下圖所示,是不是非常的方便?

blog

再講講python的中文編碼問題吧,最簡單的處理就是盡可能少的用str,盡可能多的用unicode。對於來自文件的輸入數據,最好先解碼為unicode再做處理,這樣可以減少90%的亂碼問題。哦,對了,今天還發現了一個非常好用的一個函數,可以用來下載文件

import urllib
urllib.urlretrieve(url, path)

此函數可以將url中的文件下載到本地路徑path中,是不是非常的簡單。最后展示一下。當然數據不多啦,女神也就一百多篇的文章,用數據庫有點殺雞用牛刀的感覺,直接輸出到一個文本文件里面也是挺方便的哈!

image

最后的最后,還是把源代碼貼出來以供大家參考哈!(由於本人實在不擅長描述細節,所以寫的很粗,望大家多多見諒啊!)

鏈接:http://files.cnblogs.com/files/lrysjtu/xlblog.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM