개발은 처음이라 개발새발

[selenium] 셀레니움으로 크롤링 해보기 - 네이버 축구 순위 2편 본문

파이썬/크롤링

[selenium] 셀레니움으로 크롤링 해보기 - 네이버 축구 순위 2편

leon_choi 2022. 6. 6. 11:37
반응형

지난 글에서 네이버 분데스리가 팀순위 페이지까지 연동하는 것을 해봤는데요. 코드는 아래와 같습니다. 

from selenium import webdriver
import pandas as pd
    
#open webdriver
chrome_driver = './chromedriver.exe'
driver = webdriver.Chrome(chrome_driver)

df_bundes_team = pd.DataFrame(columns = ['rank', 'team', 'game', 'win_pt', 'win', 'draw', 
                                         'lose', 'gf', 'ga', 'goal_diff'])

bundes_football = "https://sports.news.naver.com/wfootball/record/index?category=bundesliga&tab=team"
driver.get(bundes_football)
driver.implicitly_wait(3)

 

이제 본격적으로 데이터를 긁어와야 합니다. 이를 위해서 반드시 필요한 것은 두가지인데요. 첫번째는 반복문을 사용하기 위해 필요한 해당 테이블의 길이(len)입니다. 

위에 이미지를 보게되면 오른쪽에 처음보는 화면이 있을 텐데요. 바로 현재 분데스리가 팀순위 테이블의 html 구조를 볼 수 있는 공간입니다. 이동 경로는 마우스 우클릭 → 검사를 클릭하면됩니다. 팁이 있다면 크롤링을 좀 더 원할하게 하기 위해서는 html의 구조를 공부하는 것을 추천드립니다. html의 문장 구조를 공부해야 자신이 원하는 데이터를 뽑아낼 때 좀 더 빠르게 파악할 수 있습니다. 

 

다시 위 그림을 보시면 1위에 해당되는 row 전체가 파랗게 돼 있습니다. 그리고 1위에 대한 내용을 담고 있는 태그에도 파란 박스가 쳐져 있는데요. 여기를 우클릭하면 Copy라는 항목이 있고 다양한 Copy목록이 있습니다.

이중에서 저는 "Copy selector"를 선택해 붙여넣기를 해보도록 하겠습니다.  

 

" #wfootballTeamRecordBody > table > tbody > tr:nth-child(1) "

이런 형태를 띄는데요. 2위를 복사해보면 " #wfootballTeamRecordBody > table > tbody > tr:nth-child(2) " 으로 

#wfootballTeamRecordBody > table > tbody > tr 이라는 공통점을 갖고 있습니다.  이를 가지고 길이를 구하면 되는데요. 1위부터 18위까지 총 18줄이니 len() 함수 역시 18이 나오면 됩니다. 이때 사용하는 것이 driver.find_elements_by_css_selector() 함수입니다.
 
여기서 elements와 element가 있는데 이것은 복수, 단수로 간단하게 생각하시면 됩니다. 우리는 테이블 전체의 길이를 구해야 하니 elements를 사용합니다.  맨위 코드와 이어보겠습니다. 
from selenium import webdriver
import pandas as pd
    
#open webdriver
chrome_driver = './chromedriver.exe'
driver = webdriver.Chrome(chrome_driver)

df_bundes_team = pd.DataFrame(columns = ['rank', 'team', 'game', 'win_pt', 'win', 'draw', 
                                         'lose', 'gf', 'ga', 'goal_diff'])

bundes_football = "https://sports.news.naver.com/wfootball/record/index?category=bundesliga&tab=team"
driver.get(bundes_football)
driver.implicitly_wait(3)

tr_len = len(driver.find_elements_by_css_selector('#wfootballTeamRecordBody > table > tbody > tr'))
print(tr_len)

맨아래 18이라는 숫자가 나왔네요. 정답입니다. 테이블의 길이를 구한 이유는 바로 반복문을 활용하기 위함인데요. 다음 편에는 tr_len을 이용한 반복문을 통해 테이블을 긁어오도록 하겠습니다. 

반응형