본문 바로가기
Study/Python

[Python] 크롤링 (한솥도시락 메뉴 수집해보기)

by YoungD 2023. 9. 1.
from selenium import webdriver as wb
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
In [1]:

 

# 1. 브라우저를 실행하고 한솥사이트로 이동
driver = wb.Chrome()
driver.get("https://www.hsd.co.kr/menu/menu_list")
In [2]:
# 2. 상품이름 수집
title = driver.find_elements(By.CSS_SELECTOR, ".h.fz_03")
for i in title :
    print(i.text)
 
In [3]:
# 3. 상품가격 수집
price = driver.find_elements(By.CSS_SELECTOR," div > div.item-text > div > strong")
for i in price :
    print(i.text)
 
In [4]:
len(title)
Out[4]:
64
In [5]:
# 더보기 버튼 클릭
# 더보기를 클릭해야 최신의 데이터를 받아올 수 있다.
btn = driver.find_element(By.CSS_SELECTOR, ".c_05")
btn.click()
In [6]:
# 더보기를 끝까지 반복
for i in range(15):
    btn = driver.find_element(By.CSS_SELECTOR, ".c_05")
    btn.click()
 

예외처리

  • 코드를 실행하다가 에러가 나는 경우 에러가 아닌 다른 코드를 실행
  • try = 에러가 나기 전까지 실행할 코드
  • except = 에러가 났을 때 실행할 코드
In [7]:
# 셀레니움을 통해서 요청을 보낼때는 사람처럼 코드를 짜기
# 컴퓨터는 요청을 매우 빠르게 처리하기 때문에
# 클라이언트가 서버에게 무리한 요청을 하면 서버는 부하를 느낌 -> 아이피 차단, 반응하기 전 오류가 남
# time.sleep("초") -> 해당하는 시간만큼 코드가 멈춘다
# 반드시 요청과 응답이 있는 경우에 사용하는 걸 권장
import time 
In [8]:
try :
    # 에러가 나기 전까지 실행할 코드
    for i in range(15):
        btn = driver.find_element(By.CSS_SELECTOR, ".c_05")
        btn.click()
        time.sleep(3)
except :
    # 에러가 났을 때 실행할 코드
    print("더보기가 없습니다.")
더보기가 없습니다.
In [9]:
title = driver.find_elements(By.CSS_SELECTOR, ".h.fz_03")
len(title)
Out[9]:
102
In [10]:
# 수집된 요소를 텍스트 데이터만 추출
title_list = []
price_list = []
for i in range(len(title)) :
    title_list.append(title[i].text)
    price_list.append(price[i].text)
 

한셀에 코드 합치기

  • 프로그램(실행파일) 제작할 때는 반드시 코드를 한셀에 합쳐야 한다
In [11]:
from selenium import webdriver as wb
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd

driver = wb.Chrome()
driver.get("https://www.hsd.co.kr/menu/menu_list")

try :
    # 에러가 나기 전까지 실행할 코드
    for i in range(15):
        btn = driver.find_element(By.CSS_SELECTOR, ".c_05")
        btn.click()
        time.sleep(3)
except :
    # 에러가 났을 때 실행할 코드
    print("더보기가 없습니다.")
# -- 데이터 준비 단계 --
    
title = driver.find_elements(By.CSS_SELECTOR, ".h.fz_03")
price = driver.find_elements(By.CSS_SELECTOR, "div > div.item-text > div > strong")
# -- 데이터 수집 단계 --

title_list = []
price_list = []
for i in range(len(title)) :
    title_list.append(title[i].text)
    price_list.append(price[i].text)
# -- 데이터 가공 단계 --

dic = {"상품명" : title_list, "가격정보" : price_list}
pd.DataFrame(dic)
hansot = pd.DataFrame(dic)
hansot.to_csv("한솥.csv",encoding="euc-kr")
# -- 데이터 활용 단계 ---
더보기가 없습니다.

 

크롤링하는 프로세스

  • 데이터 준비, 데이터 수집, 데이터 가공, 데이터 활용
  • 데이터 준비 = 완벽한 데이터를 수집하기 위해서 화면 준비를 하는 단계 (더보기 버튼을 다 누르는 행위, 화면 스크롤을 최하단까지 이동)
  • 데이터 수집 = 준비된 데이터(html)에서 필요한 요소를 수집
  • 데이트 가공 = 수집된 데이터(요소)를 필요한 컨텐츠, 속성만 가공
  • 데이터 활용 = 가공된 데이터를 표, 파일로 제작

 

크롤링 팁

  • 반드시 selenium을 활용할 때는 'Cell Run All' 금지!
  • 항상 사람처럼 코딩 작성
  • 요청과 응답 사이에는 반드시 시간을 부여
  • tip!
  • time.sleep vs implicitly_wait
  • time : 무조건 내가 설정한 시간만큼 코드를 중단
  • implicitly_wait : 설정한 시간보다 완료된 시간이 짧으면 완료가 된 기점으로 코드가 진행 -> 네크워크 환경이 좋을 때는 장점