TIL#64 Starbucks Crawling

dnpxm387·2020년 9월 14일
0

html

목록 보기
5/6

지난주에 있었던 스타벅스 크롤링 공부를 다시 하기로 했다. 스타벅스의 커피카테고리, 음료이름, 영양정보를 크롤링하여서 csv 파일에 입력,저장 후 starbucks 모델링 프로젝트 파일에 가서 csv파일을 dump해서 모델에 데이터를 입력하는 과제였다.

과제를 제출했을 때는 카테고리까지 같이 csv 파일에 row 한줄씩 저장하는 법을 모르겠어서 안하고 음료이름과 영양정보만 했었지만 다시 한번 마무리를 해보려고 시작하였다.
결과는 성공⭐️

selenium & csv

이번에는 selenium을 이용해 자동 클릭되면서 사이트가 이동되도록 코드를 작성하였다. 새로운 것을 공부하는 것은 언제나 재미있는 것 같다👍🏼

csv 파일 이름을 지정하였고 'w+' 로 열기를 설정하였다. 'w'는 쓰기모드이며 'w+'는 읽기 or 쓰기모드이고 파일이 없으면 생성된다.

그냥 커피 데이터만 뽑으려면 스타벅스의 음료메뉴사이트에서 시작해도 되지만 자동클릭되어서 이동하는 법을 연습하기 위해 스타벅스 메인페이지에서 시작되게 url을 시작하였다. 크롬드라이버로 시작한다.

find_element_by_조건("") 은 조건 에따라 찾을 수 있다.
find_element_by_css_selector, find_element_by_id, find_element_by_name 등이 있다. element가 아니라 elements를 쓰면 조건에 해당하는 값들을 전부 찾는다.
.click()은 말 그대로 드라이버가 찾은 곳을 클릭한다. 위의 코드를 실행하면 스타벅스 홈페이지에 접속한 후 menu 를 찾아서 클릭하고 음료자세히보기를 클릭한다. 원하는 버튼이 있는 곳의 태그를 찾아서 find_element_by_css_selector("")안에 설정하면 된다. class는 클래스 이름 앞에 . 을 붙이고 id는 id 이름 앞에 # 을 붙이면 된다.

음료의 상세 영양정보를 긁어오려면 각 음료마다 클릭하여 들어가서 확인을 해야 하는데 음료 하나를 클릭하여 들어가면 https://www.starbucks.co.kr/menu/drink_view.do?product_cd=9200000002487 이렇게 주소가 나온다. product_cd= 뒤의 주소들이 음료의 product number이다. 그래서 이부분을 긁어모은 후에 하나하나 들어가서 영양정보를 뽑아와야 한다.
음료페이지에서 개발자도구를 연 후에 음료 하나를 보면

이렇게 보인다. a태그에 prod= 부분이 상품 번호이다.

각 메뉴들의 공통 상위클래스인 menuDataSet의 리스트를 만든 후에 for문을 돌려서 a태그를 찾고 그 안의 prod 값을 찾아서 새로운 리스트인 prod_list 에 추가하였다. 밑의 remove는 스타벅스에서 새로 업데이트를 안했는지 접근이 안되는 메뉴들이었다. 그래서 일일히 지워주었다(고생하신 동기 도길님 덕분에 날로 먹었다😝).

prod_list 를 for 문을 돌려 음료페이지 하나씩 들어가며 카테고리, 음료 이름, 영양정보를 뽑아서 csv파일에 저장하였다. 음료 이름, 영양정보는 위 사진의 category와 같은 방식이므로 생략


결과는 성공👍🏼


csv 파일 데이터베이스 dump

csv파일에 크롤링을 하여 가지고 있는 정보를 데이터베이스에 옮겼다(입력했다). 백엔드는 크롤링을 하여 데이터를 긁어오고 또 그것을 입력하는 것이 중요하다.
스타벅스 프로젝트 안에 따로 db_uploader.py 파일을 만들었고 csv파일도 복사해서 넣었다. 처음에 입력을 하였는데 카테고리까지 OneToOne 방식으로 저장이 되어서 당황하였다. 조금 고민을 한 후에 쿼리셋 문법을 이용하여 정상적으로 설정을 하였다.

for 문을돌려 하나씩 데이터베이스에 입력을 하였고 foreignkey를 위해서 if문을 주어 카테고리의 같은 값이 존재하는 경우에는 저장을 하지 않고 기존에 저장된 값에서 가져와서 같은 id로 이용을 했다.


결과는 성공적⭐️
아직 초보이고 다들 할 수 있는 거지만 스스로는 너무 뿌듯해서 어디다 자랑할 곳도 없고 해서 블로그에 정리해서 올려본다😅

profile
개발자꿈나무🌲

0개의 댓글