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