반응형

 

1. BeautifulSoup

 

BeautifulSoup 라이브러리에서는 웹사이트에 데이터를 읽어와서 파싱할 수 있는 기능을 제공하고 있다.

import requests
from bs4 import BeautifulSoup

def get_fear_and_greed():
    url = "https://edition.cnn.com/markets/fear-and-greed"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # HTML 구조에 맞는 특정 요소를 찾아 Fear and Greed Index 값을 추출
    index = soup.find("div", class_="fear-and-greed-index").text.strip()
    return index

if __name__ == "__main__":
    index_value = get_fear_and_greed()
    print(f"CNN Fear and Greed Index: {index_value}")

 

 

하지만 아래 코드를 수행해보면 정상적으로 데이터를 파싱하지 못하는 것 처럼 보일 것이다.

(특히 직접 원하는 영역의 div의 class이름을 검색해보면 결과가 포함이 되지 않을 것이다.)

 

2. Selenium

그 이유는 해당 값이 JavaScript로 동적으로 로딩되기 때문이다. requests와 BeautifulSoup은 HTML 소스를 바로 가져오기 때문에 JavaScript로 생성된 콘텐츠는 포함되지 않는다.

 

이 문제를 해결하려면, Selenium과 같은 브라우저 자동화 도구를 사용하여 동적으로 로딩되는 콘텐츠를 포함한 페이지를 가져올 수 있다. Selenium을 사용하면 JavaScript가 로드된 후 페이지에서 데이터를 추출할 수 있다.

 

from selenium import webdriver
from selenium.webdriver.common.by import By

url = "https://edition.cnn.com/markets/fear-and-greed"

# 브라우저를 실행합니다.
driver = webdriver.Chrome()

driver.get(url)

# 원하는 div를 찾습니다.
index_value = driver.find_element(By.CLASS_NAME, "market-fng-gauge__dial-number").text
print(f"CNN Fear and Greed Index: {index_value}")

# 브라우저 종료
driver.quit()

 

 

이때 매 실행마다 url에 해당하는 사이트가 열리고 켜지면서 실행시간이 아주 오래 걸리는 것을 확인할 수 있다.

 

3. 시간 단축

실제로 데이터를 동적로딩해야하기 때문에 이는 어쩔 수 없는 방법이다. 하지만 시간 단축을 위해서 몇가지 추가할 수 있는 옵션이 있다.

 

Seleniumheadless 모드를 사용해 브라우저 창을 열지 않고 백그라운드에서 동작하도록 할 수 있다. 이렇게 하면 화면에 표시되는 부분을 렌더링하지 않아서 속도가 빨라진다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

url = "https://edition.cnn.com/markets/fear-and-greed"

# Chrome 옵션 설정 (headless 모드)
chrome_options = Options()
chrome_options.add_argument("--headless")  # 화면을 표시하지 않음

# 브라우저를 headless 모드로 실행
driver = webdriver.Chrome(options=chrome_options)

driver.get(url)

# 원하는 div를 찾습니다.
index_value = driver.find_element(By.CLASS_NAME, "market-fng-gauge__dial-number").text
print(f"CNN Fear and Greed Index: {index_value}")

# 브라우저 종료
driver.quit()

 

 

4. api를 활용하자

그렇지만 실제로 동적으로 데이터를 받아와야 하는 입장이기 때문에 속도저하는 불가피하다.

이를 개선하기 위해서 다양한 api를 활용해야한다.

 

만약에 미국 주식 지수와 관련한 데이터라면 yfinance 라이브러리를 통해서 데이터를 제공받을 수 있다.

pip install yfinance

 

기본 예시 코드

import yfinance as yf

# VIX 지수 티커
vix = yf.Ticker("^VIX")

# 최근 종가 데이터 가져오기
vix_data = vix.history(period="1d")
print("VIX 지수:", vix_data["Close"].iloc[-1])

 

 

웹크롤링과 라이브러리를 함께 사용한 예시 코드

import sys
import requests
import yfinance as yf
import matplotlib.pyplot as plt
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel
from PyQt6.QtCore import Qt
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas

class DataFetcher:
    """데이터를 가져오는 클래스 (웹 크롤링 또는 API)"""

    @staticmethod
    def fetch_fear_greed_index():
        """CNN Fear & Greed Index 크롤링"""
        chrome_options = Options()
        chrome_options.add_argument("--headless")
        chrome_options.add_argument("--ignore-certificate-errors")

        driver = webdriver.Chrome(options=chrome_options)
        driver.get("https://edition.cnn.com/markets/fear-and-greed")

        index_value = driver.find_element(By.CLASS_NAME, "market-fng-gauge__dial-number").text
        driver.quit()

        return f"CNN Fear & Greed Index: {index_value}"

    @staticmethod
    def fetch_vix_data():
        """VIX 지수 데이터 가져오기 (지난 1개월)"""
        vix = yf.Ticker("^VIX")
        vix_data = vix.history(period="1mo")
        return vix_data

class MarketIndexApp(QWidget):
    """GUI를 관리하는 클래스"""

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Market Index Dashboard")
        self.resize(500, 400)

        self.layout = QVBoxLayout()
        
        self.fear_greed_label = QLabel("Loading Fear & Greed Index...", self)
        self.fear_greed_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.layout.addWidget(self.fear_greed_label)

        self.vix_label = QLabel("Loading VIX Index...", self)
        self.vix_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.layout.addWidget(self.vix_label)

        # 그래프 추가
        self.figure, self.ax = plt.subplots(figsize=(5, 3))
        self.canvas = FigureCanvas(self.figure)
        self.layout.addWidget(self.canvas)

        self.setLayout(self.layout)

        self.update_data()

    def update_data(self):
        """데이터를 가져와 UI에 표시"""
        self.fear_greed_label.setText(DataFetcher.fetch_fear_greed_index())

        vix_data = DataFetcher.fetch_vix_data()
        self.vix_label.setText(f"VIX 지수 (최신값): {vix_data['Close'].iloc[-1]:.2f}")

        # 그래프 업데이트
        self.ax.clear()
        self.ax.plot(vix_data.index, vix_data["Close"], marker='o', linestyle='-', color='b', label="VIX Close")
        self.ax.set_title("VIX Index Trend (Last 1 Month)")
        self.ax.set_xlabel("Date")
        self.ax.set_ylabel("VIX Value")
        self.ax.legend()
        self.ax.grid(True)

        self.canvas.draw()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MarketIndexApp()
    window.show()
    sys.exit(app.exec())
반응형
반응형

 

사실 chat gpt 에게 물어보면서 진행하면 더 편하지만, 작업 환경 셋팅을 위한 전반적인 그림이 필요하신 분이 있을 것 같아 글을 남깁니다. ㅎㅎ

 

 

1. python 설치 

 

직접 python 사이트에서 설치해도 되지만, 윈도우 작업 환경이시라면, MS store에서 python을 설치하는 것 만으로 

python 설치 & 환경변수 설정이 한번에 가능합니다.

 

 

여러가지 python 버전이 있는데, 그냥 아무거나 설치하셔도 됩니다.

사용하실 대부분의 기능들은 python3이상이라면 정상 동작 할 것이기 때문에...

 

 

2. VS code 설치 

 

아래 사이트에서 vsc 코드를 다운 받으시고 실행시키면 됩니다.

https://code.visualstudio.com/download

 

Download Visual Studio Code - Mac, Linux, Windows

Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows. Download Visual Studio Code to experience a redefined code editor, optimized for building and debugging modern web and cloud applications.

code.visualstudio.com

 

 

vsc에서 python 개발을 위한 플러그인을 설치해야하는데, 아래처럼 python extensions을 설치해주시면 됩니다. 

 

 

3. 가상 환경 설정 

 

작업할 test.py 파일 하나 만드시고 terminal에 가상환경 생성을 위한 명령어를 입력

python -m venv venv  # 가상환경 생성

 

 

그리고 가상환경 활성화를 위해서 아래 명령어를 입력

source venv/bin/activate  # (Mac/Linux) 활성화
venv\Scripts\activate  # (Windows) 활성화

 

간혹 아래 처럼 문제가 발생하는 경우가 있다.

 

단순히 power shell이 관리자 권한이 아니기에 발생하는 문제이기 때문에 아래 명령어를 입력하여 관리자 권한의 terminal로 변경해주면 된다.

 

 Set-ExecutionPolicy Unrestricted -Scope Process

 

 

그러면 아래 사진 처럼 teminal command 창 옆에 (venv)이라고 가상환경이 활성화 된 것을 확인할 수 있다.

 

 

4. PyQt 및 필수 패키지 설치

 

 

pip install PyQt6 pyqt6-tools


PyQt6: PyQt 프레임워크
pyqt6-tools: Qt Designer, uic(코드 변환기) 등 포함

 

5. 코드 작성

 

아래 처럼 기본 코드를 작성

Run - start debuging을 수행하면 창 하나가 나온다.

import sys
from PyQt6.QtWidgets import QApplication, QWidget

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("My PyQt App")  # 창 제목 설정
        self.resize(400, 300)  # 창 크기 설정 (가로x세로)
        self.show()  # 창 표시

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyApp()
    sys.exit(app.exec())  # 앱 실행

 

 

 

6. 사실 ui 작업이 많아지면 gt designer를 통해서 ui를 만드는게 효율적입니다.

https://jeongbang.tistory.com/3

 

VSCode 에서 PyQt5를 이용한 GUI 만들기

PyQt5를 이용해 파이썬 GUI 프로그래밍을 해보도록 하겠습니다. 파이썬 개발환경이 구성되어 있다는 가정하에 진행하도록 하겠습니다. VSCode에서 Python 개발환경 구성하기 파이썬 IDE에는 여러가지

jeongbang.tistory.com

 

반응형
반응형

1번 문제

Person class 를 정의하고

조건

• name, id, age, height, weight 변수선언

• __str__(self) 메서드 재정의(overriding)

 각 항목에 Person class 의 객체를 갖는 리스트 정의

 각각 객체의 필드 name, 에 “을지문덕”, “계백”, “김유신”, “강감찬“, “이순신”을 대입

 각각의 age, height, weight 대입 4. 각 인물의 이름과 나이 키 몸무게 순서로 5명의 데이터를 출력

 

class Person:
    name=""
    id=""
    age=0
    height=0
    weight=0

    def __init__(self,name,id,age,height,weight):
        self.name = name
        self.id= id
        self.age = age
        self.height = height
        self.weight = weight
        
    def __str__(self):
        return "이름: " + self.name +  "나이: " + str(self.age) + "키: " + str(self.height) + "몸무게: " + str(self.weight)
    

def main():
    manyperson = [Person("을지문덕","1",20,60,174),Person("계백","2",23,80,194),Person("김유신","3",18,59,174),Person("강감찬","4",25,78,180),Person("이순신","5",24,67,184)]
    for i in range(0,5):
        print(manyperson[i])


if  __name__ == "__main__":
    main()

 person 클래스를 생성하고 init 함수를 생성하여 변수값들을 초기화 해줍니다.( 생성자)

__str__ 메소드를 함수오버라이딩 하여 사용합니다. 객체에 대한 반환값을 문자열로 전달하는 것입니다. 

그 이후 리스트를 생성하고 반복문을 통해서 출력해주면 됩니다. 

 

 

2번 문제 

원을 나타내는 Circle라는 클래스를 설계,

 반지름 radius와  중심 좌표 cx와 cy를 통하여

 원의 넓이를 반환하는 메소드 area()와

 원의 중심을 반환하는 메소드 center () 를 구현 클래스를 완성하고 객체를 생성하여 임의의 값을 대입하여 원의 넓이와 그 중심 좌표값을 화면에 출력하시오.

 

import math


class Circle:
    radius =0
    cx=0
    cy=0

    def __init__(self, radius, cx, cy):
        self.radius = radius
        self.cx = cx
        self.cy = cy
    def area(self):
        return self.radius*self.radius*math.pi
    def center(self):
        return self.cx,self.cy
    

def main():
    radius =0
    cx=0
    cy=0
    print("정보를 입력하세요")
    radius=int(input("반지름:"))
    cx=int(input("x좌표:"))
    cy=int(input("y좌표:"))
    circle = Circle(radius,cx,cy)

    #함수호출
    print("원의 넓이: "+str(circle.area()))
    print("중심좌표: "+str(circle.center()))


if  __name__ == "__main__":
    main()

 circle 클래스를 생성하고 init 함수를 생성하여 변수값들을 초기화 해줍니다.( 생성자)

area, center 메소드를 생성해서 값을 전달해줍니다. 

main 메소드에서는 int(input())의 형태로 int형 숫자를 입력받습니다. 

math 라이브러리에 pi값을 사용하였습니다.

 

 

3번 문제 

주사위 클래스 Dice를 설계하는데 메소드에는 roll()을 구현하여 주사위를 던져 나온 숫자를 화면에 출력하는 프로그램을 작성하시오.

-단, 난수의 발생은 다음을 이용하라. -face = random.randint(1, 6)

 

import random as rd

class Dice:

    face = 0
    def __init__(self):
        self.face = 0
    
    @classmethod
    def roll(self):
        self.face = rd.randint(1,6)
        return self.face


def main():
    print("주사위를 굴리려먼 아무값이나 입력하세요")
    input()
    print("주사위값: " + str(Dice().roll()))



if  __name__ == "__main__":
    main()

 

random 라이브러리의 randint 메소드를 사용하여 난수를 생성하였습니다. 

 

 

반응형
반응형

파이썬을 사용할 때 기본으로 제공되는 라이브러리만 사용되지 않고 많은 기능을 제공하는 라이브러리들을 추가 하여 사용하게 됩니다. 이러한 라이브러리가 특정 프로젝트에서만 사용되거나 프로젝트를 배포할 때 필요한 라이브러리만 포함시켜 배포하고 싶을 경우가 있을 것입니다.

 

이럴때 사용할 수 있는것이 가상환경(virtualenv) 입니다. 가상환경을 만들고, 그 가상환경에서 라이브러리를 추가하면 추가된 라이브러리는 그 가상환경에서만 사용 되어집니다.

 

우선 패스설정이 완료되었다는 가정하에 진행하겠습니다. (path설정을 통해 파이썬이 다른 경로 폴더의 .py들을 실행시킬 수 있게 만드는 과정입니다. 

 

C:\>esay_install pip

 

파이썬 패키지 관리자인 pip.exe 파일을 Python 3.4 버전부터 미리 포함되어 있습니다. 이전 버전을 사용한다면 easy_install 프로그램을 이용해서 pip.exe 를 먼저 설치합니다.

 

여러개의 파이썬 프로젝트를 관리하면서 각 프로젝트마다 사용되는 라이브러리가 충돌을 한다던가 하는 경우에도 가상환경을 사용하여 분리할 수 있습니다.

 

가상 환경 없이 설치한 파이썬 라이브러리는 전역으로 설치됩니다. 이렇게 설치한 라이브러리는 모든 사용자와 모든 프로젝트에서 사용할 수 있습니다.

 

가상환경을 다음과 같이 설치합니다.

 

C:\>pip install virtualenv

 

이제 가상환경을 만들어 봅니다. 가상환경 파일이 생성될곳을 C:\>workspace\python 으로 하겠습니다. 다음 명령을 실행합니다.

 

C:\>workspace\python>virtualenv ProjectEnv

 

이 명령은 새 환경 ProjectEnv 를 만듭니다. 만든 새 환경을 사용하려면 먼저 활성화해야 합니다. 새환경 폴더 아래 Scripts 폴더 아래에 activate.bat 파일을 실행합니다.

 

C:\>workspace\python>cd ProjectEnv\Scripts

C:\>workspace\python\ProjectEnv\Scripts>activate

 

환경을 활성화하면 환경의 이름이 명령 프롬프트에 표시되어 현재 가상 환경에 있음을 알립니다. 가상 환경에서 라이브러리를 설치하거나 스크립트를 실행하면 그 환경에만 영향이 있습니다.

 

(ProjectEnv) C:\workspace\python\ProjectEnv\Scripts>python

>>>^Z

 

deactivate 명령으로 환경에서 떠날 수 있습니다. 다시 가상환경으로 들어가기 위해서는 activate 명령을 다시 실행하면 됩니다.

 

(ProjectEnv) C:\workspace\python\ProjectEnv\Scripts>deactivate



출처: https://offbyone.tistory.com/74 [쉬고 싶은 개발자]


 

요약정리

 

가상환경 설치 & 실행
python - m venv (가상환경 이름)
source (가상환경이름)/scrips/activate

<->deactivate

 

라이브러리 설치시 

pip install ~~ 

반응형
반응형

Python은 1991년 프로그래머인 귀도 반 로섬(Guido van Rossum)이 발표한 고급 프로그래밍 언어로, 플랫폼 독립적이며 인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어이다. 파이썬이라는 이름은 귀도가 좋아하는 코미디 〈Monty Python’s Flying Circus〉에서 따온 것입니다. 

 

즉 프로그래밍 언어입니다. 

 

가장 큰 특징은 인터프리터 언어라는 것입니다.

소스 코드를 기계어로 컴파일해서 실행파일을 만들고 실행하는 컴파일 언어와는 다르게 인터프러터 언어는 코드를 한 줄씩 읽어 내려가며 실행하는 프로그래밍 언어입니다. 인터프리터 방식을 쓰는 프로그래밍 언어는 많은데 대표적인 것이 Python입니다. 파이썬은 그 외에도 정적타입, 동적타입 모두 사용가능하다는 특성이 있습니다.

 

인터프리터 언어의 장단점

인터프리터는 실행 시마다 소스 코드를 한 줄씩 기계어로 번역하는 방식이기 때문에 실행 속도는 컴파일 언어보다 느리다. 그렇다면 왜 사용할까? 인터프리터 언어는 프로그램 수정이 간단하다는 장점이 있습니다. 컴파일러는 소스 코드를 번역해서 실행 파일을 만들기 때문에 프로그램에 수정 사항이 발생하면 소스 코드를 다시 컴파일해야 한다. 하지만 인터프리터는 소스 코드를 수정해서 바로 실행시킬 수 있습니다.

 

장점

  • 배우기 쉬워서 학습용으로 좋다.
  • 공동 작업과 유지 보수가 아주 쉽고 편해서 생산성이 높고 실사용률도 높다.
  • 읽고 쓰기 쉽다.

단점

  • 느리다.

Python 동작절차

Python의 구현체 CPython

일반적으로 python이 C로 구현되어 있다고 알려져있는데 그 구현체가 CPython이다. 가장 처음 만들어진 python의 구현체이고 Python.org 에서 다운 받으면 CPython을 받는 것입니다. 다른 구현체들과 비교해서 언급할 때 주로 CPython이라고 표기하는데 Python을 C언어로 구현한 구현체를 의미합니다.

CPython은 인터프리터 이면서 컴파일러 입니다. 우리가 작성하는 Python 코드를 bytecode로 컴파일 하고 실행합니다. 다시 말해, python 코드를 C언어로 바꾸는 것이 아니라 컴파일하여 bytecode로 바꾸고 그 다음에 interpreter(virtual machine)가 실행합니다.

(CPython 인터프리터 실행 중에 단점이 있는데 GIL(global interpreter lock)을 사용한다는 것이다. bytecode를 실행할 때에 여러 thread를 사용할 경우, 전체에 lock 을 걸어서 한번에 단 하나의 thread 만이 python object에 접근하도록 제한한 것이다. 하지만 single thread일 때는 문제가 없고 GIL의 단점을 보안하기 위한 방법들이 존재하고 있어서 GIL로 인한 불편함을 느낄 가능성은 거의 없다고 한다.)

 

Jython

python 코드를 java 바이트코드로 만들어 JVM에서 실행할 수 있도록 한다. .py 파일을 .class파일로 컴파일 한다.

 

pypy

python 자체로 구현. JIT 컴파일 도입하여 CPython 보다 빠르다.

 

(JIT(just-in-time) 컴파일 이란 프로그램을 실행하기 전에 컴파일 하는 대신, 프로그램을 실행하는 시점에서 피료한 부분을 즉석으로 컴파일하는 방식. 보통 인터프리터 언어의 성능 향상을 목적으로 도입하는 경우가 많다. 인터프리트 하면서 자주 쓰이는 코드를 캐싱하기 때문에 인터프리터의 느린 실행 속도를 개선할 수 있다. JVM에서도 바이트코드를 기계어로 번역할 때 JIT 컴파일러를 사용한다.)

 

 

 

출처:https://cjh5414.github.io/about-python-and-how-python-works/

 

Python에 대하여, Python은 어떻게 동작하는가? Python의 장단점

Jihun's Development Blog

cjh5414.github.io

 

반응형

+ Recent posts