ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL.52 Bs4와 selenium 을 이용한 크롤링
    TIL/Python 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
Designed by Tistory.