# 新規
```
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)
```