본문 바로가기
Python

[Python] 크롤링-starbucks 음류수 종류 - csv

by UnoCode 2020. 7. 3.

이번시간에는 스타벅스 음류수 총 매뉴를 크롤링 해보겠습니다.

 

해당 문서는 글쓴이가 문법이 해깔리거나 패턴이 해깔릴 경우를 위해 작성하였으므로 가독성이 없을 수 있습니다 .

 

import requests
import csv
from bs4 import BeautifulSoup
from selenium import webdriver

1. (request)  html 소스 불러오기

 

2. (csv) csv파일 생성

 

3. (bs4) 크롤링 도구

 

4. (selenim) 웹 드라이버

 

지난 시간에 웹 드라이버를 사용하지 않고 크롤링을 했는데요 스타벅스는 웹 드라이버를 사용해서 크롤링 하겠습니다.

 

Why 웹드라이버를 사용할까??

selenium은 동적 페이지를 분석하는데 사용하고

 

bs4는 정적 페이지를 분석하는데 사용합니다.

 

selenium는 bs4보다 느리니 상황에 맞게 쓰시면 됩니다.

 

def main():
    # 방법 1
    # menu_lists = soup.select(".product_list dl dd ul li dl dt a")

    # 방법2
    menu_lists = soup.find_all("a", {"class": "goDrinkView"})
    for menu in menu_lists:
        star_menu.append(getMenuInfo(menu))

    csv_save(star_menu)



if __name__ == "__main__":
    URL = "https://www.starbucks.co.kr/menu/drink_list.do"
    star_menu = []

    # 크롭 headless모드
    chrome_option = webdriver.ChromeOptions()
    chrome_option.add_argument("headless")
    chrome_option.add_argument("-disable-gpu")
    chrome_option.add_argument("lang-=ko_KR")

    # 크룸 실행
    dr = webdriver.Chrome("./chromedriver", chrome_options=chrome_option)

    # URL 소스 가져오기
    dr.get(URL)
    html_code = dr.page_source

    # 분석하기 쉽게 bs4로 변환
    soup = BeautifulSoup(html_code, "html.parser")
    main()

0. __main__부터 보시면됩니다.

 

1.  언제나 글쓴이의 패턴의 그렇듯이 URL변수와 데이터 리스트를 만듭니다.

 

2. 그냥 크롬 headliess모드는 백그라운드에서 크롬을 동작시키도록 하는 option 입니다.

 

3. 크롬 실행을 하기위해 webdriver.Chrome함수를 실행시킵니다. 

https://chromedriver.chromium.org/downloads(다운로드 링크)

 

본인 크롬의 버전을 확인하고 위 사이트에서 맞는 버전을 설치하세요..

 

최신버전 무저건 다운받기 No!!

 

4. 스타벅스 사이트의 Html 소스를 가져옵니다.

 

5. 분석하기위해 bs 선언

 

6. __mian__ 함수

 

7. 방법1 로도 데이터를 가져올수 있고 방법2로도 할 수 있으니 취양것 사용 하시기 바랍니다.

 

8. 하나의 덩어리를 찾아 find_all() for문으로 find_all()로 찾은 덩어리를 반복합니다.

 

9. list에 데이터를 append 합니다.

 

# 매뉴 가져오기
def getMenuInfo(menu):
    name = menu.find("img")["alt"]
    img_Url = menu.find("img")["src"]

    return {"name": name, "img_Url": img_Url}

img 태그의 alt속성과 src속성을 리턴 하는 함수 입니다.

 

스타벅스의 음류 이름과 이미지 URL을 가져옵니다.

 

# csv로 변환
def csv_save(star_menu):
    f = open("star.csv", "w", encoding="utf-8", newline="")
    wr = csv.writer(f)
    wr.writerow(["이름", "URL"])
    for Info in star_menu:
        wr.writerow([Info["name"], Info["img_Url"]])
    f.close()

이전 글에 했던 빌보드 차트와 동일한 로직이므로 설명은 생력하겠습니다.

 

전체 코드

 

import requests
import csv
from bs4 import BeautifulSoup
from selenium import webdriver

URL = "https://www.starbucks.co.kr/menu/drink_list.do"
star_menu = []

# 크롭 headless모드
chrome_option = webdriver.ChromeOptions()
chrome_option.add_argument("headless")
chrome_option.add_argument("-disable-gpu")
chrome_option.add_argument("lang-=ko_KR")

# 크룸 실행
dr = webdriver.Chrome("./chromedriver", chrome_options=chrome_option)

# URL 소스 가져오기
dr.get(URL)
html_code = dr.page_source

# 분석하기 쉽게 bs4로 변환
soup = BeautifulSoup(html_code, "html.parser")

# 매뉴 가져오기
def getMenuInfo(menu):
    name = menu.find("img")["alt"]
    img_Url = menu.find("img")["src"]

    return {"name": name, "img_Url": img_Url}

# csv로 변환
def csv_save(star_menu):
    f = open("star.csv", "w", encoding="utf-8", newline="")
    wr = csv.writer(f)
    wr.writerow(["이름", "URL"])
    for Info in star_menu:
        wr.writerow([Info["name"], Info["img_Url"]])
    f.close()


def main():
    # 방법 1
    # menu_lists = soup.select(".product_list dl dd ul li dl dt a")

    # 방법2
    menu_lists = soup.find_all("a", {"class": "goDrinkView"})
    for menu in menu_lists:
        star_menu.append(getMenuInfo(menu))

    csv_save(star_menu)


if __name__ == "__main__":
    main()

 

 

추출후 결과는 저작권 문제로 출력하지 않겠습니다.

 

결과 같은 이전 빌보트 차트한 결과와 동일하니 이전 글을 보시기 바랍니다.

 

 

'Python' 카테고리의 다른 글

[Python] 자료구조 Set, Dictionary  (0) 2020.07.13
[Python] 자료구조 Tuple,Array  (0) 2020.07.06
[Python] 크롤링-billboard 차트 - csv  (0) 2020.07.02
[Python] asyncio  (0) 2020.07.02
[Python] coroutine (코루틴)  (1) 2020.06.29

댓글