TIL/Python

TIL.52 Bs4와 selenium 을 이용한 크롤링

codermun 2020. 11. 30. 19:12
728x90
반응형

스타벅스 코리아 홈페이지에서 모든 음료와 이미지를 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])

728x90
반응형