다나오는 사이트를 긁어보자.2

커피같은개발·2022년 7월 11일
1

파이썬

목록 보기
3/5

갑자기 분위기 유모차

드디어 다나오는 사이트를 크롤링 해보겠다.

뽑을 제품은 유모차제품 정보이고, 유모차는 형태도 제품도 다양하다.
{유모차 형태 사진}
그래서 형태별로 제품을 모두 뽑고 다른 유모차 형태의 주소로 옮기는 것 까지 할거다.

대충 뽑을 데이터는 아래와 같다.



유모차도 차라고 엄청 복잡하다.

얼핏 보면 상단 데이터와 하단 데이터가 같아 보이나
미묘하게 없는 데이터가 있거나 상단 데이터에는 항목(key) 없이 값(value)만 있는 경우가 있다.
그래서 두군데서 뽑아한다.
벌써 킹 받는 소리 들린다.

뽑을 데이터를 대충 엑셀에 그려보면

(▲이런 데이터가 대충 3천개..쯤?)
수백개의 제품, 수천개의 데이터를 뽑을 수 있단 이 말씀이야!
저 데이터를 제품 별로 일일이 들어가서 하나씩 엑셀 넣는다고 생각하면 끔찍하지 않니?

파이썬으로 자동화해서 업무가 쉬워지길바란다
꼭 파이썬 배우길 바라.
그럼 안녕~

...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...

진짜 크롤링의 세계로

낄낄 바보들

이제 진짜 크롤링을 해보자
지난 시간에 말한 필수, 선택 모듈 설치 후 하고 복붙해라
지난 포스팅 바로가기
from bs4 import BeautifulSoup
from selenium import webdriver
import chromedriver_autoinstaller
import pandas as pd
from selenium.webdriver.common.by import By
import time
모듈의 역할과 설명 또한 지난 포스팅에 있으니 참고해라

크롬드라이버 로드 복붙만 하면 끝!

원래는 ▼요런 객체만 불러와서 변수(driver)에 할당해 쓰면 끝이다.
driver = webdriver.Chrome('드라이버 경로')
하지만 버전 업데이트가 자동으로 되도록 만들어 보겠다.
수동 보다 코드가 복잡하지만 한번 만들어 두면 복붙해서 쓰면 되기 때문에 이게 편할걸?
앞으로 자동화 하고 싶으면 내 코드를 따라하고, 수동으로 할거면 "셀레니움 크롬 드라이버 설치"라고 구글링 하면 많이 나온다.

① 크롬 드라이버 버전 확인 및 변수할당
② 현재 버전과 맞으면 로드 후 변수에 할당
③ 현재 버전과 맞지 않으면 해당 버전 설치 > 로드 후 변수에 할당
②~③보면 알겠지만 조건절 혹은 예외처리문이다.

크롬드라이버 버전 확인

chromedriver_autoinstaller.get_chrome_version()

102.0.5. 요런식으로 크롬 버전이 나오는데 우리가 필요한건 가장 앞에 버전명 102가 필요하다.
그래서 '.'으로 split하고 가장 앞의 인덱스를 가져오면 크롬드라이버 버전 확인이 끝난다.

chrome_version = chromedriver_autoinstaller.get_chrome_version()

버전명을 넣어서 크롬드라이버를 로드하며 된다.

driver = webdriver.Chrome(f'./{chrome_version}/chromedriver.exe')

현재 버전이 맞지 않거나 크롬 드라이버가 없다면?
install하면 되지 뭐가 문제인가 껄껄
chromedriver_autoinstaller모듈에서 install메소드를 쓰면 된다.
크롬 드라이버가 없거나 버전이 안맞으면 설치하기

chromedriver_autoinstaller.install(True)

이렇게 하면 웹에서 정보도 가져오고, 스크롤 움직임, 클릭, 키보드 제어 등 동적제어의 준비가 끝난다.
그리고 driver객체로 url을 get하면 된다.

코드 정리

버전 확인 : chromedriver_autoinstaller.get_chrome_version()
크롬 드라이버 로드 : webdriver.Chrome()
드라이버 설치 : chromedriver_autoinstaller.install(True)

복잡하게 보였지만 위 세줄로 예외처리하는 식이다.

사이트 열기

유모차 형태별로 다나오는 사이트 내 주소가 다르기 때문에 유알엘을 리스트로 만들어 하나씩 불러온다.
urls = ['url1', 'url2', 'url3'..]
for 으로 url을 하나씩 불러와서 사이트를 연다

  • 팁 사이트를 열때는(html를 호출) 호출 다 될까지만 기다려줘라는 명령어를 자주쓴다.
    최대 20초 정도는 기다려줘 : driver.implicitly_wait(20)

이게 바로 메크로인가?

이제부터 코딩이 재밌을거다.
막 컴퓨터가 알아서 클릭도 해주고, 사이트도 넘어가고 휙휙~
불법 메크로 사이트가 이런 원리라지? 군침이 사악 도네

브랜드를 클릭 하면 해당 브랜드의 제품만 나오게 된다.
우린 브랜드 별로 순차적으로 제품을 뽑을 거 기 때문에 차례로 클릭 후 제품에 진입할 것이다.

① 브랜드 선택하기
② 제품 유알엘 가져오기
첫 화면으로 진입하면 아래와 같은 화면을 마주하게 된다.
총 47개의 상품이 있고, 접어서 봤을 땐 5개의 상품만 보인다.
모든 브랜드를 보고 체크박스 클릭을 위해 더보기 버튼(47개+)을 클릭해보자

원하는 컴포넌트(요소) 클릭하기

셀레니움에서 단일 요소를 찾고 동적 제어(수행할 액션 메서드) 하는 포맷은 아래와 같다.
★☆★☆★☆★☆★☆중요★☆★☆★☆★☆★☆
드라이버객체.find_element(By.요소, "요소값").액션()
★☆★☆★☆★☆★☆중요★☆★☆★☆★☆★☆
(단일 요소가 아닌 요소'들'을 찾으려면 elements라고 쓰면 된다. )
▲요거 하나면 웬만한 웹 제어는 가능하다. 한....70% 이상?

클릭할 요소를 찾아한다.
클릭해야할 "47개+"의 요소는 class = "btn_spec_view btn_view_more" 이다.
(거듭 말하지만 html에 대한 개념이 있어야 크롤링을 할 수 있다.)
동적 제어 포맷에 그대로 식을 대입하듯 해보자. >> 드라이버객체.find_element(By.요소, "요소값").액션()
우리는 아까 드라이버를 driver라는 변수(객체)에 넣었다.
그리고 요소는 class이다. 그럼 요소값은 무엇이겠는가?
driver.find_element(By.CLASS_NAME, "btn_spec_view btn_view_more")
이렇게 하면 요소를 찾은거다. 진짜 이게 끝이다!

이렇게만 하면 사이트 내 모든 요소를 찾을 수 있다.

이제 저 요소(47개+)를 클릭하고 싶잖아? 그럼 뒤에 click이라고 적어주면된다.

driver.find_element(By.CLASS_NAME, "btn_spec_view.btn_view_more").click()
딸깍!
새로운 세상이 펼쳐 진..아니 목록이 펼쳐진다!
요소 호출 코딩 시 유의 사항

  • 대소문 구분하기
  • 요소 값에 띄어쓰기가 있을 시 "."으로 붙여주기

이제 더보기 버튼으로 브랜드 목록을 펼쳤으니 브랜드의 체크박스를 클릭해보자

브랜드 차례대로 클릭하기

브랜드 명을 차례대로 긁어와 리스트에 담아서 for문을 통해 하나씩 driver객체에 넣어 체크박스를 클릭할거다.
① 브랜드명 가져와 리스트에 담기
② 해당 리스트를 이용해 체크박스 클릭하기
이것 까지 하면 웬만한 클릭 제어는 다할 줄 아는거다.
그러니까 중요하다.
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
하려고 했으나...
너무 힘들다. 그러니 다음에 보자

오늘도 여기까지 읽은 변태들아 고맙다
여기까지 적은 나는 고생했고, 너네는 썩 꺼져라.

오늘의 코딩

① 자동으로 크롬드라이버 설치 및 업데이트
② 요소(더보기) 클릭하기
를 해보았다.

chromedriver_autoinstaller.get_chrome_version()
webdriver.Chrome()
chromedriver_autoinstaller.install(True)

driver.find_element(By.CLASS_NAME,  "btn_spec_view.btn_view_more")
profile
개마케터로써의 삶

0개의 댓글