最近python是越來越火了,自己也是想體驗一把,所以就抽時間把python基礎語法什麼的都瞭解了下,也把具體的程式碼試了試。看完了想著總要應用下吧,否則總感覺沒勁兒,就跟沒學似得,畢竟實踐是最好的老師嘛。那麼實現個什麼功能呢?然後就看到了部落格,要不就把所有部落格的標題以及閱讀次數統計下吧,也算是網路爬蟲吧,哈哈哈。
確定了,就想想大致要怎麼做吧。我們的基本步驟也是首先先看下需要獲取資訊的網頁原始碼,我們就是部落格列表頁面呀,即為 http://blog。csdn。net/submit66/article/list,其實現在我覺得所謂的爬取就是把網頁內容請求到,然後根據網頁標籤取到我們想要的標籤,以及資料。這就是大致的思路。
好,接下就是請求的步驟了,第一步開啟上面那個連結,然後只需要右鍵然後顯示網頁原始碼就好了。我們的目的就是想要渠道每一篇部落格的名稱以及訪問量,透過觀察可以看到所有的標題以及閱讀次數都是寫在如下的標籤裡面的:
裡面的註釋寫的比較清楚了,我們的目的就是獲取上面的title“自定義Linearlayout實現dividerPaddingLeft和dividerPaddingRight”和閱讀次數“54”了呀。接下來看下程式碼:
[python]
view plain copy
# -*- coding: utf-8 -*- 指定編碼格式防止 程式碼中有中文編譯失敗
‘’‘’‘
使用python爬取csdn個人部落格的訪問量
’‘’
import urllib2 # 網路請求模組
import re # 正則表示式模組
from bs4 import BeautifulSoup; # 匯入解析html的標籤模組
page_num = 1; # 頁碼,因為有的部落格比較多,那麼一頁不能展示全了
notLast = 1;
account = ‘submit66’# 部落格id
# 開始迴圈爬取
while notLast:
#部落格首頁地址,csdn+部落格id
baseUrl = ‘http://blog。csdn。net/’+account
#構造爬取的頁面地址,因為可能有多頁
myUrl = baseUrl+‘/article/list/’+str(page_num)
#構造請求
req = urllib2。Request(myUrl);
myResponse = urllib2。urlopen(req)
# 獲取請求回來的資料
myPage = myResponse。read();
#在頁面中查詢是否存在‘尾頁’這一個標籤來判斷是否為最後一頁,如果沒有則代表是最後一頁了,用的正則匹配
pattern = re。compile(‘尾頁’);
notLast = pattern。findall(myPage, re。S);
# 列印爬取的頁碼數
print‘——————————————-第%d頁————————————————-’ % (page_num);
soup = BeautifulSoup(myPage, ‘lxml’);
# 使用beautifulsoup來解析html的span標籤,找到所有的標題以list形式返回
titleList = soup。find_all(‘span’, class_=‘link_title’);
# 利用正則表示式獲取部落格的訪問量,最終會將所有的頁碼以list形式返回
viewlist = re。findall(‘閱讀(。∗?)’, myPage,re。S)
#將結果打印出來,因為標題返回時候是ASCII碼,所以需需要將標題部分獲取到的中文以utf-8再次編碼,否則無法輸出列印
#另外我們獲取到的標題會有一些沒用的空格,打印出來不美觀,所以後面加上了去除左右空格的方法
for n in range(len(titleList)):
print‘訪問量: %s 標題: %s’ % (viewlist[n], titleList[n]。get_text()。encode(‘utf-8’)。strip())
#本頁抓取完畢後頁號加1
page_num = page_num + 1;
上面的程式碼做什麼基本註釋都寫得比較清晰,最上面的import肯定就是匯入需要的第三方模組,其中的BeautifulSoup需要單獨安裝,否則會找不到的。首先肯定是需要透過網路請求將頁面的html程式碼下載下來,然後開始解析的,因為有的同學的部落格比較多,所以會存在分頁的問題,我們迴圈爬取,但是還需要知道什麼時候爬取結束呀,就取了一個標誌,因為我們經常看部落格會發現
底部這樣子的提示,當你到最後一頁時候,其實就沒有“尾頁”這個tab了,所以這裡姑且透過正則表示式匹配它來判斷是否還需要再次進行迴圈。其實也可以透過爬取回來的頁面是否還有部落格來判斷,因為如果一個空頁面部落格列表肯定為空呀,或者獲取到的部落格標題為空等等方式。然後就是用的python自帶的網路請求模組,普通的get請求,然後拿到網頁內容,接下來就是獲取部落格標題了,beautifulsoup的find_all方法第一次引數就是要查詢的標籤名稱,第二個引數是指定了class必須為link_title,然後它會返回一個list,後面則是又透過正則表示式匹配出來了頁碼數,最後是將標題以及訪問量格式化輸出了,大體的流程就是醬紫。其實上面的部落格標題我都想透過正則表示式匹配出來,無奈,自己正則表示式用的不6,所以藉助了beautifulsoup這個在Python中解析html程式碼標籤的第三方模組庫,其實它還是挺方便以及強大的。其實獲取部落格訪問量部分我們依然可以透過soup來解析了,只不過下面那的程式碼就要變成醬紫了:
[python]
view plain copy
# 使用beautifulsoup來解析html
viewList = soup。find_all(‘span’, class_=‘link_view’);
#將結果輸出
for n in range(len(titleList)):
print‘訪問量: %s次 標題: %s’ % (viewList[n]。contents[1]。encode(‘utf-8’)。strip(), titleList[n]。get_text()。encode(‘utf-8’)。strip());
#頁號加1
page_num = page_num + 1;
可以看到輸出viewlist時候用了contents這個屬性,是因為contents能夠取到viewlist中的每一個span的子標籤子內容,透過取數觀察發現,訪問數量處於第二位所以是contents[1]了。而獲取標題部分的get_text方法則是獲取標籤所包的具體文案內容的。上面的程式碼是可以直接執行的,在終端或者IDE裡面執行過後可以看到如下的結果:
以上就是本次部落格的全部內容,如果有錯誤紕漏歡迎批評指正。其實,覺得python這個東西真的挺神奇的,簡單幾行程式碼就可以搞很多事情,以後還要多研究呀。