Python - Web Scraping 연습(2)

Nina·2020년 10월 3일
0

Python

목록 보기
6/6
post-thumbnail

앞서 작성한 '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')

진짜 어마어마하게 복잡하게 했는데 훨씬 쉬운 방법들이 있을 것 같다. 파이썬 언제 익숙해질까ㅠㅠ

profile
https://dev.to/ninahwang

0개의 댓글