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()