앞서 작성한 'web scraping 연습'에서도 스벅 메뉴 크롤링을 했지만, 그 때는 각각의 이미지와 이름만 크롤링했는데 이번에는 카테고리와 서브카테고리도 함께 저장하였다.
from selenium import webdriver import pandas as pd driver = webdriver.Chrome() driver.get('https://www.starbucks.co.kr/menu/drink_list.do') product_list = driver.find_element_by_class_name('product_list') #subcategory의 이름 + subcategory에 속한 음료 갯수만큼의 빈 문자열('')이 리스트로 만들어짐 product_category = product_list.find_elements_by_tag_name('dl>dt>a') product_cate_name = [name.text for name in product_category] #빈 문자열에 subcategory 이름을 넣고, subcategory 이름 하나씩을 삭제하면 음료 이름 리스트와 갯수가 맞고 1:1 대응이 됨 #삭제할 인덱스를 담은 리스트 idx_list = [] #for loop으로 돌리면서 삭제하면 인덱스가 맞지 않기 때문에 삭제 대신 새로운 리스트에 append new_category_list = [] for y in range(0, len(product_cate_name)): #삭제할 인덱스 담은 리스트 만들기(빈 문자열이 아닌 subcategory이름이 속한 인덱스) if not product_cate_name[y] == '': idx_list.append(y) #subcategory 이름들 빈 문자열에 넣어주기 for x in range(0, len(idx_list)-1): if y < idx_list[x+1] and y >= idx_list[x]: product_cate_name[y] = product_cate_name[idx_list[x]] #위의 방식으로는 마지막 subcategory의 이름은 적용되지 않아서 남은 빈 문자열들에는 마지막 subcategory 이름을 넣어줌 if product_cate_name[y] == '': product_cate_name[y] = product_cate_name[idx_list[len(idx_list)-1]] #y-1번째와 y번째가 다르지 않으면 new_category_list에 append(이렇게하면 subcategory이름별로 하나씩 삭제된 리스트가 완성됨) if product_cate_name[y-1] == product_cate_name[y]: new_category_list.append(product_cate_name[y-1]) product_li = product_list.find_elements_by_class_name('menuDataSet') product_name = [name.find_element_by_tag_name('dd').text for name in product_li] product_data = pd.DataFrame( { 'Category': '음료', 'Sub-category': new_category_list, 'Name': product_name, }) print(product_data) product_data.to_csv('starbucks_menu.csv')
진짜 어마어마하게 복잡하게 했는데 훨씬 쉬운 방법들이 있을 것 같다. 파이썬 언제 익숙해질까ㅠㅠ