본문 바로가기
웹 크롤링(Web Crawling)/크롤링 프로젝트(시행 착오 노트)

[python] 윈들리(windly) 상품 정보 크롤링 프로그램

by 현군의 coding&IT story 2024. 2. 1.

구현 목표 (요구 사항)

윈들리(windly) 2.0 웹 사이트에서 자동 로그인을 진행하고 관심상품에 들어가 상품들의 세부 정보 (상품평, 이미지 url, 색상, 크기, 원가)를 크롤링하여 엑셀에 저장하는 프로그램을 python으로 제작하기

문제 해결을 위해 다음과 같이 flow을 설계하였다.

 

1) 윈들리 사이트 로그인 후 관심상품 선택
2) 상품 리스트에서 세부 정보 보기
3) 기본 정보 탭에서는 상품명 데이터 수집
4) 판매가 탭으로 이동
5) 해당 페이지에서 이미지 url, 색상, 크기, 원가 정보를 크롤링 (크기가 없는 경우 크기 부분은 비운다.)

 

 

Trouble Shooting(문제 상황 및 해결)

마주친 문제 상황 1 ) 윈들리(windly) 사이트는 구글 자동 로그인이 되어야 한다.

왜냐하면 윈들리 사이트에서 관심상품을 보기 위해서는 해당 구글 계정에 Chrome 웹 스토어의 윈들리 앱이 활성화 되어 있어야하고 로컬 컴퓨터에 마치 key와 같은 프로그램 같은게 깔려져 있어야 한다.

 

구글 자동 로그인을 하는 과정에서 갓 구글은 selenium과 undetected_chromedriver 라이브러리를 활용하여 ActionChains를 이용해 아이디 비밀번호를 Ctrl+C, Ctrl+V 하는 방식을 사용하여 로그인을 시도했는데 보기좋게 구글이 봇임을 알아차려 버렸다. (로그인이 되지 않았다.)

 

그래서 방법을 찾던 중 좋은 방법을 찾게 되었고 그 방법은 Profile (번호)에 저장되어 있는 데이터를 이용하여 로그인이 된 상태로 만들어 버리는 것이었다.

또, 배포하고 메뉴얼을 만드는 과정에서 빠진 부분들 (예를 들어 크롬 자신의 계정용 바로가기가 바탕화면에 자동으로 추가되지 않는 경우, 처음 실행 시 자동 로그인이 되지 않는 경우, 갑자기 Chrome 사용자 선택 화면이 나오는 경우 등의 문제)에 대한 예외 처리를 로컬 컴퓨터에서 하는 메뉴얼을 추가적으로 작성했다. 

생각보다 컴퓨터의 환경이 모두 다 제각각이라는 것을 뼈저리게 느낄 수 있었다.

해당 방법이 궁금하다면 아래 링크를 참고하면 된다.

https://hyeonstone.tistory.com/entry/python-%EC%85%80%EB%A0%88%EB%8B%88%EC%9B%80-%EA%B5%AC%EA%B8%80%ED%81%AC%EB%A1%AC-%EC%9E%90%EB%8F%99-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8

 

마주친 문제 상황 2 ) 윈들리(windly) 사이트에 자동 로그인이 설정되어 있었다.

윈들리 사이트에 자동 로그인이 설정되어 있는 사람이 있었다. 그니까, 로그인 페이지에 접속하면 자동으로 로그인 아이디와 비밀번호가 저장이 되어 채워진 상태가 되는 것이다. 그래서 프로그램을 실행하면 똑같은게 2번 들어가므로 당연히 로그인이 되지 않았다.

역시 나의 개발할 때 나의 컴퓨터 환경만 고려할 것이 아니라 제각각인 컴퓨터 환경을 최대한 고려하는 연습을 해야겠다는 것을 뼈저리게 느낄 수 있었다.

 

마주친 문제 상황 3 ) PermissionError: [Errno13] Permission denied 오류 

데이터를 크롤링하고 엑셀에 저장하는 과정에서 저장 경로명이 틀렸었다.

정확하게 경로명이 파일로 끝나야 하는데 폴더로 끝나 오류가 발생했었다.

이 오류가 발생하면 거의 99%는 경로명 문제이거나 해당 파일을 열고 실행하여 수정할 수 없는 경우이다.

excel_save_path = r'C:\outsourcing\6.windly_crawling' # 오류
excel_save_path = r'C:\outsourcing\6.windly_crawling\windly.xlsx' # 정상
wb.save(excel_save_path)

 

마주친 문제 상황 4 ) class의 속성 값이 계속 바뀌는 문제

위 코드에서 a 태그의 class 속성값이 sc-dusUTO iAIcdD 이다. 이렇게 속성값이 뭔가 랜덤하게 지어진 것 같은 class 명일 때는 속성 값이 주기적으로 바뀌는 것이 아닌지 의심해봐야 한다.

만약 주기적으로 바뀌게 되면 class 속성값을 driver가 찾을 수 없으므로 이 경우 절대 바뀔 수 없는(또는 바뀌기 어려운) XPATH(구조)나 다른 속성값을 찾아야 한다.

구해야 하는 요소가 하나라면 XPATH의 구조로 가져오는 것이 확실했겠지만, 나의 경우 여러 개 였기 때문에 XPATH로 가져오되 그 기준을 style의 속성값으로 했다.

product_url_elements = driver.find_elements(By.CSS_SELECTOR, '.sc-dusUTO.iAIcdD')

위 코드를 아래와 같이 수정했다.

product_url_elements = driver.find_elements(By.XPATH, '//*[@style="pointer-events: auto;"]')

 

XPATH로 찾는데, style 값이 pointer-events: auto; 인 것을 가져온다는 의미이다.


마주친 문제 상황 5 ) 말(글)로는 설명하기 어려운 경우

여러가지 환경적 문제 때문에 일일이 말로 설명하기 어렵고 시간이 오래걸리는 경우, 원격 제어의 방법을 사용하였다.

'Chrome 원격 데스크톱'과 윈도우의 '빠른 지원' 프로그램을 사용하였다. IT를 어려워하는(모르는) 사람이라면 말(글)로 설명하는 것보다 원격 제어를 통해 보여주는 것이 문제 해결의 빠른 방법 중 하나라는 느낌을 받을 수 있었다. 

 

 

구현 영상