+ Hello +

[스마트인재개발원][웹 크롤링] Selenium 모듈 | 한솥 도시락 메뉴, 가격 데이터 프레임만들기 본문

+ 스마트인재개발원 +

[스마트인재개발원][웹 크롤링] Selenium 모듈 | 한솥 도시락 메뉴, 가격 데이터 프레임만들기

journeyee 2021. 6. 8. 09:08

 

Selenium모듈
- 웹 페이지를 제어하기 위한 모듈
# 셀레니움 설치하기 
!pip install selenium

 

1. import 작업 먼저 해주기

- webdriver : 웹 페이지를 제어하기 위한 모듈 

- Keys : 컴퓨터의 키보드와 같은 역할 

- time : 쉬는 시간 부여 

from selenium import webdriver as wb
from selenium.webdriver.common.keys import Keys
import time 

2. 크롬 드라이버 실행 (크롬버전에 맞게 설치)

 

3. 크롬 드라이버를 통해 네이버 화면창 켜기

- Chrome(경로)

더보기
더보기
driver = wb.Chrome()
url = "https://www.naver.com/"
driver.get(url)

4. 검색창의 위치 알아오기

- F12(검사) > 검색창 : input 태그의 id = query 

search = driver.find_element_by_id("query")

5. 검색창에 손흥민 검색하기 (키보드)

- 검색어 입력 : .send_keys

search.send_keys("손흥민")

6. 검색하기

1) 검색버튼 클릭하기

- 검색 버튼 찾기 : .find_element_by_id()

- 검색버튼 : button 태그의 id = search_btn

search_btn = driver.find_element_by_id("search_btn")
search_btn.click()

2) 키보드로 엔터쳐서 검색하기

- .send_keys(Keys, ENTER)

search.send_keys(Keys.ENTER)

 

한솥도시락 
- 이름, 가격 정보 수집

1.  import 작업

from tqdm import tqdm_notebook as tq
from bs4 import BeautifulSoup as bs

2. 크롬브라우저를 통해 한솥 도시락 메뉴 페이지 가져오기

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

3. 페이지의 source 넘겨받기

soup = bs(driver.page_source,'lxml')

4. 메뉴 이름 가져오기

- 메뉴 : h4 태그의 class = 'h fz_01' 

- 클래스명 2개 이므로 > h.fz_01

600

 

menu= soup.select('h4.h.fz_03')

 

menu 이름만 출력

5. 가격 정보 가져오기

- 가격 : div의 class 명 item-price의 자손 

price = soup.select('div.item-price strong')

 

6. 더보기 버튼 클릭하기

- 더보기 버튼 : a 태그의 class 명 c_05

btn_more = driver.find_element_by_class_name("c_05")
btn_more.click()

- 더보기 버튼이 몇개인지 알 수 없으므로 for문을 통해 반복작업

* 예외처리 : try문에서 오류가 나면 except로 빠지기

try : 
    for i in range(50):
        btn_more.click()
        time.sleep(2) 
except :
    print("종료되었습니다.")

7. 데이터 프레임 만들기(메뉴명, 가격)

- 메뉴, 가격 list에 정보 하나씩 넣어주는 반복문 작성

menu_list = []
price_list = []

for i in range(len(menu)):
    menu_list.append(menu[i].text.strip())
    price_list.append(price[i].text.strip())
    
print(menu_list)
print(price_list)

- 딕셔너리 구조로 만들기

info = {'menu' : menu_list, 'price' : price_list}
pd.DataFrame(info)

- 결과

 

* 코드 한 번에 작성 *

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

btn_more = driver.find_element_by_class_name("c_05")

try :
    for i in range(50) :
        btn_more.click()
        time.sleep(2)
except :
    print("종료되었습니다")
    
soup = bs(driver.page_source, 'lxml')
title = soup.select('h4.h.fz_03')
price = soup.select("div.item-price > strong")
time.sleep(0.3)

title_list = []
price_list = []

for i in tq(range(len(title)) :
    title_list.append(title[i].text.strip())
    price_list.append(price[i].text.strip()+"원")
    time.sleep(0.3)
    
data = {"메뉴" : title_list, "가격" : price_list}

pd.DataFrame(data)

 

위 과정은 스마트 인재개발원에서 진행된 수업입니다.

http://www.smhrd.or.kr/

Comments