새로 시작하는 TIL

2025 02 05 TIL

noc777 2025. 2. 2. 13:08

지난번에 파이썬을 통해 데이터베이스의 테이블에 크롤링한 데이터를 집어넣는 것을 진행하였었다.

이번에 기능을 완성하고 나서 내용을 적어본다.

 

import requests
from bs4 import BeautifulSoup
import pymysql.cursors

response = requests.get('https://영화예매사이트 주소')
html = response.text
soup = BeautifulSoup(html,'html.parser')

conn = pymysql.connect(데이터베이스 요소 항목은 보안으로 인해 가림)

#DB에 보낼 정보
movieRank = 0
movieName = ''
supervision = ''
genre = ''
reservationRate = 0.00

try:
    with conn.cursor() as cursor:
        print("테이블의 데이터가 존재여부 확인중...")
        sql = "select MovieRank from movieInfo;"
        cursor.execute(sql)

        result = cursor.fetchall()

        if result:
            print("테이블에 존재하는 데이터 발견 후 삭제")
            sql = "Delete From movieInfo WHERE MovieRank >=1;"
            cursor.execute(sql)
            conn.commit()

        for tag in soup.select("li[class=movieBox-item]"):

            title = tag.select("div[class=movie-title] a")[0]

            #세부정보 사이트 html 요청
            details= title.get('href')
            detailsHtml = requests.get("https://영화예매사이트주소/%s" % details).text
            detailsSoup = BeautifulSoup(detailsHtml,'html.parser')

            #영화랭킹
            movieRank = int(tag.select("p[class='rank realtime_rank23']")[0].text)
            print(movieRank)

            #영화이름
            movieName = title.text
            print(movieName)

            #감독이름
            supervisionSpace = detailsSoup.select("li[class=actor__item]")[0]
            supervision = supervisionSpace.select("p[class=name]")[0].text
            print(supervision)

            #장르
            genreText=detailsSoup.select("div[class='text movie_info'] dt")[1].text
            genre=genreText.split("/")[0].strip()
            print(genre)

            #예매율
            reservationRate= float(tag.select("li[class=ticketing] span")[0].text.strip('%'))
            print(reservationRate)

            #접속한 DB에 쿼리 적용

            sql = "INSERT INTO movieInfo(MovieRank,MovieName,Supervision,Genre,ReservationRate)VALUES(%d,'%s','%s','%s',%f);"%(movieRank,movieName,supervision,genre,reservationRate)
            cursor.execute(sql)
            conn.commit()
except Exception as e:
    conn.rollback()
    print("예외가 발생하여 변경사항 롤백:",e)
finally:
    conn.close()
    print("데이터베이스 연결해제")

 

해당 스크립트에서 requests 패키지, bs4 패키지,pymysql 패키지를 사용하였다.

requests 는 웹사이트에 요청하여 구성요소들을 받아오기 위해 사용

bs4 는 bs4 패키지의 클래스 Beautifulsoup를 이용하였다. BeautifulSoup 의 생성자를 통해서 requests 에서 받아온 요소들을 문자열로 변환해주고 해당 문자열을 html 속성으로 변환시켜주었다.  

pymysql 은 mysql 이나 heidisql 의 데이터베이스에 접근하기 위한 목적으로 사용되었다.

 

html 의 구성을 전부 이해하진 못하였지만 html은 일정한 규칙으로 구성요소들을 내포함을 알았다. 

Beautifulsoup의 select를 통해 공유되는 속성들을 묶어 리스트로 반환하고 해당 리스트를 for문을 통해 

열람하며 필요한 요소들을 가져오는 형태이다. 

 

with 구문은 file을 열람하거나 특정 db등에 접속하고 나서 작업이 마무리 될 때 자동으로 연결을 해제시켜준다. 

c#의 블록과 비슷한 개념으로 보인다.   

 

pymysql의 connect를 통해 연결된 객체인 conn은 connection이라는 클래스 객체이다. 

connection의 cursor 메서드를 통해 생성된 cursor 객체는 쿼리를 수행하고 수행한 결과를 받아오는 역할을 한다.

excute를 통해 쿼리를 수행하고 검색이아닌 변경사항엔 commit을 사용하여 적용을 시켜야한다. 

만일 변경사항을 적용하고 싶지않다면 rollback을 사용한다. 

또한 select 쿼리를 통해 얻은 검색결과는 fetchall 메서드를 통해 받아오는 것이 가능하다. 

약간 깃허브의 사용법과 비슷한 감이 있다. 

 

c#의 try catch 문처럼 예외처리를 하는 것을 try except 를 활용한다. finally는 예외여부와 상관없이 무조건 수행되어야하는 항목이 집어넣어진다.  

 

이전에 프로젝트에서 쉐이더 그래프를 조작하는 것이 미숙한 것이 생각나서 강의를 하나 수강해보기로 하였다. 

유니티에서 쉐이더그래프가 어떻게 만들어지고 원리를 조금이나마 알게되면 해당 기능을 사용하는 요소들을 조금이나마 

이해할 수 있을 것 같다는 취지였다.  

'새로 시작하는 TIL' 카테고리의 다른 글

2025 02 09 TIL  (0) 2025.02.09
2025 01 26 TIL  (0) 2025.01.26
2025 01 23 TIL  (0) 2025.01.23
2025 01 22 TIL  (0) 2025.01.22