Selenium을 활용한 Web Crawling으로 Database만들기
먼저 축구 선수의 연봉 예측을 해보아야 겠다고 생각한 후, 가장 먼저 한 것은 Db(database)를 만드는 것 입니다. 물론 캐글등에서 잘 정제되어 있는 자료를 사용 할 수도 있지만, 공부할겸, Selenum을 활용해 직접 웹에서 데이터를 가져왔습니다.
(저는 pycharm에서 진행하였습니다.)
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
import time
먼저 사용할 모듈, 함수들을 import 해줍니다.
각각 함수의 의미와 사용방법은 뒤에 쭉 나열하며 설명하겠습니다.
chrome_options = webdriver.ChromeOptions()
#브라우저가 중간에 꺼지는 것을 방지
chrome_options.add_experimental_option('detach',True)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()) , options = chrome_options)
크롬으로 진행을 하였고, 자신이 원하는 옵션을 설정할 수 있습니다. 가령 'Headless'모드, 창크기 조절, 그래픽 카드 사용 가속여부 등을 설정 할 수 있습니다.
#전체창으로 실행
driver.maximize_window()
#설정한 사이트로 이동
driver.get('https://www.premierleague.com/stats/top/players/total_scoring_att')
#잠깐 부팅 시간 기다려주기
time.sleep(1)
자료는 프리미어 리그 사이트의 자료를 사용했습니다.
이제 사이트에 접근했으므로, 자료에 접근하는 방법을 알아보겠습니다.
위 사이트를 접근하면 이런 화면이 뜹니다.
이때 사이트 내에 모든 눈에 보이는 것들은 그들의 각각의 주소를 가지고 있습니다. F12(크롬 개발자 모드)를 누르면
다음과 같은 개발자 모드가 나오게 되는데 왼쪽 위 동그라미 친 곳을 클릭 후, 아까 사이트에서 Wayne Rooney을 클릭하면
다음과 같이 뜨게 됩니다. 정확한 의미는 HTML문법을 알아야 하니 생략하고 쉽게 말하면 그 창에 있는 수많은 데이터 중 내가 누른 데이터에 해당하는 부분이라고 생각하면 됩니다. 끝에 우리가 원하는 정보인 Wayne Rooney라는 글도 보입니다.
이제 저 파란 부분을 우클릭 한후, copy에 들어가게 되면 Xpath라는것이 보입니다. 우리가 원하는 그 정보의 주소입니다.
누르게 되면 복사가 완료되고, 이제 Ctrl+V를 하면 저 부분에 해당하는 주소를 반환하게 됩니다. 이제 원하는 데이터의 주소를 얻었으니 파이참으로 돌아와서
print(driver.find_element(By.XPATH, '//*[@id="mainContent"]/div[2]/div[2]/div[3]/nav/ul/li[4]/a').text)
이런 함수를 작성해볼건데, find_element()는 주소로 데이터에 접근할때 쓰는 함수이며 이때 다른주소로도 접근을 할 수 있지만 저는 Xpath로 했으므로, By.Xpath라고 작성해 주었습니다. 그리고 오른쪽의 주소는 방금 복사한 그 주소 입니다.
여기까지가 이 'Wayne Rooney'라는 데이터에 접근하는 방식이고 웹스크롤을 할때 쓰는 두가지 함수에 대해 알아보면, 크게 .text와 .click() 이 있습니다. 함수명에서 성격이 보이듯이 text는 그에 해당하는 문자를 반환하는 함수이고, click은 클릭하는 함수입니다. 이름 데이터에서 필요한건 문자이기 때문에 .text를 하고 이를 확인하기 위해 print를 하고 실행하면
다음과 같이 출력되게 됩니다.
이렇게 데이터의 접근하는 방법은 알았지만 우리가 하나하나 손으로 치지않고 셀레니움을 사용하는 이유는 자동으로 대량의 데이터를 가져오고자 함일 것 입니다. 이때 데이터들의 주소의 규칙을 찾는다면 한번에 여러 데이터들을 가져올 수 있기 때문에 굉장히 중요합니다.
예들들면 위 사진과 같이 아래로 내려오는 항목들의 주소들 사이에선 오른쪽숫자가 증가하고 있는것을 확인할 수 있고,
오른쪽으로 넘어가는 주소들 사이에선 오른쪽에서 두번째 숫자가 증가하고 있는것을 확인 할 수 있었습니다.
그래서 다음과 같이 이중포문과 포맷 함수를 사용해 자동화를 시켰고,
다음과 같이 선수들의 데이터들을 얻을 수 있었습니다.
다음은 얻은 데이터들의 전처리에 대해 포스팅 하도록 하겠습니다.