지난 시간 복습

지난 시간에 ①크롬 드라이버 설치 ②요소 클릭하기를 해보았다.
크롬 드라이버를 내가 말한대로 설치하면 앞으로 복붙해서 쓰면 되기 때문에 외울 필요가 없다.
요소 클릭하기는 아래 형태만 기억하자

드라이버객체.find_element(By.요소, "요소값").제어메소드
클릭하는 방법은 이전 포스팅에 상세히 나와있으니 참고바란다.
링크텍스트

오늘의 주제

① 브랜드를 차례대로 클릭(선택)
② 선택된 브랜드들의 제품 상세 페이지 들어가기

브랜드 차례대로 클릭하기

사실 해당 세션을 넣을까 말까 고민하다가 넣었다.
고민한 이유는 너무 쉽기 때문이다.

차.례.대.로 라는 단어를 보고 유추했겠지만 for문을 써서 하나씩 클릭하면 된다.
이번엔 xpath를 통해 요소를 찾아 보겠다.

① 클릭할 요소들(xpath, 브랜드 별 체크박스) 찾고 변수에 할당
② for문에 ①에서 만든 변수 넣기
③ 클릭메소드를 사용하여 체크박스 하나씩 클릭하기

클릭할 요소들(xpath, 브랜드 별 체크박스) 찾고 변수에 할당

다시 한번 물어본다. 요소 클릭하기 어떻게 하는거라고?
드라이버객체.find_element(By.요소, "요소값").제어메소드

find_element : 요소 찾아달라는 명령어인데 브랜드들을 찾기 때문에 find_elements라고 's'를 붙여 복수형으로 만들어 줘야한다.
드라이버 객체 : 우리 앞시간에 드라이버 객체를 driver라는 변수레 할당하였다.
요소 : XPATH로 찾기로 하였다.(대문자 주의)
요소값 : F12를 눌려 찾아 보니 ▼이렇게 위치가 나와있다.

/html/body/div[2]/div[2]/div[5]/div[2]/div[2]/form/div[2]/div[2]/div[1]/div[2]/div/div/dl[1]/dd/ul[2]/li[1]/label

객체 할당 : 아무 변수명으로 넣어주면 된다. 난 brands 라고 하겠다.

위 내용을 다 합치면 이렇게 된다.

brands = driver.find_elements(By.XPATH, '/html/body/div[2]/div[2]/div[5]/div[2]/div[2]/form/div[2]/div[2]/div[1]/div[2]/div/div/dl[1]/dd/ul[2]/li[1]/label')

클릭하는 제어메소드는 왜 넣냐고?
우리 차례대로 클릭하기로 했잖아?
좀 기다려 짜증나게 하지 말고

for문으로 하나씩 클릭하기

일단, 얼마나 반복할 건지 알아야한다. 그래서 요소의 개수를 셀 때 BeautifulSoup를 쓴다.
뷰숲에 대해서는 이전 포스팅을 보고와라
링크텍스트
변태들아 다시 왔냐?
방금 보고 온 내용을 토대로 이제 반복문을 만들어라

cnt = len(sub_items))

클릭할 요소는 class name인 'sub_item normal_item'이다.

for i in cnt:
	driver.find_element(By.CLASS_NAME, 'sub_item normal_item'.click()

셀레니움으로는 요소를 찾고 요소안의 요소 개수를 못세는가?라는 질문을 한다.
내 대답은 "아니 셀레니움으로도 된다" 이다.
"근데 왜 굳이 다른 모듈을 써요?"
"그냥"
"그냥..?"

"뷰숲에 대해서도 알려주고 싶은데 따로 쓸 곳이 없어서 여기에 우겨넣은건데?"
"진짜 미친분이세요?"
여튼 꼭 뷰숲을 쓸 필요는 없다. 셀레니움으로도 당연히 할 수 있다.
다만 하고 싶은 말은 뷰숲이 더 빠르다. 그래서 동적 제어가 없을 땐 뷰숲으로 크롤링해라
언젠가 뷰숲도 프로젝트를 만들서 오겠다...?

브랜드 별 제품 유알엘 가져오기

브랜드를 체크 하면 브랜드에 대한 제품만 나오게 된다.
브랜드명이 클릭 되면 제품의 유알엘을 가져와서 유알엘을 통해 상세페이지에 들어가는 액션을 해볼거다.
{구름1,2 이미지}
① 유알엘 가져오기
② ①데이터 리스트에 append
③ 페이지 열기

유알엘 가져오기

상기 배운 뷰숲을 이용해서 유알엘을 가져와보자
유알엘 요소는 div name인 'prod_info'이다.

lists = 뷰숲객체.find_all("div", attrs={'class': 'prod_info'})

브랜드 내 제품이 복수이므로 find_all을 썼다.
해당 요소들을 반복문으로 'a'태그를 가져오면 된다.

url = list.find("a")["href"]

append

append가 뭔지 모르면 파이썬 기초 문법은 배우길
url_boxes = [] 라는 리스트 변수를 만들어서 append시켰다.
url_boxes.append(url)
이제 브랜드 내 상품 페이지 유알엘이 url_boxes에 들어있다.

페이지 열기

페이지 열기, 즉 제품 상세 페이지 열기 메소드가 뭐라고?

driver.get('유알엘')

for문을 통해 url_boxes를 url_box이라는 이름으로 꺼내서 위 메소드 '유알엘'에 넣어서 하나씩 실행시키면된다.

driver.get(url_box)

오늘은 브랜드를 클릭(선택)해서 제품 상세페이지로 들어가는 작업을 해보았다.
여기까지 했으면 드디어! 대망에! 데이터를 추출할 차례이다.
기본적인 방식은 똑같다.
요소를 driver.find_element라는 문장으로 찾으면 된다.

이 다음 부터는 쉬운것 처럼 말했지만 사실 쉽지는 않다.
이 사이트의 데이터 순서나 구조가 일정하지 않아서 좀 복잡하다.
반대로 말하면 복잡한걸 잘하면 일정한 패턴의 사이트 크롤링은 쉬워진다는 말이된다.
그러니까 다음시간 기대해라.

오늘도 열심히 작성한 나 너무 고생했고, 여기까지 본 변태들은 썩꺼져라

오늘의 코딩

brands = driver.find_elements(By.XPATH, '/html/body/div[2]/div[2]/div[5]/div[2]/div[2]/form/div[2]/div[2]/div[1]/div[2]/div/div/dl[1]/dd/ul[2]/li[1]/label')

soup = BeautifulSoup(driver.page_source, 'html.parser')
item_list = soup.find('ul', attrs = {'class':'item_list item_list_all'})
sub_items = item_list.find_all('li', attrs = {'class':'sub_item normal_item'})
cnt = len(sub_items))

for i in cnt:
	driver.find_element(By.CLASS_NAME, 'sub_item normal_item'.click()
lists = soup.find_all("div", attrs={'class': 'prod_info'})
url_boxes = []
for url_box in url_boxes:
	url = list.find("a")["href"]
            url_boxes.append(url)
for url_box in url_boxes :
	driver.get(url_box)
profile
개마케터로써의 삶

0개의 댓글