본문 바로가기
Portfolio & Toy-Project

프로젝트 : 부산항만공사 서비스 제안관련 데이터분석-3

by Mr.DonyStark 2024. 3. 11.

ㅁ 프로젝트 산출물 :  https://busanportservice.streamlit.app/

 

Abstract

Busan Port

busanportservice.streamlit.app

 

ㅁ선용품 관련 품목선정 중 식품카테고리에 대한 워드 크라우드 활용 데이터 크롤링

  ○ 셀레니움 → 크롤링 활용

  ○ 뷰티풀숲 → 크롤링 활용

  ○ re  전처리 활용

  ○ pandas → 전처리 활용

from selenium import webdriver #Selenium의 웹 드라이버를 사용하기 위한 모듈을 임포트
from selenium.webdriver.common.by import By #Selenium에서 사용하는 By 클래스를 임포트합. 웹 요소를 검색하는데 사용.
from selenium.webdriver.common.keys import Keys #키보드 입력 제어를 위해 Keys 클래스 임포트
from selenium.webdriver.chrome.service import Service #Chrome 드라이버 서비스를 사용하기 위한 모듈 임포트
from selenium.webdriver.chrome.options import Options #Chrome 드라이버 옵션을 설정하기 위한 클래스 임포트
from webdriver_manager.chrome import ChromeDriverManager #Chrome 드라이버를 자동으로 설치 및 관리하는데 사용되는 드라이버 매니저 임포트
from bs4 import BeautifulSoup #Beautiful soup 크롤링을위해
import pandas as pd
import time

myOption = Options() #옵션객체 변수지정
myOption.add_argument("--start-maximized") #크롬 드라이버 창 최대화
myOption.add_argument("--incognito") #크롬 드라이버 시크릿모드로 진행
myOption.add_experimental_option("excludeSwitches", ["enable-automation"]) #드라이버 시작시 불필요문구 미표시되도록 설정
myOption.add_experimental_option("excludeSwitches", ["enable-logging"]) #터미널상의 불필요문구 미표시되도록 설정
myOption.add_experimental_option("detach", True) #드라이버 자동꺼짐 방지

#드라이버 세팅
myService = Service(ChromeDriverManager().install()) #크롬드라이버 설치
myDriver = webdriver.Chrome(service=myService, options=myOption) #드라이버 서비스 및 옵션 지정

targetUrl = "https://www.tasteatlas.com/best-rated-meat-dishes-in-korea"
myDriver.get(targetUrl)

#추출한 데이터를 저장할 리스트
useTitle = list()
useContent = list()

#소제목 추출 / find_elements를 활용하여 반환된 리스트를 반복문으로 요소추출 후 다른 리스트에 저장
txtTitle = myDriver.find_elements(By.CLASS_NAME, value="h1.h1--bold")
for i in txtTitle:
    useTitle.append(i.text)

#소제목별 내용 추출 / find_elements를 활용하여 반환된 리스트를 반복문으로 요소추출 후 다른 리스트에 저장    
txtContent = myDriver.find_elements(By.CLASS_NAME, value="read-more--hidden.ng-scope")
for v in txtContent:
    useContent.append(v.text)

#저장된 데이터 길이 확인
print(len(useTitle)) # 22
print(len(useContent)) #10 : 사이트를 보면 10위까지만 텍스트가있음

myDriver.quit()
print("드라이버 종료")

#사이트 데이터 생성을 위한 전처리
hrefUseTitle = useTitle
hrefUseTitle[0] = "chikin"
hrefUseTitle[4] = "dak-galbi"
hrefUseTitle[11] = "andong-jjimdak"
hrefUseTitle[12] = "Jeyuk-bokkeum"
hrefUseTitle[17] = "dwaeji-galbi"
hrefUseTitle = hrefUseTitle[:-1] #view more 제거를 위해 코딩
hrefUseTitle
#위 키워드를 바탕으로 사이트별 기사내용추출
anotherPages = list()
for s in range(len(hrefUseTitle)):
    another = f"https://www.tasteatlas.com/{hrefUseTitle[s]}"
    anotherPages.append(another)
print(anotherPages)
print(len(anotherPages))

#데이터 저장 리스트 생성
coreContentList = list()
#드라이버 세팅
for f in range(len(anotherPages)):
    #옵션
    myOption = Options() #옵션객체 변수지정
    myOption.add_argument("--start-maximized") #크롬 드라이버 창 최대화
    myOption.add_argument("--incognito") #크롬 드라이버 시크릿모드로 진행
    myOption.add_experimental_option("excludeSwitches", ["enable-automation"]) #드라이버 시작시 불필요문구 미표시되도록 설정
    myOption.add_experimental_option("excludeSwitches", ["enable-logging"]) #터미널상의 불필요문구 미표시되도록 설정
    myOption.add_experimental_option("detach", True) #드라이버 자동꺼짐 방지
    #드라이버실행
    myDriver = webdriver.Chrome(service=myService, options=myOption) #드라이버 서비스 및 옵션 지정
    print(f"{f} 차\t 시작")
    myDriver.get(anotherPages[f])
    time.sleep(2)
    
    #기사 추출 / find_elements를 활용하여 반환된 리스트를 반복문으로 요소추출 후 다른 리스트에 저장    
    coreContent = myDriver.find_elements(By.CLASS_NAME, value="card__main")
    for i in coreContent:
        corestory = i.text
        coreContentList.append(corestory)
        time.sleep(2)
    myDriver.quit()
    print(f"{f} 차\t 종료")
    
final_data = pd.DataFrame({
        "제목" : hrefUseTitle,
        "내용" : coreContentList,
        "주소" : anotherPages
        })

final_data.to_csv("failWebCsv.csv", encoding="utf-8-sig")