관리 메뉴

DeseoDeSeo

[Crawling] 도시락 업체 데이터 수집 본문

Python

[Crawling] 도시락 업체 데이터 수집

deseodeseo 2023. 8. 28. 17:12

 

브라우저 및 컴퓨터용 키보드. 선택자의 구분자 역할 하는 라이브러리 불러오기
from selenium import webdriver as wb
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

 

1. 브라우저를 실행하고 -> 한솥 사이트로 이동
driver = wb.Chrome()
driver.get("https://www.hsd.co.kr/menu/menu_list")

 

2. 상품이름 수집
title = driver.find_elements(By.CSS_SELECTOR,".h.fz_03")
for i in title:
    print(i.text)

 

3. 상품가격 수집
price = driver.find_elements(By.CSS_SELECTOR," div > div.item-text > div > strong")
for i in price:
    print(i.text)
- 보기 버튼 클릭
# 더보기를 클릭해야 최신의 데이터를 받아 올 수 있다.
btn = driver.find_element(By.CSS_SELECTOR,".c_05")
btn.click()

 

# 더보기를 끝까지 반복
for i in range(15):
    btn = driver.find_element(By.CSS_SELECTOR,".c_05")
    btn.click()

 

예외처리 
: 코드를 실행하다가 에러가 나는 경우 에러가 아닌 다른 코드를 실행함.

# selenium을 통해서 요청을 보낼때는 반드시 사람처럼 보이게 코드를 만들어야함.
# 컴퓨터는 요청을 매우 빠르게 처리하기 때문에
# 클라이언트가 서버에게 무리한 요청을 하면 서버는 부하를 느낌. 이로인해, ip차단, 반응하기 전에 오류가 남.
# time.sleep("초") -> 해당하는 시간만큼 코드가 멈춤.
# 반드시 요청과 응답이 있는경우에 사용하는걸 권장함.
import time
try: 
    # 에러가 나기 전까지 실행 할 코드
    for i in range(15):
        btn = driver.find_element(By.CSS_SELECTOR,".c_05")
        btn.click()
        time.sleep(3)  # 3초 쉬고 나서 다음 실행함. 반드시 요청과 응답 사이에 넣음.
except:
    # 에러가 났을 때 실행 할 코드
    print("더보기가 없습니다!")

 

수집된 요소를 텍스트 데이터만 추출
title_list=[]
price_list=[]
for i in range(len(title)):
    title_list.append(title[i].text)
    price_list.append(price[i].text)
title_list

 

 

< 한 셀에 코드 합치기 >

- 프로그램(실행파일) 제작할 때는, 반드시 코드를 한 cell에 합쳐야한다.

# 브라우저의 역할을 해주는 라이브러리
from selenium import webdriver as wb

#컴퓨터용 키보드 불러오기

from selenium.webdriver.common.keys import Keys

# 선택자의 구분자 역할을 해주는 라이브러리

from selenium.webdriver.common.by import By 
import pandas as pd
import time

# 1. 브라우저를 실행하고 -> 한솥 사이트로 이동
driver = wb.Chrome()
driver.get("https://www.hsd.co.kr/menu/menu_list")
time.sleep(5)

try: 
    # 에러가 나기 전까지 실행 할 코드
    for i in range(15):
        btn = driver.find_element(By.CSS_SELECTOR,".c_05")
        btn.click()
        time.sleep(3)  # 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
hansot.to_csv("한솥.csv", encoding ="euc-kr")

#------------ 데이터 활용 단계

< 크롤링을 하는 프로세스 >

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

 


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

'Python' 카테고리의 다른 글

[Python] 네이버 지도 데이터 수집  (0) 2023.08.29
[Machine Learning] iris_knn분류실습  (0) 2023.08.28
[Crawling] Selenium 라이브러리  (0) 2023.08.28
[Python] pandas 추가  (0) 2023.08.25
[Machine Learning] BMI 학습  (0) 2023.08.25