-
TIL.52 Bs4와 selenium 을 이용한 크롤링TIL/Python 2020. 11. 30. 19:12728x90
스타벅스 코리아 홈페이지에서 모든 음료와 이미지를 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'TIL > Python' 카테고리의 다른 글
TIL.88 Decorator(토큰 인가)_Unit Test (0) 2021.01.04 TIL.74 삼항 연산자 (0) 2020.12.21 TIL.63 try_except 구문의 중요성 (0) 2020.12.10 TIL.55 Python 정규표현식 사용하기 (0) 2020.12.03 TIL. 53 CSV 파일 데이터로 집어넣기 (Django, MySQL) (0) 2020.12.01