본문 바로가기

파이썬 & 머신러닝과 딥러닝

데이터베이스 윈도우 함수, 데이터 모델링 개요 및 정규화, Selenium 크롤링

윈도우 함수

ROW_NUMBER(), RANK(), DENSE_RANK(), LEAD(), LAG() 등

 

sum()

select
e.emp_no, e.name, e.dept_no, e.salary,
sum(e.salary) over (partition by e.dept_no) as total_dept_sal,
sum(e.salary) over (partition by e.dept_no order by e.emp_no) as emp_sal
from employee e;

 

 

dense_rank()

select e.emp_no, e.name, e.salary,
dense_rank() over (order by e.salary desc) as dense_ranks
from employee e;

 

 


 

데이터 모델링 개요 및 정규화

 

데이터 모델

: 현실 세계를 추상화하여 사람, 장소, 사물, 범주에 대한 데이터 구조와 이들간의 관계를 시각적으로 표현

데이터의 논리적 구조를 정의함

 

데이터 모델 종류

  • 계층적 데이터 모델 (Hierarchical Data Model)
  • 네트워크 데이터 모델 (Network Data Model)
  • 개체-관계형 데이터 모델 (Entity - Relationship Data Model)
  • 관계형 개체 모델 (Relational Data Model)
  • 차원 데이터 모델 (Dimensional Data Model)
  • 객체지향 데이터 모델 (Object Oriented Data Model)
  • 그래프 데이터 모델 (Graph Data Model)

 

Selenium 사용 실습

Python을 사용하여 Selenium 라이브러리를 통해

구글 파이낸스에서 특정 주식(여기서는 카카오 주식)의 현재 가격과 업데이트 시간을 가져오는 스크립트

# -*- coding: utf-8 -*-
"""
Created on Thu Jul 11 15:21:50 2024
@author: User
"""

# Selenium 및 관련 라이브러리 임포트
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time

# 크롬 드라이버 설정 및 초기화
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

# 주가와 업데이트 시간을 가져오는 함수 정의
def fetch_price_and_date(driver):
    # 구글 파이낸스에서 카카오 주식 페이지로 이동
    url = "https://www.google.com/finance/quote/035720:KRX?hl=ko"
    driver.get(url)
    
    # 페이지 로드 대기
    time.sleep(5)  # 동적 콘텐츠 로드를 위한 대기 시간
    
    # 주가와 업데이트 시간 요소를 찾기
    price_element = driver.find_element(By.XPATH, '//*[@class="YMlKec fxKbKc"]')
    date_element = driver.find_element(By.XPATH, '//*[@class="ygUjEc"]')
    name_element = driver.find_element(By.XPATH, '//*[@class="zzDege"]')
    
    # 각 요소의 텍스트를 가져오기
    price = price_element.text
    date = date_element.text
    name = name_element.text
    
    # 회사 이름, 주가, 업데이트 시간을 반환
    return name, price, date

# 함수를 호출하여 회사 이름, 주가, 업데이트 시간을 가져오기
name, price, date = fetch_price_and_date(driver)

# 결과 출력
print(f"회사 이름: {name}")
print(f"오늘 주가: {price}")
print(f"업데이트 시간: {date}")

# 드라이버 종료
driver.quit()

 

 

  • 라이브러리 임포트:
    • selenium: 웹 페이지를 자동으로 제어하기 위한 라이브러리.
    • webdriver_manager: 크롬 드라이버를 자동으로 설치 및 관리하기 위한 라이브러리.
    • time: 주로 대기 시간을 설정하기 위한 라이브러리.
  • 크롬 드라이버 설정 및 초기화:
    • webdriver.Chrome(): 크롬 브라우저를 제어하는 객체를 생성.
    • ChromeService(ChromeDriverManager().install()): 크롬 드라이버를 설치하고 초기화.
  • fetch_price_and_date 함수 정의:
    • 특정 URL(카카오 주식 페이지)로 이동.
    • 페이지가 완전히 로드되도록 5초 대기.
    • find_element를 사용하여 주가, 업데이트 시간, 회사 이름 요소를 찾아 텍스트를 추출.
    • 추출한 값을 반환.
  • 함수 호출 및 결과 출력:
    • 함수를 호출하여 회사 이름, 주가, 업데이트 시간을 가져오고 이를 출력.
  • 드라이버 종료:
    • driver.quit(): 모든 브라우저 창을 닫고 드라이버를 종료.

 


 

Python을 사용하여 Selenium으로 웹 페이지에서 실시간 가격 정보를 가져와 MySQL 데이터베이스에 저장

import time
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By
import pymysql
# MySQL 데이터베이스 연결 설정
db_connection = pymysql.connect(
    host='localhost',  # MySQL 서버 주소
    user='root',  # MySQL 사용자 이름
    password='0000',  # MySQL 비밀번호
    database='test1'  # 사용할 데이터베이스 이름
)
cursor = db_connection.cursor()
# 데이터베이스와 테이블을 생성하는 함수
def create_database_and_table():
    cursor.execute("CREATE DATABASE IF NOT EXISTS crypto_prices")
    cursor.execute("""
    CREATE TABLE IF NOT EXISTS btcusdt_prices (
        id INT AUTO_INCREMENT PRIMARY KEY,
        timestamp DATETIME NOT NULL,
        price DECIMAL(10, 2) NOT NULL
    )
    """)
    db_connection.commit()
# 데이터베이스와 테이블 생성
create_database_and_table()
# Selenium WebDriver 설정
driver = webdriver.Chrome()  # 혹은 다른 브라우저 드라이버 사용
url = "https://www.bitget.com/asia/futures/usdt/BTCUSDT"
driver.get(url)
# 데이터베이스에 가격 데이터를 삽입하는 함수
def insert_price_data(timestamp, price):
    sql = "INSERT INTO btcusdt_prices (timestamp, price) VALUES (%s, %s)"
    cursor.execute(sql, (timestamp, price))
    db_connection.commit()
# 웹 페이지에서 현재 가격을 가져오는 함수 (XPath를 이용)
def fetch_current_price():
    try:
        # 적절한 XPath로 수정 필요
        price_element = driver.find_element(By.XPATH, '//*[@id="root"]/div/div[3]/div/div[1]/div[2]/div/div[2]/li')
        price = float(price_element.text.replace(',', ''))  # 텍스트에서 가격 추출 및 변환
        return price
    except Exception as e:
        print(f"Error fetching price: {e}")
        return None
# 일정 간격으로 가격 데이터를 가져와 저장하는 함수
def fetch_and_store_prices(interval=10, duration=60):
    start_time = time.time()
    while (time.time() - start_time) < duration:
        current_price = fetch_current_price()
        if current_price is not None:
            current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            insert_price_data(current_time, current_price)
            print(f"Stored price {current_price} at {current_time}")
        time.sleep(interval)
# 1분 동안 10초 간격으로 가격 데이터 가져와 저장
fetch_and_store_prices(duration=60)
# 데이터베이스 연결 종료 및 Selenium 드라이버 종료
cursor.close()
db_connection.close()
driver.quit()