pygal模組
安裝pygal模組
pygal模組的安裝非常簡單,只需輸入一行pip命令即可
pip install pygal
安裝完成:
pygal模組介紹
pygal官網地址
pygal是Python的第三方庫,他的主要功能就是資料視覺化,即將數字轉化成圖表的形式來呈現,它提供的圖表樣式有柱狀圖、折線圖、餅狀圖、雷達圖......
柱狀圖
單列柱狀圖
import pygal
view = pygal.Bar()
#圖表名
view.title = '柱狀圖'
#新增資料
view.add('numbers', [0,2,4,6,8,10])
#在瀏覽器中檢視
#view.render_in_browser()
#儲存為view.svg(也可以儲存為jpg)
view.render_to_file('view.svg')
效果圖:
注意:svg圖片用系統自帶瀏覽器開啟可能會顯示全黑色,可以嘗試使用Google瀏覽器開啟
多列柱狀圖
#新增資料
view.add('numbers', [0,2,4,6,8,10])
view.add('numbers_2', [0,1,3,5,7,9])
堆疊柱狀圖
view = pygal.StackedBar()
橫向柱狀圖
view = pygal.HorizontalStackedBar()
折線圖
簡單折線圖
import pygal
view = pygal.Line()
#圖表名
view.title = '折線圖'
#新增資料
view.add('numbers', [0,2,4,6,8,10])
view.add('numbers_2', [0,1,3,5,7,9])
#在瀏覽器中檢視
#view.render_in_browser()
#儲存為view.svg(也可以儲存為jpg)
view.render_to_file('view.svg')
效果圖:
縱向折線圖
view = pygal.HorizontalLine()
堆疊折線圖
view = pygal.StackedLine(fill=True)
餅狀圖
簡單餅狀圖
import pygal
view = pygal.Pie()
#圖表名
view.title = '餅狀圖'
#新增資料
view.add('A', 31)
view.add('B', 55)
view.add('C', 14)
#儲存為view.svg(也可以儲存為jpg)
view.render_to_file('view.svg')
效果圖:
多級餅狀圖
#新增資料
view.add('A', [31,25])
view.add('B', [55,38])
view.add('C', [14,37])
圓環圖
#設定空心圓半徑
view = pygal.Pie(inner_radius=0.4)
半圓圖
view = pygal.Pie(half_pie=True)
雷達圖
基礎雷達圖
import pygal
view = pygal.Radar()
#圖表名
view.title = '雷達圖'
#新增資料(可以為任意個)
view.add('A', [31,56,34,67,34])
view.add('B', [23,18,57,45,35])
view.add('C', [14,45,76,34,76])
#儲存為view.svg(也可以儲存為jpg)
view.render_to_file('view.svg')
效果圖:
其他圖表介紹
直方圖
盒子圖
圓點圖
座標圖
錐形圖
環狀圖
儀表圖
塔形圖
樹圖
地圖
爬取中國福彩網彩票資料並以圖表形式顯示
網頁分析
首先開啟中國福彩網,點選雙色球,選擇往期開獎欄目
進入欄目後,選定往期的獎金數目作為我們想要爬取的目標內容
明確目標後,開始尋找資料所在的位置
滑鼠右擊頁面,開啟網頁原始碼,在原始碼中搜尋是否存在獎金金額數目
搜尋過後,發現這個金額資料沒有在網頁的原始碼中,所以想到用抓包的方式來嘗試獲取這些金額資料
右擊檢查,選擇network選項卡,按下ctrl+r鍵重新整理介面,開始捕捉資料包
在過濾掉一些png、jpg的資料包之後,我們鎖定了一個以findDrawNotice開頭的資料包,開啟觀察資料包的內容,發現這個正是我們想要抓取的資料包
現在已經找到了想要抓包的內容,現在可以開始著手寫程式碼了
資料提取
我們分析過網頁之後,選定了要抓取的資料包,開始使用requests請求來獲取資料
url = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueCount=30'
headers = {
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36",
"Referer":"http://www.cwl.gov.cn/kjxx/ssq/"
}
response = requests.get(url,headers=headers).text
這個網頁可能會有一個小的反爬措施,於是我們就在headers中加入user-agent和referer兩個頭資訊
我們使用print語句來列印一下response的內容
print之後會發現這個內容是以字串的格式列印出來的,如果我們想從中提取資料,則必須將它轉換成字典的格式
data_json = json.loads(response) #將資料轉換為json格式
將資料轉換之後,我們就可以使用鍵值對的方式來提取我們想要的資料了
datas = data_json["result"]
for data in datas:
prizegrades = data["prizegrades"] #包含中獎金額的字典提取
for item in prizegrades:
print(item)
typemoney = item['typemoney'] #中獎金額提取
print(typemoney)
這裡我們嘗試著逐層提取彩票的獎金資訊,提取到最近的一層時,將資料列印出來分析資料
可以看到前三個和我們想要提取的資料內容是一致的,這些type後面的數字指的是獎金的等級,就是說對應到的號碼是多少就是幾等獎
到此為止,我們已經將需要獲取的中獎金額提取出來了
轉換資料
等我們看到這些資料的時候,雖然看到的是數字形式,但是他的資料型別確是字元形,通過此前對pygal模組的瞭解,我們知道這個模組只可以將整形的數字轉換成圖表格式。
所以我們需要做的就是將每一個數字提取出來,並且轉換成整形存入到列表中
由於我們想要提取的只是一等獎的獎金金額(因為二、三等獎的金額遠小於一等獎,不適合在圖表中觀察),所以這裡我加上了一個if語句判斷
money_list = [] #建立空列表
for data in datas:
prizegrades = data["prizegrades"]
for item in prizegrades:
type_num = item['type']
typemoney = item['typemoney']
if type_num == 1: #判斷獎金等級是否為1
money_list.append(int(typemoney))
但是我在執行這段程式碼的時候會提示錯誤,經過我的一番瘋狂分析(百度求助),發現出錯的原因是在提取獎金的時候會出現下劃線和空字串的干擾,而int轉換資料型別則只能裝換純數字組成的字串,所以轉換的過程中會報錯。但是這並不是一個大問題,我們只需要寫一個if語句來跳過非法字串就可以解決了,下面是正確的程式碼:
money_list = [] #建立空列表
for data in datas:
prizegrades = data["prizegrades"]
for item in prizegrades:
typemoney = item['typemoney']
if type_num == 1: #判斷獎金等級是否為1
if typemoney == "": #忽略空字元
pass
elif typemoney == "_": #忽略下劃線
pass
else: #將其他的可用數字放入列表
money_list.append(int(typemoney))
print(money_list)
觀察輸出:
將資料轉換成圖表
#設定圖表樣式為柱狀圖
view = pygal.Bar()
#圖表名
view.title = '獎金金額(¥)'
#將資料填入圖表
view.add('money',money_list)
#在瀏覽器中顯示圖表
view.render_in_browser()
完整程式碼
import json
import pygal
url = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueCount=30'
headers = {
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36",
"Referer":"http://www.cwl.gov.cn/kjxx/ssq/"
}
response = requests.get(url,headers=headers).text
data_json = json.loads(response)
datas = data_json["result"]
money_list = [] #建立空列表
for data in datas:
prizegrades = data["prizegrades"]
for item in prizegrades:
type_num = item['type']
typemoney = item['typemoney']
if type_num == 1: #判斷獎金等級是否為1
if typemoney == "": #忽略空字元
pass
elif typemoney == "_": #忽略下劃線
pass
else: #將其他的可用數字放入列表
money_list.append(int(typemoney))
#設定圖表樣式為柱狀圖
view = pygal.Bar()
#圖表名
view.title = '獎金金額(¥)'
#將資料填入圖表
view.add('money',money_list)
#在瀏覽器中顯示圖表
view.render_in_browser()