---
# System prepended metadata

title: Untitled

---

# 新規
```
CREATE DATABASE yutons;

use yutons;

CREATE table rates(
  rate_price float,
  rate_type varchar(7),
  registration_time timestamp DEFAULT CURRENT_TIMESTAMP
) DEFAULT CHARACTER SET 'utf8mb4';
```

```
#スクレイピング用
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options

# 時間取得用
import datetime
import time

# header偽装用
import random

# TRAP用
import signal
from threading import Thread
import sys

# データベース用
import mysql.connector
from mysql.connector import Error

# header偽装オプション
user_agent = [
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.2 Safari/605.1.15',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Safari/605.1.15',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
]
UA = user_agent[random.randrange(0, len(user_agent), 1)]

# データベース接続用
DB_HOST="localhost"
DB_USER="root"
DB_PASSWD="@MariaDB.rootpass"
DB_NAME="yutons"

# URLアクセス
FINANCE_URL="https://jp.investing.com/currencies/usd-jpy"

# =========================
# メイン関数
# =========================
def main():
  try:
    # options = Options()
    # options.add_argument('--headless')          # chrome option追加
    # options.add_argument('--user-agent=' + UA)  # chrome option追加

    # driver=webdriver.Chrome(options=options)    # driver起動(option追加用)
    driver=webdriver.Chrome()                     # driver起動
    driver.get(FINANCE_URL)

    while True:
        time.sleep(5)
        prices = driver.find_elements(By.CSS_SELECTOR,"span[data-test='instrument-price-last']") # レート取得
        now=datetime.datetime.now() # 時間取得

        counter=0
        # 取得したレートがデータ型で3つあるため、forで1つだけ取得してデータベースに格納
        for price in prices:
          if counter == 0:
            rate_time=str(now.strftime('%Y/%m/%d %H:%M:%S'))
            rate_price=str(price.text)
            print("取得時間: " + str(rate_time))
            print("為替レート: " + rate_price + "\n")
            insertDB(rate_price)
            counter = counter + 1
  except:
    pass

# =====================
# データベース格納用関数
# =====================
def insertDB(rate_price):
  # データベースに接続
  connection = mysql.connector.connect(host=DB_HOST,user=DB_USER,password=DB_PASSWD,database=DB_NAME)

  cursor = connection.cursor()
  # レコードを挿入
  sql = "INSERT INTO `rate` (`rate_price`, `rate_type`) VALUES (%s, %s)"
  cursor.execute(sql, (rate_price,'USDJPY'))

  # コミットしてトランザクション実行
  connection.commit()

  # 終了処理
  cursor.close()

# =========================
# trap検出用関数
# =========================
def trap_handler(signum, frame):
  print("trap検出のためプログラムを終了します")
  sys.exit()


if __name__ == "__main__":
  # メイン関数実行
  mainfunc = Thread(target=main, args=[])
  mainfunc.start()

  # 並列処理でトラップ検出
  signal.signal(signal.SIGINT,trap_handler)




```

