TIL.52 Bs4와 selenium 을 이용한 크롤링
스타벅스 코리아 홈페이지에서 모든 음료와 이미지를 csv 파일로 저장해보자
Bs4 / selenium / webdriver 사용
코드 리뷰
1. csv 파일 열어두기
CSV는 몇 가지 필드를 쉼표(, )로 구분한 텍스트 데이터 및 텍스트 파일이다.
확장자는 .csv이며 MIME 형식은 text/csv이다. comma-separated variables라고도 한다.

# CSV 파일 열어두기
csv_name = "books.csv"
csv_open = open(csv_name, "w+", encoding='utf-8')
csv_writer = csv.writer(csv_open)
csv_writer.writerow( ('title','imag_url' ) )
2. 크롬을 사용할 예정으로 크롬의 웹드라이버를 사용함
driver = 라는 크롬 전용 웹드라이버를 정의한 뒤
driver에게 .get 메서드를 주어 안의 url로 홈페이지를 열어 줄것을 요청
driver = webdriver.Chrome(ChromeDriverManager().install())
org_crawling_url = "https://www.starbucks.co.kr/menu/drink_list.do"
driver.get("https://www.starbucks.co.kr/menu/drink_list.do")
3. 자동으로 크롬을 연 경우
해당 페이지의 모든 source를 full_html로 정의
full_html = driver.page_source
4. BeautifulSoup 객체 선언
soup = BeautifulSoup(full_html, 'html.parser')
BeautifulSoup 객체는 생성될 때 두 개의 매개변수를 받도록 설계되어 있다.s
첫 번째 인자는 str 형식이어야 하며, html 이나 xml 형식으로 작성된 문자열이어야 하며
두 번째 인자는 앞에서 넣은 text를 어떻게 요리할 지에 대한 해석기(parser) 를 넣어줘야 합니다.
즉, full_html 이라는 단순 텍스트를 html 문으로 컴퓨터가 알아 들을 수 있게끔 변환시켜주는 파싱을 해준다.
(파싱은 파서를 이용해 수행한다)
5. selenium을 이용해 브라우저를 자동으로 실행시킬 것 이기때문에
브라우저가 모두 켜지는데 대기 시간을 부여함
time.sleep(3) # 3초
6. bs4의 객체 soup(bs4 객체) .select 메서드를 이용
HTML 문서의 내가 원하고자 하는 정보(?)에 대한 selecte를 가져와서 사용하기 위해 사용한다.
(개발자도구에서 copy -> copy select)
아래 내용은 각자 어떻게 뽑혀져 나올지 알아보기 위한 단순 확인용 코드이다.
categories = soup.select('#container > div.content > div.product_result_wrap.product_result_wrap01 > div > dl > dd:nth-child(2) > div.product_list > dl > dt > a')
drink_name = soup.select("#container > div.content > div.product_result_wrap.product_result_wrap01 > div > dl > dd:nth-child(2) > div.product_list > dl > dd > ul > li > dl > dd")
images = soup.select("#container > div.content > div.product_result_wrap.product_result_wrap01 > div > dl > dd:nth-child(2) > div.product_list > dl > dd > ul > li > dl > dt > a > img")
7. csv 파일 열어둔 상태에서 아래 코드를 통해 csv 파일에 값을 입력 해준다.
iamges 에서 뽑혀져 온 데이터를 확인해보면 아래와 같이 alt 와 src을 이용해 원하는 정보만 끄집어 올 수 있다.

with open(csv_name, "w+", encoding = "utf-8") as file:
for i in images:
title = i['alt'].strip('190ML')
img_url = i['src']
writer = csv.writer(file)
writer.writerow([title, img_url])
import csv
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
csv_name = "books.csv"
csv_open = open(csv_name, "w+", encoding='utf-8')
csv_writer = csv.writer(csv_open)
csv_writer.writerow( ('title','imag_url' ) )
driver = webdriver.Chrome(ChromeDriverManager().install())
org_crawling_url = "https://www.starbucks.co.kr/menu/drink_list.do"
driver.get("https://www.starbucks.co.kr/menu/drink_list.do")
full_html = driver.page_source
soup = BeautifulSoup(full_html, 'html.parser')
time.sleep(3)
categories = soup.select('#container > div.content > div.product_result_wrap.product_result_wrap01 > div > dl > dd:nth-child(2) > div.product_list > dl > dt > a')
drink_name = soup.select("#container > div.content > div.product_result_wrap.product_result_wrap01 > div > dl > dd:nth-child(2) > div.product_list > dl > dd > ul > li > dl > dd")
images = soup.select("#container > div.content > div.product_result_wrap.product_result_wrap01 > div > dl > dd:nth-child(2) > div.product_list > dl > dd > ul > li > dl > dt > a > img")
with open(csv_name, "w+", encoding = "utf-8") as file:
for i in images:
title = i['alt'].strip('190ML')
img_url = i['src']
writer = csv.writer(file)
writer.writerow([title, img_url])
