🎫

003 크롤링 데이터로 자동 재무 보고서를 만들어라 - 2

1. 기획

이번에는 엑셀로 뽑는 방법에 대해 알아보도록 하겠습니다.

2. 코드

import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QToolTip from PyQt5.QtGui import QIcon, QPixmap, QFont from PyQt5.QtCore import QCoreApplication, QDateTime import requests from bs4 import BeautifulSoup import xlsxwriter class 자동재무보고서(QWidget): def __init__(self): super().__init__() self.UI초기화() def UI초기화(self): self.제목라벨 = QLabel('(주)캣네생선', self) self.제목라벨.move(50, 50) self.제목라벨.setFont(QFont('Helvetica', pointSize=20, weight=2)) self.시총라벨 = QLabel('시가총액 : - 원', self) self.시총라벨.move(50, 110) self.시총순위라벨 = QLabel('시가총액 순위 : 위니브 월드 - 위', self) self.시총순위라벨.move(50, 140) self.현재가 = QLabel('현재가 : - 원', self) self.현재가.move(50, 170) self.최고최저가 = QLabel('52주 최고 | 52주 최저 : - 원 | - 원', self) self.최고최저가.move(50, 200) self.배당율 = QLabel('배당율 : - %', self) self.배당율.move(50, 230) self.오픈날짜 = QLabel('오픈날짜 : 2020년 1월 1일', self) self.오픈날짜.move(50, 260) self.오픈된날짜 = QLabel('오픈된날짜 : - 일', self) self.오픈된날짜.move(50, 290) self.매출비용순익 = QLabel('매출/비용/순익 : -원/-원/-원', self) self.매출비용순익.move(50, 320) 작성버튼 = QPushButton('재무 보고서 작성', self) 작성버튼.move(30, 430) 작성버튼.resize(340, 50) 작성버튼.clicked.connect(self.write) 엑셀버튼 = QPushButton('엑셀 보고서 작성', self) 엑셀버튼.move(30, 490) 엑셀버튼.resize(340, 50) 엑셀버튼.clicked.connect(self.excel) 종료버튼 = QPushButton('프로그램 종료', self) 종료버튼.move(30, 550) 종료버튼.resize(340, 50) 종료버튼.clicked.connect(self.close) self.대표이미지 = QLabel(self) self.대표이미지.setPixmap(QPixmap('img/weniv-licat.png').scaled(35, 44)) self.대표이미지.move(10, 10) self.setWindowTitle('재무 보고서를 만들어라!') self.setWindowIcon(QIcon('img/weniv-licat.png')) self.setGeometry(800, 300, 400, 630) self.show() def write(self): url = 'http://paullab.co.kr/stock.html' response = requests.get(url) response.encoding = 'utf-8' html = response.text soup = BeautifulSoup(html, 'html.parser') values = soup.select('.tables td') # print(values) self.시총라벨값 = values[0].text self.시총라벨.setText(f'시가총액 : {values[0].text}') self.시총라벨.resize(400, 20) self.시총순위라벨값 = values[1].text self.시총순위라벨.setText(f'시가총액 순위 : {values[1].text}') self.시총순위라벨.resize(400, 20) self.현재가값 = values[3].text self.현재가.setText(f'현재가 : {values[3].text}') self.현재가.resize(400, 20) s = values[4].text.strip().replace('\n', '').split('l') # print(s) self.최고최저가값 = f'{s[0]} | {s[1]}' self.최고최저가.setText(f'52주 최고 | 52주 최저 : {s[0]} | {s[1]}') self.최고최저가.resize(400, 20) i = values[5].text.strip() # print(i) self.배당율.setText(f'배당율 : {i}') self.배당율.resize(400, 20) self.매출값 = values[6].text self.비용값 = values[7].text self.순익값 = values[8].text self.매출비용순익.setText(f'매출/비용/순익 :\n{values[6].text}\n / {values[7].text}\n / {values[8].text}') self.매출비용순익.resize(400, 80) day = QDateTime(2020, 1, 1, 00, 00, 00) # print(type(day)) # print(dir(day)) day = str(day.daysTo(QDateTime.currentDateTime())) self.오픈된날짜계산값 = day self.오픈된날짜.setText(f'오픈된 날짜 : {day} 일') self.오픈된날짜.resize(400, 20) def excel(self): workbook = xlsxwriter.Workbook('재무보고서.xlsx') worksheet = workbook.add_worksheet('보고서') #셀 안에 문자값 입력하기 worksheet.write('A1', '시가총액') worksheet.write('A2', '시가총액순위') worksheet.write('A3', '현재가') worksheet.write('A4', '52주최고|최저') worksheet.write('A5', '오픈날짜') worksheet.write('A6', '오픈된날짜') worksheet.write('A7', '매출') worksheet.write('A8', '비용') worksheet.write('A9', '순익') worksheet.write('B1', self.시총라벨값) worksheet.write('B2', self.시총순위라벨값) worksheet.write('B3', self.현재가값) worksheet.write('B4', self.최고최저가값) worksheet.write('B5', '2020. 1. 1.') worksheet.write('B6', self.오픈된날짜계산값) worksheet.write('B7', self.매출값) worksheet.write('B8', self.비용값) worksheet.write('B9', self.순익값) workbook.close() def close(self): return QCoreApplication.instance().quit() 프로그램무한반복 = QApplication(sys.argv) 실행인스턴스 = 자동재무보고서() 프로그램무한반복.exec_()
 

3. 상세 내용

엑셀라이터는 엑셀을 다룰 수 있는 파이썬 모듈로 다른 라이브러리와 비교해보더라도 훌륭하게 엑셀을 다를 수있는 모듈입니다. 자세한 비교내용, 모듈의 사용법은 아래 무료책으로 공개해두었습니다. 혹시 더 궁금하신 분은 아래 내용을 참고해주세요.
 
해당 내용은 좀 더 상세한 영상강의로도 나와 있습니다.
 
우선 엑셀라이터를 설치해주세요! PowerShell 창에서 입력하셔도 좋고, 만약 Visual Studio Code를 사용하고 있으시다면 Terminal 창에서 입력하셔도 좋습니다.
pip3 install xlsxwriter
 

Excel의 구성

Excel에 개념인 Workbook, Worksheet, Cell 등이 이 모듈에서 그대로 사용됩니다.
  1. Workbook
    1. 하나의 Excel 파일이라 생각하시면 됩니다. Workbook 안에는 Worksheet 생성이 가능합니다. 또한 Excel과 같이 여러 Worksheet를 생성하여 작업이 가능합니다.
  1. Worksheet
    1. Worksheet를 생성해야 그 안에 포함되는 Cell에 값을 입력하는 등의 작업이 가능합니다. 아래와 같이 엑셀 좌측 하단에 있는 Sheet입니다.
      notion imagenotion image
  1. Cell
    1. Worksheet에는 Column (열)과 Row(행)으로 구분이 되어있습니다. 이를 통해서 각각의 칸에 접근할 수 있는데 이단위를 Cell이라고 합니다
 
아래와 같이 .py 파일로 만들어 실행시켜보세요!
import xlsxwriter #엑셀 파일 생성하기 workbook = xlsxwriter.Workbook('test.xlsx') #파일 안에 워크 시트 생성하기 worksheet = workbook.add_worksheet('jejucodingcamp') #셀 안에 문자값 입력하기 worksheet.write('A1', 'A') worksheet.write('B1', 'B') worksheet.write('C1', 'C') worksheet.write('D1', 'D') worksheet.write('E1', 'E') #셀 안에 숫자값 입력하기 worksheet.write('A2', 1) worksheet.write('B2', 2) worksheet.write('C2', 3) worksheet.write('D2', 4) worksheet.write('E2', 5) #좌표로 셀 안에 문자값 입력하기 #worksheet.write(row값, column값, 원하는 입력 값) worksheet.write(2, 0, 'a') worksheet.write(2, 1, 'b') worksheet.write(2, 2, 'c') worksheet.write(2, 3, 'd') worksheet.write(2, 4, 'e') #좌표로 셀 안에 숫자값 입력하기 worksheet.write(3, 0, 10) worksheet.write(3, 1, 20) worksheet.write(3, 2, 30) worksheet.write(3, 3, 40) worksheet.write(3, 4, 50) workbook.close()
 
이제 크롤링한 데이터를 엑셀 파일로 만들어보십시오!

4. 실행 화면

 
notion imagenotion image