??最近python是越來越火了谈秫,自己也是想體驗一把,所以就抽時間把python基礎語法什么的都了解了下鱼鼓,也把具體的代碼試了試拟烫。看完了想著總要應用下吧迄本,否則總感覺沒勁兒硕淑,就跟沒學似得,畢竟實踐是最好的老師嘛岸梨。那么實現(xiàn)個什么功能呢喜颁?然后就看到了博客,要不就把所有博客的標題以及閱讀次數統(tǒng)計下吧曹阔,也算是網絡爬蟲吧半开。
??當然代碼是可以復用的,之前的爬取代碼我們直接拿過來用就好了赃份,本質上是只需要將我們爬取的數據展示在折線圖上面就好了寂拆,python中畫圖常用的就是matplotlib了奢米,當然這個屬于第三方模塊,需要安裝纠永,如果不安裝直接導包是會失敗的鬓长,當然安裝就很簡單了,這里就不多介紹了尝江。下面是我們代碼的完整實例涉波。
#!usr/bin/python
# -*- coding: utf-8 -*-
'''
使用python爬取csdn個人博客的訪問量,并用折線圖展示出來時間和閱讀數目的關系
'''
import urllib2
import re
from bs4 import BeautifulSoup;
#當前的博客列表頁號
from http import ResponseUtils
# 導入畫圖需要的庫
from pylab import *
page_num = 1
notLast = 1;
# account = str(raw_input('輸入csdn的登錄賬號:'))
account = 'submit66'
allTitleList = [];
allViewList = [];
while notLast:
#首頁地址
baseUrl = 'http://blog.csdn.net/'+account
#連接頁號炭序,組成爬取的頁面網址
myUrl = baseUrl+'/article/list/'+str(page_num)
#偽裝成瀏覽器訪問啤覆,直接訪問的話csdn會拒絕
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
#構造請求
req = urllib2.Request(myUrl, headers=headers);
#訪問頁面
myResponse = urllib2.urlopen(req)
myPage = ResponseUtils.OutResponse().getResponse(myResponse);
#在頁面中查找是否存在‘尾頁’這一個標簽來判斷是否為最后一頁,如果沒有則代表是最后一頁了
pattern = re.compile('尾頁</a>');
notLast = pattern.findall(myPage, re.S);
soup = BeautifulSoup(myPage, 'lxml');
# 使用beautifulsoup來解析html
titleList = soup.find_all('span', class_='link_postdate');
# 使用beautifulsoup來解析html
viewList = soup.find_all('span', class_='link_view');
allTitleList.extend(titleList);
allViewList.extend(viewList);
#頁號加1
page_num = page_num + 1;
# ----------------循環(huán)結束渠道數據,下面是為了繪圖準備數據惭聂,并且對數據做加工-----------------
# 將數據結果順序反轉窗声,因為之前是倒序排列,我們需要的時間是從前到后的
allTitleList.reverse();
allViewList.reverse();
# 聲明兩個數組辜纲,存儲的即為x笨觅、y軸的值
xValues = [];
yValues = [];
# 通過循環(huán)給存儲x和y軸坐標值的list賦值
for n in range(len(allViewList)):
xvalue = allViewList[n].contents[1].encode('utf-8'); # 取出閱讀數量數據
yvalue = allTitleList[n].get_text().encode('utf-8'); # 取出閱讀日期數據
yValues.append(xvalue[1:len(xvalue)-1]) # 因為去除的閱讀數是帶()的,所以我們需要截取耕腾,對于字符串的截取就相當于截取數組
xValues.append(yvalue) # 將閱讀數量放在list中
# 打印輸出我們的數據
print '閱讀數量:%s 日期:%s' % (yValues[n], xValues[n]);
# --------------下面是開始繪圖部分--------------
# 這行代碼是設置中文字體可以展示见剩,否則將會報錯
mpl.rcParams['font.sans-serif'] = ['SimHei']
x = range(len(xValues))
plt.plot(x, yValues, marker='o', mec='r', mfc='w', label=u'x時間和y閱讀數關系折線圖')
plt.legend() # 讓圖例生效
# 可以看到x和y 設置的方式是不同的,因為x軸可能只是一個名稱幽邓,一個分類炮温,而不是一個具體的數值火脉,所以通過這種方式來做了牵舵,而對于y則是要具體展示的數值
plt.xticks(x, xValues, rotation=45) # 這里的rotation,當名稱展示時候倦挂,一個傾斜的角度畸颅,當文案很長時候特別好用
plt.margins(0) # 這個不設置的話,折線的開始和結束出會有間距
plt.subplots_adjust(bottom=0.27) # 設置折線圖和底部區(qū)域的距離
plt.xlabel(u"time(s)閱讀日期") #X軸標簽
plt.ylabel(u"閱讀數量(次)") #Y軸標簽
plt.title(u"閱讀數量趨勢圖") #標題
# 展示圖表對話框
plt.show()
??其實方援,上面的代碼寫的還是蠻清楚的没炒,相比之前的代碼岂座,就是需要導入pylab模塊赏陵,里面自然是包含了matplotlib的了,之前代碼還是爬取的歹茶,一變的是之前我們抓取的是閱讀數量和博客title先匪,現(xiàn)在是閱讀數量和每篇博客創(chuàng)建時間种吸,二是將閱讀數量和閱讀日期分別放在了list中方便下面使用。然后第二部分就是將數據做整合呀非,即為繪圖準備x和y軸的值坚俗,兩者均放在一個list里面镜盯,兩個list的數量是一致的,否則是會報錯的猖败。第三部分則是繪圖部分速缆,首先是設置了繪圖可以正確展示中文,其次是將x和y軸的數據給了繪圖實例恩闻,然后讓繪圖實例生效艺糜,因為我們的x軸只是一個名稱展示,這里即為日期展示幢尚,所以不能像y軸那樣子直接把值塞進去倦踢,所以下面調用了xticks方法進行了特殊處理,下面又設置了x和y軸標簽侠草,即x和y軸分別代表什么了辱挥。最后就是我們的圖表的show(秀)啦。讓我們看看最終效果圖吧:?? 嗯边涕,看起來貌似還不錯晤碘,不過最近的閱讀數量有點低呀,尷尬啦功蜓。有人會問上面的xticks方法的rotation是干嘛的园爷,就是讓我們的x軸數值逆時針旋轉45度呀,你看我們的x軸的每個數值都那么長式撼,如果不旋轉肯定覆蓋了呀童社,還有subplots_adjust這個方法是設置繪圖區(qū)域和上下左右之間的距離的,特別是底部的著隆,如果不設置的話扰楼,那么長的文案是會被下面的菜單欄覆蓋的哦,然后我們再說說plot這個方法的幾個參數的意思美浦,前兩個就是x和y軸的數據了弦赖,第三個就是設置上圖的紅圈即為標記點了,第四個參數是設置標記點的顏色浦辨,上面r代表紅色蹬竖,你換成g就是綠色了,如果不設置的話流酬,默認是藍色币厕。第五個參數就是設置標記點是否是實心,如果mfc不設置的話就是實心的芽腾,最后一個參數就是折線圖的實例和說明了旦装。