使用python和tableau對數據進行抓取及可視化
作者:藍鯨
本篇文章介紹使用python抓取貸款及理財平臺的數據,并將數據拼接和匯總。最終通過tableau進行可視化。與之前的python爬蟲文章 不同之處在于之前是一次性抓取生產數據表,本次的數據需要每天重復抓取及存儲,并匯總在一起進行分析和可視化。
開始前的準備工作
開始之前先導入所需使用的庫文件,各個庫文件在整個抓取和拼表過程中負責不同的部分。Requests負責頁面抓取,re負責從抓取下
來的頁面中提取有用的信息,pandas負責拼接并生成數據表以及最終的數據表導出。
</pre> #導入requests庫(請求和頁面抓取) import requests #導入正則庫(從頁面代碼中提取信息) import re #導入科學計算庫(拼表及各種分析匯總) import pandas as pd <pre>
設置一個頭文件信息,方便后面的抓取。這個頭文件有兩個作用,第一防止抓取時被封,第二方便后面對頁面源文件的轉碼。
</pre> #設置請求中頭文件的信息 headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11' , 'Accept' : 'text/html;q=0.9,*/*;q=0.8' , 'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3' , 'Connection' : 'close' , 'Referer' : 'https://www.bluewhale.cc/' } <pre>
抓取貸款及理財信息
準備工作完成后開始對貸款和理財信息進行抓取,這里我們偷個懶,直接抓取p2peye.com的信息。p2peye.com是一個網貸咨詢及數據
平臺,內容很豐富。他們定期更新各平臺的貸款及理財數據。
因為所有的網貸平臺信息都在一頁上,所以抓取起來比較簡單,不需要翻頁。下面是抓取并保存頁面信息的代碼。
</ pre > #抓取并保存頁面信息 r=requests. get ( 'http://www.p2peye.com/shuju/ptsj/' ,headers=headers) html=r.content <pre>
抓取下來的信息需要進行轉碼才能變成有用的信息,下面對頁面源代碼進行GBK轉碼。
</pre> #對抓取的頁面進行編碼 html =str(html, encoding = "GBK" ) <pre>
查看一下轉碼后的頁面,我們需要的信息都包含在里面了。后面只需要使用正則表達式逐個提取出來就可以了。
</pre> #查看抓取的頁面源碼 html <pre>
提取信息并進行數據清洗
使用正則表達式對應著頁面中的字段逐個將關鍵數據從頁面源碼中提取出來,下面是具體的過程,首先提取的是平臺名稱字段。在頁
面源碼中平臺名稱在title中。
</pre> #使用正則提取title字段信息 title =re.findall(r' "return false" .*?title= "(.*?)" ',html) <pre>
提取后查看下結果,內容很干凈,不需要進行清洗可以直接使用。
</pre> #查看title字段信息 title <pre>
這里有一點要注意的是每個提取出來的字段最好都要檢查下,并且查看下數據的條目。因為有時候提取的條目中包含有其他的信息,
導致字段間條目數量不一致,這種情況下后面是無法拼接成數據表的。
</ pre > #查看title字段數量 len (title) 607 <pre>
按照提取平臺名稱title的方法,后面我們依次提取了貸款利率,貸款金額,滿標時間等關鍵信息。下面是具體的代碼。
</pre> #使用正則提取total字段信息 total =re.findall(r' "total" >(.*?)萬<',html) #使用正則提取rate字段信息 rate =re.findall(r' "rate" >(.*?)<',html) #使用正則提取pnum字段信息 pnum =re.findall(r' "pnum" >(.*?)人<',html) #使用正則提取cycle字段信息 cycle =re.findall(r' "cycle" >(.*?)月<',html) #使用正則提取plnum字段信息 p1num =re.findall(r' "p1num" >(.*?)人<',html) #使用正則提取fuload字段信息 fuload =re.findall(r' "fuload" >(.*?)分鐘<',html) #使用正則提取alltotal字段信息 alltotal =re.findall(r' "alltotal" >(.*?)萬<',html) #使用正則提取captial字段信息 capital =re.findall(r' "capital" >(.*?)萬<',html) <pre>
由于后面我們要對數據進行累計追加及趨勢分析,因此在這里導入time庫生成當天的日期,并將日期作為一個字段一起放在數據表。
</pre> #導入time庫(獲取日期) import time date= time .strftime( '%Y-%m-%d' , time .localtime( time . time ())) <pre>
當天的日期信息將和數據一起生成數據表。
</ pre > #日期 date '2017-04-13' <pre>
創建貸款及理財數據表
將前面提取出來的數據和日期信息一起生成數據表,首先使用columns參數設置數據表中各字段的排列順序。
</pre> #設置數據表各字段順序 columns = [ '采集日期' , '平臺名稱' , '成交額(萬)' , '綜合利率' , '投資人(人)' , '借款周期(月)' , '借款人(人)' , '滿標速度(分鐘)' , ' 累計貸款余額(萬)' , '凈資金流入(萬)' ] <pre>
然后設置各字段的名稱,并生成數據表。
</ pre > #創建數據表 table=pd.DataFrame({ '采集日期' :date, '平臺名稱' :title, '成交額(萬)' :total, '綜合利率' :rate, '投資人(人)' :pnum, '借款周期(月)' :cycle, '借款人(人)' :p1num, '滿標速度(分鐘)' :fuload, '累計貸款余額(萬)' :alltotal, '凈資金流入(萬)' :capital}, columns=columns) <pre>
查看生成的數據表,字段順序與我們設置的一致,下一步把數據表導出為csv文件。便于后續的處理和分析。
</pre> #查看數據表 table <pre>
導出及追加數據
將生成的數據表導出為csv文件。這里有兩種導出方式。第一是新建數據表。但比較麻煩,后續要需要手動將每天的數據進行拼接。因
此還有第二種導出方式就是在一個數據表中不斷追加新數據。
第一種方式將數據表導出為一個新的csv文件,文件名為wdty加上數據抓取的具體日期,也就是date中的值。
</ pre > #導出csv文件 table.to_csv( 'C:\\Users\\ Desktop\\wdty' +date+ '.csv' , index =False) <pre>
第二種方式是在一個csv文件中持續追加導出新的數據表。這里我們建立一個wdty的csv文件,每天抓取的數據都會追加到這個csv文件
中。代碼與之前的新建csv文件類似,唯一的區別是增加了mode參數,這個參數默認值是w,也就是新建。把值改為a就是追加導出。
</ pre > #在歷史csv文件中追加新信息 table.to_csv( 'wdty.csv' , index =False, mode = 'a' ) <pre>
以下是導出后的數據表截圖。內容與前面創建的數據表內容一致。
創建自定義函數
從導入所需的庫文件,到提取數據拼接和導出,我們一共進行了30+步的操作。為了簡化步驟,我們把這些步驟放在一個loan_data自
定義函數中。以后每次只需要執行以下這個自定義函數就可以將數據抓取下來并導出到csv里了。下面是具體的代碼,其中為了獲得代
碼執行中的過程信息,我們在一些關鍵步驟后使用print輸出了一些狀態信息。并計算了整個代碼執行所耗費的時間。
</pre> def loan_data(): import os import requests import re import pandas as pd import time start = time.clock() headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11' , 'Accept' : 'text/html;q=0.9,*/*;q=0.8' , 'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3' , 'Connection' : 'close' , 'Referer' : 'https://www.bluewhale.cc/' } r=requests.get( 'http://www.p2peye.com/shuju/ptsj/' ,headers=headers) status=r.status_code if status == 200 : print ( '頁面抓取狀態正常。' ) else: os._exit( 0 ) html=r.content html=str(html, encoding = "GBK" ) print ( '編碼轉換完成!' ) title=re.findall(r '"return false".*?title="(.*?)"' ,html) total=re.findall(r '"total">(.*?)萬<' ,html) rate=re.findall(r '"rate">(.*?)<' ,html) pnum=re.findall(r '"pnum">(.*?)人<' ,html) cycle=re.findall(r '"cycle">(.*?)月<' ,html) p1num=re.findall(r '"p1num">(.*?)人<' ,html) fuload=re.findall(r '"fuload">(.*?)分鐘<' ,html) alltotal=re.findall(r '"alltotal">(.*?)萬<' ,html) capital=re.findall(r '"capital">(.*?)萬<' ,html) date=time.strftime( '%Y-%m-%d' ,time.localtime(time.time())) print ( '數據提取完成!' ) columns = [ '采集日期' , '平臺名稱' , '成交額(萬)' , '綜合利率' , '投資人(人)' , '借款周期(月)' , '借款人(人)' , '滿標速度(分 鐘)' , '累計貸款余額(萬)' , '凈資金流入(萬)' ] table=pd.DataFrame({ '采集日期' :date, '平臺名稱' :title, '成交額(萬)' :total, '綜合利率' :rate, '投資人(人)' :pnum, '借款周期(月)' :cycle, '借款人(人)' :p1num, '滿標速度(分鐘)' :fuload, '累計貸款余額(萬)' :alltotal, '凈資金流入(萬)' :capital}, columns=columns) print ( '數據表創建完成!' ) table.to_csv( 'C:\\Users\\cliffwang\\Desktop\\wdty' +date+ '.csv' ,index=False) print (date+ '日數據導出完畢!' ) table.to_csv( 'wdty.csv' ,index=False,mode= 'a' ) print ( '累計數據追加導出完畢!' ) end = time.clock() print ( "執行時間: %f s" % (end-start)) <pre>
自定義函數寫好后,每次只需要執行loan_data()就可以完成之前的30+步驟的工作了。下面是代碼和輸出的狀態信息以及代碼執行時間信息。
</ pre > loan_data() 頁面抓取狀態正常。 編碼轉換完成! 數據提取完成! 數據表創建完成! 2017-04-19日數據導出完畢! 累計數據追加導出完畢! 執行時間: 0.933262 s < pre >
使用tableau進行可視化
導出的數據雖然為csv格式,但使用excel進行可視化并不理想,主要問題在于excel對圖表行列數的限制(每張圖最多只能容納255個數
量列)。因此,我們將數據表導入到tableau中進行可視化。下面是對600+家網貸平臺數據的可視化截圖。尺寸為各平臺總成交額,顏色為綜合利率。
所有文章及圖片版權歸 藍鯨(王彥平)所有。來源:藍鯨網站分析博客。
End.
轉載請注明來自36大數據(36dsj.com): 36大數據 ? 使用python和tableau對數據進行抓取及可視化