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