用 Python 抓取 Ubike 開放資料 (顯示篇)

抓完資料,接著就是要用畫面來呈現囉!我使用 Django 搭配 Bootstrap,並引入 Chart.js 來繪製圖表


網頁建置

用 Django 建立起基本網頁,架構如下 (只列出重要文件)

├── bike
 │ ├── admin.py
 │ ├── models.py
 │ ├── templatetags //自訂的template filter
 │ │ ├── init.py
 │ │ └── myfilter.py
 │ └── views.py
 ├── db.sqlite3
 ├── manage.py
 ├── statics
 │ ├── css
 │ │ ├── bootstrap.css //bootstrap css
 │ │ ├── bootstrap.min.css
 │ │ └── custom.min.css
 │ ├── fonts
 │ └── js
 │ ├── bootstrap.min.js //bootstrap js
 │ └── Chart.js //繪製圖表 js
 ├── templates //網頁樣板
 │ ├── base.html
 │ ├── display.html
 │ ├── history.html
 │ ├── index.html
 │ └── status.html
 ├── views.py
 └── web
 ├── init.py
 ├── settings.py
 ├── urls.py
 └── wsgi.py

連接資料庫

Django 本身有一個 SQLite 資料庫,但我不打算使用他,而是透過 MySQLdb 套件,進入 MySQL 存取資料

例如把靜態資料給顯示出來,會在 view.py 中寫

def show(request):
    conn = None
    try:
        conn = MySQLdb.connect(host = "localhost", user = "root", passwd = "123456", db = "bike")
        c = conn.cursor()
        conn.set_character_set('utf8')
        c.execute("SELECT * FROM info ORDER BY sno")
        r = c.fetchall()
        conn.close()
    except socket.error as serror:
        if conn is not None:
            conn.close()
    return render(request, "display.html", locals())

fetchall() 拿回來的資料是 tuple 包著 tuple 的形式。因此在 template 取值時,要使用迴圈,或是 r.0 這個方式,而不能像存取 list 的用法一樣用 r[0] 詳情可看這篇文章

 Access tuple in django template

最後可以把靜態資料顯示出來如下

bike4 - 用 Python 抓取 Ubike 開放資料 (顯示篇)

同樣方式做一個每分鐘的即時顯示

bike3 - 用 Python 抓取 Ubike 開放資料 (顯示篇)

這裡需要注意的是 bar 的顯示,因為可使用量與種數量分別是兩個變數,如果要在 template 中做運算,需要註冊一個 template filter,我的作法如下:

建立一個 myfilter.py 檔案,位置就如同架構所示,旁邊還要有個 init.py

# myfilter.py
from django import template
register = template.Library()
@register.filter
def divideToPercent(value, arg):
return int(float(value) / float(arg) *100)

在 temaplte 中引入自己的 filter,就可以做除法運算,算出百分比囉

{% load myfilter %}
<td>
    <div class="progress progress-striped active">
        <div class="progress-bar" style="width: {{b.3|divideToPercent:b.2}}%">
        </div>
    </div>
</td>

更多用法,請看官網的說明

 Custom template tags and filters

繪製圖表

我直接使用 chart.js 這個繪製工具庫,把 example 稍微修改一下,繪製歷史資料

bike5 - 用 Python 抓取 Ubike 開放資料 (顯示篇)

PS.因為主機並非在台灣,上圖的時間並不是很正確,這部份之後會調整


參考資料

Jerry
Jerry

樂於分享的軟體工程師,曾在新創與大型科技公司實習,獲得黑客松競賽冠軍,擔任資安研討會講者。長期熱衷於資訊安全、雲端服務、網路行銷等領域,希望將科技知識分享給更多人。內容轉載請來信:jlee58tw@gmail.com

4 則留言

    • Hi, Leo
      請問您指的是什麼意思呢?半年的資料也是一樣的方法,根據時間塞進資料庫對吧

  1. 請問這在範例有放在GitHub嗎?
    最近在學python,爬文到貴站
    目前就剩這篇django
    如果可以的話,希望可以看一下這篇的source
    感恩

發表回應