본문 바로가기
IT/Python

python 크롤링 part.4

by 성준하이 2022. 2. 21.
반응형

저번 포스팅에 이어서 이번엔 단순 네이버 뉴스 정보 가져오기나 검색이 아닌

특정 카페에서 내가 필요한 정보를 가져오는 작업을 해볼것이다.

 

예를들어, 중고나라에서 당신이 '맥북'에 대한 정보를 가져오고 싶을때 할수 있는 방법이다.

 

근데 여기서 의문점이 든다.

일반 검색이랑 똑같이 하고 진행하면 되는것 아닌지? 하고 말이다.

 

하지만 part.3에서는 단일 페이지 안에 있는 데이터를 가져왔다고 하면 이번엔 네이버 중고나라 카페 등에서는 iframe이라는 것을 사용하여 페이지 안에 또다른 페이지를 띄우는 형식인데, 그렇게 되어있을 경우 가져올수 있도록 해볼 것이다.

 

일단 저번시간 까지 했다면 중고나라 사이트에 들어가고 검색 칸에다가 '맥북' 이라고 검색해서 나오는 창까지는 만들수 있을 것이다.

코드는 다음과 같다.

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('./chromedriver')
driver.get('https://cafe.naver.com/joonggonara')

elem = driver.find_element_by_id('topLayerQueryInput')
elem.send_keys('맥북')elem.send_keys(Keys.ENTER)

이제 이렇게 해서 나온 페이지를 f12를 눌러서 개발자 도구를 연후 파악해보도록 한다.

 

그럼 그림과 같이 이 태그를 가져와야한다.

하지만 바로 위에도 보이는것처럼 article-board는 2개가 있고 검색을 해도 총 2개인것을 알수 있다.

 

여기가 이번 포스팅의 핵심이다.

그러면 여기서

divtag = driver.find_elements_by_class('article-board')

로 이름이 article-board인 elements 를 가져온 후에

value = divtag[1] 으로 해서 잡게 된다.

근데 여기서 list index out of range 오류가 난다.

 

개발을 해보신분들은 알겠지만 리스트의 크기 이상의 데이터를 요구하면 이런 에러가 난다.

 

즉 divtag가 2개가 안된다는 뜻이다. 그리하여 f12를 잘 살펴보니 중간에 html 태그가 새롭게 나오고 iframe이라는 태그가 나온다.

html태그는 창을 시작할때 작성해주는 태그인데 글 중간에 있다.

 

위에 언급했듯이 중고나라에 검색을 하면 페이지위에 새로운 페이지가 덮어씌워지는 구조인데 덮어쓰기 전의 페이지에서 article-board라는 태그를 찾으니까 없다는 것이다.

 

그렇다면 지금 잡혀있는 위치를 덮어쓰운 페이지로 옮겨야한다. 덮어씌워진 페이지는 iframe이라고 하고 여기로 경로를 옮기기 위해서는 iframe을 찾은다음에 그 iframe으로 switch_to 메서드를 사용하여 옮겨준다.

 

지금 보면 iframe의 id는 cafe_main 이므로 이렇게 코딩한다.

iframe = driver.find_element_by_id('cafe_main')
driver.switch_to.frame(iframe)

그러면 지금부터 driver를 통해서 태그를 찾으면 이 iframe안에서만 찾게 된다.

바꿔 말하면 다시 밖으로는 못나간다. 밖의 데이터는 미리미리 정리해둬야한다.

 

이렇게 코드를 써주고 다시 

articleboard = driver.find_elements_by_class_name('article-board')
print(articleboard[1].text)

이렇게 해보면 잘 출력이 된다.

 

다음은 이어서 첫번쨰 articleboard를 확대해보면 값들이 tr 태그에 묶여있는것을 알수 있다.

그냥 trtag = value.find_element_by_tag_name('tr') 

이라고 한 후에 저번 포스팅 처럼 텍스트를 가져오면 될것만 같다.

 

하지만 이렇게 해서 돌려보면 에러가 나온다.

 

이유는 여러곳의 위치에 tr이 존재하기 때문이다.(바로 옆에 작성자 부분이나 작성자 , 조회 등 각 표의 컬럼이 전부 사용된다.)

 

그러기 위해서는 상대경로 개념의 find_elements_by_xpath 메서드를 사용하고 파라미터 값으로는 현재 위치(.) 부터 그 곳까지의 경로를 적어주면 된다.

 

그렇게 받아와서 반복문으로 잘 출력을 해보면 글들만 정확히 출력이 되는것을 볼수 있다.

trtags = articleboard[1].find_elements_by_xpath('./table/tbody/tr')
for tr in trtags :
      article = tr.find_element_by_class_name('article')
      print(article.text)
반응형

'IT > Python' 카테고리의 다른 글

python 크롤링 part.6  (31) 2022.02.23
python 크롤링 part.5  (26) 2022.02.22
python 크롤링 part.3  (47) 2022.02.20
python 크롤링 part.2  (30) 2022.02.19
python 크롤링 part.1  (59) 2022.02.18

댓글