안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.
오늘은 지난번 공유드렸던 아래의 프로젝트를 Pyqt5 패키지를 이용해 GUI로 사용할 수 있도록 만들어보았습니다.
개인적 필요에 의해 만들었던 프로그램인데, 회사의 인사팀에 속해 계신분들은 유용하시지 않을까 생각되네요.
2021.03.29 - [파이썬 프로젝트] - [파이썬 프로젝트] 잡플래닛 리뷰 정보 크롤링 코드 공유
우선 전체 코드는 아래와 같으며, 어떻게 사용하는지는 아래에서 설명드리겠습니다.
사실 Pyinstaller라는 패키지를 이용해 exe 실행 파일로 만들어서 공유드리려 했으나, 관련 패키지를 잔뜩 import 해서인지 프로그램의 크기가 190MB를 넘어가서 그냥 코드로 공유드립니다.
#관련 패키지 import
import time
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5 import uic
#UI파일 연결 코드
UI_class = uic.loadUiType("MyGui.ui")[0]
#화면을 띄우는데 사용되는 Class 선언
class WindowClass(QMainWindow, UI_class) :
def __init__(self) :
super().__init__()
self.setupUi(self)
# GUI의 버튼을 눌렀을 때 아래 정의한 ReviewCrawlingFunction이 실행됨
self.pushButton.clicked.connect(self.ReviewCrawlingFunction)
#이하 지난 프로젝트 조금 개선해서 메소드 안에 넣어줌
def ReviewCrawlingFunction(self) :
# 크롬 드라이버 실행 및 잡플래닛 로그인 페이지 접속
driver = webdriver.Chrome("크롬드라이버가 위치하는 경로 ex)/Users/codingkindergarten/Desktop/chromedriver")
driver.get("https://www.jobplanet.co.kr/users/sign_in?_nav=gb")
driver.implicitly_wait(10)
#입력 받은 정보로 로그인
login_id = driver.find_element_by_css_selector("input#user_email")
login_id.send_keys(self.lineEdit_ID.text())
login_pw = driver.find_element_by_css_selector("input#user_password")
login_pw.send_keys(self.lineEdit_PW.text())
login_id.send_keys(Keys.RETURN)
driver.implicitly_wait(10)
time.sleep(1) #implicityly_wait로 잘 작동하지 않아서 추가함
#원하는 회사의 리뷰 페이지까지 이동
company = driver.find_element_by_css_selector("input#search_bar_search_query")
company.send_keys(self.lineEdit_CN.text())
company.send_keys(Keys.RETURN)
driver.implicitly_wait(15)
driver.find_element_by_css_selector("a.tit").click()
driver.implicitly_wait(15)
driver.find_element_by_css_selector("button.btn_close_x_ty1 ").click()
driver.implicitly_wait(15)
review_cnt_raw = driver.find_elements_by_css_selector("span.num.notranslate")[1]
review_cnt = int(review_cnt_raw.text)
review_page = int(review_cnt/5) + 1
#크롤링한 정보를 담을 리스트명 정의
list_div = []
list_cur = []
list_date =[]
list_stars = []
list_summery = []
list_merit = []
list_disadvantages = []
list_managers =[]
#원하는 회사의 직무/근속여부/일시/요약/평점/장점/단점/경영진에게 바라는 점 크롤링 (for문으로 반복)
for i in range(review_page):
#직무, 근속여부, 지역 ,일시
user_info = driver.find_elements_by_css_selector("span.txt1")
#한 페이지 안의 리뷰 갯수
#한 페이지에 정보 5set씩 나옴. 마지막 페이지는 5개 미만일 수 있으므로 count 변수를 반복횟수로 넣어줌.
count = int(len(user_info)/4)
list_user_info = []
for j in user_info:
list_user_info.append(j.text)
for j in range(count):
a = list_user_info[4*j]
list_div.append(a)
b = list_user_info[4*j+1]
list_cur.append(b)
c = list_user_info[4*j+3]
list_date.append(c)
#별점
stars = driver.find_elements_by_css_selector("div.star_score")
for j in stars:
a = j.get_attribute('style')
if a[7:9] == '20':
list_stars.append("1점")
elif a[7:9] == '40':
list_stars.append("2점")
elif a[7:9] == '60':
list_stars.append("3점")
elif a[7:9] == '80':
list_stars.append("4점")
else:
list_stars.append("5점")
#요약 정보
summery = driver.find_elements_by_css_selector("h2.us_label")
for j in summery:
list_summery.append(j.text)
#장점, 단점, 경영진에게 바라는 점
list_review = []
review = driver.find_elements_by_css_selector("dd.df1")
for j in review:
list_review.append(j.text)
for j in range(count): #한 페이지에 정보 5set씩 나옴. 마지막 페이지는 5개 미만일 수 있으므로 count 변수를 반복횟수로 넣어줌.
a = list_review[3*j]
list_merit.append(a)
b = list_review[3*j+1]
list_disadvantages.append(b)
c = list_review[3*j+2]
list_managers.append(c)
# 다음 페이지 클릭 후 for문 진행, 끝 페이지에서 다음 페이지 클릭 안되는 것 대비해서 예외처리 구문 추가
try:
driver.find_element_by_css_selector("a.btn_pgnext").click()
driver.implicitly_wait(15)
time.sleep(2) #implicityly_wait로 잘 작동하지 않아서 추가함
except:
pass
# step8.pandas 라이브러리로 표 만들기
total_data = pd.DataFrame()
total_data['날짜'] = pd.Series(list_date)
total_data['직무'] = pd.Series(list_div)
total_data['재직여부'] = pd.Series(list_cur)
total_data['별점'] = pd.Series(list_stars)
total_data['요약'] = pd.Series(list_summery)
total_data['장점'] = pd.Series(list_merit)
total_data['단점'] = pd.Series(list_disadvantages)
total_data['경영진에게 바라는 점'] = pd.Series(list_managers)
# step9.엑셀 형태로 저장하기
total_data.to_excel(self.lineEdit_CN.text() + "_잡플래닛 리뷰.xls" ,index=True)
# step10.크롬 드라이버 종료
driver.quit()
if __name__ == "__main__" :
#QApplication : 프로그램을 실행시켜주는 클래스
app = QApplication(sys.argv)
#WindowClass의 인스턴스 생성
myWindow = WindowClass()
#프로그램 화면을 보여주는 코드
myWindow.show()
#프로그램을 이벤트루프로 진입시키는(프로그램을 작동시키는) 코드
app.exec_()
<코드를 사용하기 위한 필요조건>
1. 파이썬과 관련 패키지가 설치되어 있을 것
2021.03.02 - [파이썬 기초/개발환경 구축] - [코딩유치원] 파이썬 개발환경 구축 1편 (파이썬 VS 아나콘다)
2. 잡플래닛 계정과 회사 리뷰를 최소 1개 작성할 것 (리뷰를 작성해야만 모든 리뷰가 조회 가능)
3. QtDesigner를 이용해서 아래와 같이 GUI 구성하고, Ui 파일을 파이썬 파일과 같은 폴더에 넣기
(아래에 제가 만든 ui파일을 파일첨부로 올려두었으니, 다운 받아서 사용하세요)
GUI를 커스터마이징 할 시, designer의 objectname과 파이썬 코드의 objectname을 일치 시킬 것.
<크롤링 결과>
테스트로 네이버랩스의 리뷰를 크롤링 해보았습니다.
크롤링이 끝나면 파이썬 파일과 같은 경로에 엑셀 파일이 생성됩니다.
리뷰 17개가 모두 잘 받아진 것을 확인할 수 있습니다.
'파이썬 패키지 > GUI 프로그램' 카테고리의 다른 글
PyQt를 상업적으로 사용하고 싶다면? 정답은 PySide6 (0) | 2022.01.05 |
---|---|
[Python/Pyqt5] QWidget, QMainWindow, Qdialog 차이 총정리 (ft. Modal과 Modeless) (0) | 2021.12.06 |
[파이썬 GUI 프로그래밍] PyQt5 기초_3강.Qt Designer로 내마음대로 GUI 구성하기 (0) | 2021.05.10 |
[파이썬 GUI 프로그래밍] PyQt5 기초_2강.위젯의 종류, 시그널과 슬롯, 이벤트 루프 (0) | 2021.05.08 |
[파이썬 GUI 프로그래밍] PyQt5 기초_1강.PyQt의 개념과 창 만들기 (창 이름, 사이즈, 변경 및 아이콘 삽입) (1) | 2021.05.07 |