21.2.27

커피 내리는 그냥 사람·2021년 2월 27일
0

위코드 pre코스

목록 보기
26/28

<스타벅스 페이지 크롤링 연습>

참고 블로그

스타벅스 메뉴 홈페이지의 메뉴와 모든 사진 링크를 크롤링 해보는 과제. 사실 과제라기 보다는 예습 차원에서 실시.

크롤링? : 웹 상 존재하는 컨텐츠를 긁어오는 것

무엇을 어떻게 크롤링할 것인지 미리 고민을 해보면 좋다.

1. 필요한 선행 작업

  • 가상 환경 구축(miniconda)
  • beautifulsoup4, request, selenium 설치(pip install~)

2. 코드 분석

import re # 정규표현식
import csv # csv 파일로 저장할 것이므로
import requests

from bs4 import BeautifulSoup
from selenium import webdriver
# python 코드로 crhome 접속 가능하게 하는 것

# 필요한 기반 사항은 터미널에서 미리 설치한다.

filename   = "starbucks.csv"
csv_open   = open(
    filename, "w+", encoding="utf-8")
csv_writer = csv.writer(csv_open)

# 쓰기 모드 완성
# 해석 : 파일 이름은 starbucks.csv로 할 것이고
파일을 열고 write하는데 인코딩 양식을 utf8로 할 것이다.

url     = "https://www.starbucks.co.kr/menu/drink_list.do"
# 크롤링 할 페이지
browser = webdriver.Chrome("/Users/daminan/Downloads/chromedriver")
# 경로 설정 잘해주기. 가상환경이건 뭐건 상관 없음.
# 이 때 경로가 잘못 되면 아예 크롬창이 열리지 않음.
browser.get(url)
# python 코드로 crhome 접속 가능하게 하는 것


html = browser.page_source
# 소스 불러오기
bs   = BeautifulSoup(html, 'html.parser')
# 파씽

product = bs.findAll("li", {"class" : "menuDataSet"})
# findAll로 menuDataSet, 여기가 그 홈페이지에 찾는 정보가 모두 있는 태그였음. 이 곳을 모두 긁어옴
for row in product:
    img_tag = row.find('img')
    img_url = img_tag['src']
    drink = img_tag['alt']
    csv_writer.writerow((drink, img_url))
    
    # for loop 통해 img를 찾은 뒤 그 이미지의 인덱스를 활용하여 음료 이름과 링크 찾음. 이건 페이지마다 다를 수 있다. 이후 그 루프된 내용을 csv 파일 row에 저장.

csv_open.close()
browser.quit()

# 꼭 마지막에 file과 browser를 닫아줘야 한다.

# 과정이 완료되어 python starbucks.py 를 실행하면 알아서 창이 열리고 그 창에서 파싱을 한 뒤 csv값을 저장해준다.

3. 배운 점

  1. 기존에 알고 있던 뷰티플숩에서 셀레니움 사용법까지 같이 배웠다.(기존 것은 터미널창에 결과를 바로 보여주는 형식이었다면 이번에 배운 내용은 csv로 바로 만들어주기도 하고 셀레니움이라는 것도 처음 이용해 봄.)

  2. 셀리니움 경로, csv 파일 경로 등 절대, 상대 경로에 대한 이해가 많이 되었다.

  3. find_all과 find 차이

  • find_all 혹은 findAll : 조건에 해당하는 모든 태그 찾기
  • find : 조건에 해당하는 첫번째 태그 찾기
  1. csv 구조
  • CSV writer는 writerow() : 메서드, list 데이타를 한 라인 추가

추가로 공부할 사항 : 파일 불러오는 구조 좀 익숙해져야겠다. 알긴 알지만 익숙치 않다.

  1. 근데 왜 셀리니움 웹드라이버 써야하나? :
  • requests는 빠르게 HTML 태그에 관한 모든 걸 스크랩 해오지만 자바스크립트가 같이 있는 홈페이지의 경우 리퀘스트보다 모든 늦게 뜬다. 그래서 그런게 아닐까?(이미 긁어올 것을 빠르게 긁어왔어서..? 그래서 필요한건 못 긁어왔다?)
  • 이 과정에서 requests는 단순히 소스만 본 것이고 웹페이지가 자바스크립트로 동적으로 움직이고 있는 부분은 가져오지 못했다. 여기서 이를 감지 할 수 있는 부분이 바로 셀레니움이다. 스타벅스 코드를 보면 자바스크립트로 모든 li가 포장된 것을 볼 수 있는데 여기서 힌트를 얻어야 한다.
  • 동적인 것 뿐 아니라 페이지가 여러 개인 것을 자동 크롤링 할 때도 사용한다.

참조 링크

참조 링크2

profile
커피 내리고 향 맡는거 좋아해요. 이것 저것 공부합니다.

0개의 댓글