Python爬蟲實戰(2):百度貼吧帖子

崔慶才發表於2015-04-25

大家好,上次我們實驗了爬取了糗事百科的段子,那麼這次我們來嘗試一下爬取百度貼吧的帖子。與上一篇不同的是,這次我們需要用到檔案的相關操作。

本篇目標

1.對百度貼吧的任意帖子進行抓取

2.指定是否只抓取樓主發帖內容

3.將抓取到的內容分析並儲存到檔案

1.URL格式的確定

首先,我們先觀察一下百度貼吧的任意一個帖子。

比如:http://tieba.baidu.com/p/3138733512?see_lz=1&pn=1,這是一個關於NBA50大的盤點,分析一下這個地址。

所以我們可以把URL分為兩部分,一部分為基礎部分,一部分為引數部分。

例如,上面的URL我們劃分基礎部分是 http://tieba.baidu.com/p/3138733512,引數部分是 ?see_lz=1&pn=1

2.頁面的抓取

熟悉了URL的格式,那就讓我們用urllib2庫來試著抓取頁面內容吧。上一篇糗事百科我們最後改成了物件導向的編碼方式,這次我們直接嘗試一下,定義一個類名叫BDTB(百度貼吧),一個初始化方法,一個獲取頁面的方法。

其中,有些帖子我們想指定給程式是否要只看樓主,所以我們把只看樓主的引數初始化放在類的初始化上,即init方法。另外,獲取頁面的方法我們需要知道一個引數就是帖子頁碼,所以這個引數的指定我們放在該方法中。

綜上,我們初步構建出基礎程式碼如下:

執行程式碼,我們可以看到螢幕上列印出了這個帖子第一頁樓主發言的所有內容,形式為HTML程式碼。

20150219162232

3.提取相關資訊

1)提取帖子標題

首先,讓我們提取帖子的標題。

在瀏覽器中審查元素,或者按F12,檢視頁面原始碼,我們找到標題所在的程式碼段,可以發現這個標題的HTML程式碼是

所以我們想提取<h1>標籤中的內容,同時還要指定這個class確定唯一,因為h1標籤實在太多啦。

正規表示式如下

所以,我們增加一個獲取頁面標題的方法

2)提取帖子頁數

同樣地,帖子總頁數我們也可以通過分析頁面中的共?頁來獲取。所以我們的獲取總頁數的方法如下

3)提取正文內容

審查元素,我們可以看到百度貼吧每一層樓的主要內容都在<div id=”post_content_xxxx”></div>標籤裡面,所以我們可以寫如下的正規表示式

相應地,獲取頁面所有樓層資料的方法可以寫成如下方法

好,我們執行一下結果看一下

20150219235120

真是醉了,還有一大片換行符和圖片符,好口怕!既然這樣,我們就要對這些文字進行處理,把各種各樣複雜的標籤給它剔除掉,還原精華內容,把文字處理寫成一個方法也可以,不過為了實現更好的程式碼架構和程式碼重用,我們可以考慮把標籤等的處理寫作一個類。

那我們就叫它Tool(工具類吧),裡面定義了一個方法,叫replace,是替換各種標籤的。在類中定義了幾個正規表示式,主要利用了re.sub方法對文字進行匹配後然後替換。具體的思路已經寫到註釋中,大家可以看一下這個類

在使用時,我們只需要初始化一下這個類,然後呼叫replace方法即可。

現在整體程式碼是如下這樣子的,現在我的程式碼是寫到這樣子的

我們嘗試一下,重新再看一下效果,這下經過處理之後應該就沒問題了,是不是感覺好酸爽!

20150220000103

4)替換樓層

至於這個問題,我感覺直接提取樓層沒什麼必要呀,因為只看樓主的話,有些樓層的編號是間隔的,所以我們得到的樓層序號是不連續的,這樣我們儲存下來也沒什麼用。

所以可以嘗試下面的方法:

1.每列印輸出一段樓層,寫入一行橫線來間隔,或者換行符也好。

2.試著重新編一個樓層,按照順序,設定一個變數,每列印出一個結果變數加一,列印出這個變數當做樓層。

這裡我們嘗試一下吧,看看效果怎樣

把getContent方法修改如下

執行一下看看效果

20150220000947

嘿嘿,效果還不錯吧,感覺真酸爽!接下來我們完善一下,然後寫入檔案

4.寫入檔案

最後便是寫入檔案的過程,過程很簡單,就幾句話的程式碼而已,主要是利用了以下兩句

file = open(“tb.txt”,”w”)

file.writelines(obj)

這裡不再贅述,稍後直接貼上完善之後的程式碼。

5.完善程式碼

現在我們對程式碼進行優化,重構,在一些地方新增必要的列印資訊,整理如下

現在程式演示如下

20150220012351

 

完成之後,可以檢視一下當前目錄下多了一個以該帖子命名的txt檔案,內容便是帖子的所有資料。

抓貼吧,就是這麼簡單和任性!

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

Python爬蟲實戰(2):百度貼吧帖子 Python爬蟲實戰(2):百度貼吧帖子

相關文章