*파이썬, 주피터노트북 설치가 안되어있다면 아래 url참고

https://vmpo.tistory.com/entry/python-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4anaconda-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-%EC%9C%88%EB%8F%84%EC%9A%B0-10

 

 

프리미어리그 전체 팀 순위 정보를 크롤링해보도록 하겠습니다.

아래 사이트에서 순위정보가 확인이 가능한데요.

https://sports.news.naver.com/wfootball/record/index.nhn?category=epl

 

네이버 스포츠

스포츠의 시작과 끝!

sports.news.naver.com

 

해당 웹페이지에서 조회되는 데이터는 html페이지가 렌더링된 이후에 자바스크립트 단에서 뭔가 조작이 일어나고 있어,

단순히 html페이지만 요청해서 가져오는 request모듈로는 정상적으로 조회를 할 수 없는 상황입니다.

 

requests모듈로 호출을 해보면, 

div 영역을 확인 할 수 있는 id속성 (wfootballTeamRecordBody) 으로 조회를 해보겠습니다.

div 태그 내부에 정보가 존재하지 않습니다.

이럴 경우, Selenium 라이브러리 사용이 필요합니다.

 

Selenium 라이브러리 준비


아래 커멘드로 selenium 라이브러리 설치를 해줍니다.

 

설치가 완료되었다면, (크롬은 설치되어 있다고 가정하겠습니다, Selenium은 크롬설치가 되어있어야 합니다.)

 

아래 사이트에서 웹드라이버를 설치해줍니다. 

http://chromedriver.chromium.org/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

chromedriver.chromium.org

 

크롬 버전 확인은 아래 참고 부탁드립니다.

 

이제 크롤링을 위한 준비가 완료되었습니다.

 

 

 

Selenium + BeautifulSoup으로 크롤링 하기


일단 아래 코드를 입력후 실행해줍니다.

 

<복사코드>

from selenium import webdriver
import requests
from bs4 import BeautifulSoup
 
path = "C:\dev532\python\chromedriver.exe" #webdriver 설치 경로를 입력해주세요
 
driver.implicitly_wait(3)
 
page = driver.page_source
premi_team_rank_list =  BeautifulSoup(page,"html.parser")
team_rank_list = premi_team_rank_list.select('#wfootballTeamRecordBody>table>tbody')
team_rank_list
 
 

 

Selenium은 python코드로 크롬 브라우저를 하나 열어 해당 브라우저를 통해 특정 액티비티를 제어하는 라이브러리 입니다.

브라우저를 띄워서 제어하기 때문에 다양한 기능들을 구현할 수 있습니다.

python코드로 로그인해서 mypage 데이터 크롤링하기 등의 request모듈로 제한되었던 기능이 구현 가능합니다.

 

또한, 웹브라우저를 통해 렌더링이 완료된 페이지를 조회 할 수 있기 때문에, javascript단에서 제어되었던 데이터까지 조회가 가능합니다.

 

위 코드를 실행하면 브라우저가 하나 실행되면서 프리미어리그 정보 페이지로 이동합니다.

이후 렌더링이 완료된 웹페이지의 데이터를 긁어서 출력해줍니다.

 

아래는 주피터 노트북으로 실행해보면 결과입니다.

1위 팀의 정보인 리버풀 상세정보를 확인 할 수 있게 되었습니다.

나머지 전체 팀의 정보만 파싱해서 보여주면 되겠네요.

 

완성된 코드입니다.

먼저 options 영역은 크롬창을 띄우지 않고 실행하기 위한 설정 작업입니다. headless라는 설정을 주는 작업입니다.

이후 webdriver를 통해 url을 호출해주고, 

beautifulSoup으로 페이지를 파싱해 줍니다.

#출력내용

실제 순위와 비교하니 동일한 것을 확인 할 수 있습니다.

<복사코드>

from selenium import webdriver
import requests
from bs4 import BeautifulSoup
 
options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('window-size=1920x1080')
options.add_argument("disable-gpu")
 
path = "C:\dev532\python\chromedriver.exe" #webdriver 설치 경로를 입력해주세요
driver.implicitly_wait(3# seconds
 
 
page = driver.page_source
premi_team_rank_list =  BeautifulSoup(page,"html.parser")
team_rank_list = premi_team_rank_list.select('#wfootballTeamRecordBody>table>tbody>tr')
 
for team in team_rank_list:
    num = team.select('.num > div.inner > strong')[0].text
    name = team.select('.name')[0].text    
    print(num +"위 : " + name)
 

 

LIST
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기