파이썬/웹 크롤링

[웹크롤링] Selenium 모듈과 tqdm라이브러리

취준생코린이 2021. 6. 4. 11:09
728x90

 

라이브러리랑 모듈의 차이

  • 모듈이란 함수나 변수 또는 클래스를 모아 놓은 파일이다. 모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다. 다른 사람들이 이미 만들어 놓은 모듈을 사용할 수도 있고 우리가 직접 만들어서 사용할 수도 있다.
  • 파이썬 라이브러리는 파이썬을 설치할 때 자동으로 설치되는 파이썬 모듈을 말한다.

 

Selenium 모듈

  • 웹페이지를 제어하기 위한 모듈

selenium모듈은 설치가 따로 필요하다.

!pip install selenium 를 주피터노트북에 넣어 실행하면 설치가 된다.

 

selenium모듈에 있는 함수들을 임폴드해주자!

  • webdriver = 웹페이지를 제어하기 위한 모듈 >> 웹 그자체가 됨!
  • Keys = 컴퓨터의 키보드와 같은 역할 모듈, 컴퓨터가 쓸 키보드 
  • time = 컴퓨터한테 쉬는 시간을 부여, 컴퓨터한테 클릭 텀 시간주기

 

먼저 파이썬 파일을 실행 시키기 전에 크롬 드라이버를 설치해주자.

내 크롬 버전과 같은 크롬 드라이버를 다운받아서 지금 Day3파일이 있는 폴더랑 같은 위치에 넣으면 된다.

크롬 드라이버는 크롬창에서 크롬드라이버 검색을 하면 되고

내 크롬 버전 확인은 설정창에서 chrome정보 버튼을 누르면 된다.

 

 

크롬 드라이버를 설치했으면 이제 파이썬에서 selenium 모듈을 활용해서 웹페이지에서 크롤링을 해보자!

 

아래 코드는 네이버 사이트에서 손흥민을 검색해보는 연습이다.

!pip install selenium

# webdriver = 웹페이지를 제어하기 위한 모듈 >> 웹 그자체가 됨!
from selenium import webdriver as wb
# Keys = 컴퓨터의 키보드와 같은 역할 모듈, 컴퓨터가 쓸 키보드 
from selenium.webdriver.common.keys import Keys
# time = 컴퓨터한테 쉬는 시간을 부여, 컴퓨터한테 클릭 텀 시간주기
import time


## 크롬 드라이버 실행
#  wb.Chrome() = 컴퓨터가 크롬창을 씀
driver = wb.Chrome()
# 컴퓨터에서 어디를 들어갈지 url주소를 알려줌
url = "https://www.naver.com/"
driver.get(url)

# 1. 검색창의 위치를 알아오기!
# element : 요소, 요소는 태그와 내용을 모두합친거
# _by_id : id를 통해서
# 우리는 네이버 검색창의 위치를 알아볼건데 검사로 알아보니 
# 검색창은 페이지에 하나뿐이라 id태그로 id=query로 되어있었다.
search = driver.find_element_by_id("query") 

# 2. send_keys로 컴퓨터에게 검색어를 알려주자. 
# 이러면 컴퓨터가 검색창에 내가원하는 글자를 입력해준다.
search.send_keys("손흥민")

 

검색하는 방법은 1. 클릭하기 2. 엔터치기 이렇게 2가지로 나뉜다.

 

1. 클릭을 해서 검색하는 방법

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

 

2. 엔터치기

search.send_keys(Keys.ENTER)

 


 

이제 클릭을 이용해서 한솥 도시락 사이트에서 메뉴와 가격을 크롤링하는 해보자.

from selenium import webdriver as wb
from bs4 import BeautifulSoup as bs
import pandas as pd
import time

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

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

## 메뉴의 이름만 가지고 오기
menu = soup.select("h4.h.fz_03")

for i in menu:
    print(i.text)
    
# element와 elements가 있음 단수인지 복수인지 구분을 잘해야함
# 여기서는 한솥도시락 시이트에서 더보기 버튼을 클릭하는 버튼을 만든거다.
btnMore = driver.find_element_by_class_name("c_05")

btnMore.click()

예외처리(try문에서 오류가 나면 except빠져버려)

예외처리는 ry문을 실행하다가 오류가나면 except가 실행된다.

아래 코드는 클릭을 50번 하라는 건데 한솥도시락에서 더보기 버튼을 50번까지아 있지않아서 더보기가 끝나면

누를 버튼이 없어서 에러가 뜬다. 그래서 예외처리를 해주는 거다.

try :
    for i in range(50):
        btnMore.click()
        # time.sleep(2) : 클릭 한번 한후 2초동안 멈춰
        time.sleep(2)
except :
    print("종료되었습니다")

 


예외처리까지 배웠으니 오늘 배운거를 활용해서 실습해보자

한솥 도시락 메뉴, 가격 수집를 수집해서 데이터 프레임으로 만들자.

 

tqdm라이브러리의

tqdm_notebook: 반복문이 잘 실행되는지 확인

  • from tqdm import tqdm_notebook as tq
from selenium import webdriver as wb
from bs4 import BeautifulSoup as bs
import pandas as pd
import time
# tqdm_notebook: 반복문이 잘 실행되는지 확인
from tqdm import tqdm_notebook as tq

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

# element와 elements가 있음 단수인지 복수인지 구분을 잘해야함 
btnMore = driver.find_element_by_class_name("c_05")

try :
    for i in range(50):
        btnMore.click()
        # time.sleep(2) : 클릭 한번 한후 2초동안 멈춰
        time.sleep(2)
except :
    print("종료되었습니다")

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

# 메뉴명을 갖고 오기
title = soup.select("h4.h.fz_03")
titleList = []
# 가격을 갖고 오기
price = soup.select("div.item-price > strong")
priceList = []
time.sleep(0.3)

for i in tq(range(len(title))):
    titleList.append(title[i].text.strip())
    priceList.append(price[i].text.strip()+"원")
    time.sleep(0.3)


# 데이터프레임 제작 (순수한 메뉴명, 가격)
data = {'메뉴명': titleList, '가격': priceList}
menu = pd.DataFrame(data)


# pd.set_option('display.max_row', 100) -> 데이터프레임이 한번에 100개까지 보이게함
menu

위의 코드를 실행하면 아래 결과가 나온다.

 

728x90