iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 16
0

今天我們來利用 Python requests 自動取得匯率資料,並將資料透過 pymysql 存進 MySQL 資料庫中儲存,匯率來源API從 https://tw.rter.info/ 取得,關於 MySQL 的操作大家可以參考這個網站


首先創建虛擬環境與安裝第三方套件

pipenv --python 3.7
pipenv shell
pipenv install requests pymysql

新增一個 main.py 檔案,程式碼如下:
其中我們 import mysql 是 import 我們的自訂 class,等等我們必須寫一個 mysql.py 來給主程式進行資料庫操作,最初很簡單進行API存取,利用 requests GET請求匯率資料,回傳的資料格式是 JSON,因此下面我們利用 json.loads() 來解析 JSON 字串,選擇我們想要的匯率欄位與時間,用 for loop 遞歸尋訪整個 list,並呼叫 mysql.py 內的 Database() 進行資料寫入。

# -*-encoding=utf-8-*-

import requests
import json
import mysql

# Base URL being accessed
url = "https://tw.rter.info/capi.php"


# Make a GET request and read the response
response = requests.get(url)
Jsondata = response.text

data = json.loads(Jsondata)

#print(data["USDGTQ"]["Exrate"]) #debug only!
    
for key, value in data.items():
    mysql.insert_data((key,value["UTC"],value["Exrate"]))

新增 mysql.py
這裡面包含了一個自定義類別 Database(),我們要先將一開始的pymysql.connect內的參數改成你的資料庫設定,接著下面透過方法包裝 pymysql 第三方函式庫的操作,包含 fetch data 和 insert data。sql 字串內為 sql 語法,需要視情況而修改成你的 MySQL 命令。code original from cjchengtw

# -*- coding: utf-8 -*-

import pymysql
import os


# Important! Please change the configs below!
class Database:
    def __enter__(self):
        self.conn = pymysql.connect(host='DB-HOST',
                                    db='DB-NAME',
                                    port=3306, user='USERNAME',
                                    passwd='PASSWORD',
                                    use_unicode=True,
                                    charset="utf8")

        self.cur = self.conn.cursor()
        return self.cur

    def __exit__(self, ex_type, ex_value, ex_tb):
        self.conn.commit()
        self.conn.close()


def query_fetchone(sql, data=None):
    with Database() as db:
        if data:
            db.execute(sql, data)
        else:
            db.execute(sql)
        return db.fetchone()


def query_fetchall(sql, data=None):
    with Database() as db:
        if data:
            db.execute(sql, data)
        else:
            db.execute(sql)
        return db.fetchall()


def insert_data(data):
    with Database() as db:
        sql = """INSERT INTO currency_table (currency,time,exrate) VALUES (%s,%s,%s)""".format(
            data[0], data[1], data[2])
        db.execute(sql, data)

延伸閱讀
https://blog.gtwang.org/linux/mysql-create-database-add-user-table-tutorial/
https://github.com/PyMySQL/PyMySQL
https://codertw.com/%E8%B3%87%E6%96%99%E5%BA%AB/16063/
https://ithelp.ithome.com.tw/articles/10207905
https://tw.rter.info/
https://github.com/oxygen-TW/Campus-Weather-Service/blob/master/Driver/standard/database.py


上一篇
Day15-Python Line 整合應用 -- Line Notify
下一篇
Day17- 圖片轉灰階小工具
系列文
原來電腦可以這樣用!? 果蠅也懂的程式語言教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言