Just Fighting

웹 크롤링하기 2 (Selenium) 본문

Python

웹 크롤링하기 2 (Selenium)

yennle 2022. 2. 8. 23:40
728x90

BeautifulSoup을 이용한 웹 크롤링을 했을 때, 잘 되지 않는 부분을 해결하기 위해

Selenium을 사용해 크롤링을 해보았다.

 

BeautifulSoup을 이용한 크롤링 링크 ▼

2022.01.12 - [Web/백엔드] - 웹 크롤링하기

 

 

from selenium import webdriver

search_url = "크롤링할 사이트 url"

browser = webdriver.Chrome('크롬드라이버 위치')  # chromedriver 다운받고, 다운 받은 경로 써주어야함
browser.get(search_url)

browser.implicitly_wait(2)

''' 크롤링 코드 '''

browser.close()

이 코드가 틀이되는 코드라고 할 수 있다.

크롬드라이버를 다운받고, 크롤링할 사이트 url를 붙여 넣으면 크롤링할 준비 완료다!

 

browser.find_element(속성, '속성값')
browser.find_elements(속성, '속성값')

앞으로 이 함수를 사용해 필요한 정보를 크롤링할 것이다.

첫번째는 하나를 찾는 함수고, 두번째는 여러개를 찾는 함수라고 생각하면 된다.

 

date = browser.find_elements(By.CLASS_NAME, "card_date__1kdC3")

이 코드는 "card_date__1kdC3"라는 클래스 이름을 가진 여러 element들을 찾겠다는 의미가 된다.

이 element들은 배열로 리턴된다. print()해보면 어떤 형식으로 반환되는지 알 수 있다.

클래스 이름 뿐 아니라 id, 태그명 등 다양한 속성이 있기 때문에 필요하면 찾아서 쓰면 될 것 같다!

 

 

 

 

< 사용 예시 >

https://game.naver.com/esports/schedule/lck?date=2022-01 

이 홈페이지에서는 lck의 일정과 결과를 보여준다.

여기서 날짜, 팀1, 팀2, 스코어를 뽑아내려고 한다.

코드를 작성하기 전에 먼저 필요한 데이터를 하나하나 뜯어보자.

 

 

 

위와 같은 방식으로 이 정보를 얻을 수 있었다.

날짜 -> div.card_date__1kdC3

팀명 -> span.row_name__IDFHz

스코어 -> span.row_score__2RmGQ

 

 

from selenium import webdriver
from selenium.webdriver.common.by import By


search_url = "https://game.naver.com/esports/schedule/lck?date=2022-01"

browser = webdriver.Chrome('c:/chromedriver/chromedriver.exe')  # chromedriver 다운받고, 다운 받은 경로 써주어야함
browser.get(search_url)

browser.implicitly_wait(2)

date = browser.find_elements(By.CLASS_NAME, "card_date__1kdC3")

for i in range(5):
    print(date[i].text)

browser.close()

얻은 정보들을 이용해 테스트로 프린트문을 몇개 작성해 보았다.

이런식으로 데이터를 얻을 수 있다는 것을 알았으니 이제 내가 원하는 데이터를 추출해보자

 

 

from selenium import webdriver
from selenium.webdriver.common.by import By


search_url = "https://game.naver.com/esports/schedule/lck?date=2022-01"

browser = webdriver.Chrome('c:/chromedriver/chromedriver.exe')  # chromedriver 다운받고, 다운 받은 경로 써주어야함
browser.get(search_url)

browser.implicitly_wait(2)

date = browser.find_elements(By.CLASS_NAME, "card_date__1kdC3")
name = browser.find_elements(By.CLASS_NAME, "row_name__IDFHz")
score = browser.find_elements(By.CLASS_NAME, "row_score__2RmGQ")

for i in range(len(date)):
    k = 4 * i
    for j in range(0,4,2):
        print(date[i].text, name[k + j].text, score[k+j].text, ':', score[k+j+1].text, name[k + j + 1].text)

browser.close()

이렇게 내가 원하는 데이터를 뽑았다.

하지만 처음에 그냥 대충 짜본 코드이기 때문에

만약 하루에 경기가 하나이거나 3개 이상이라면 오류가 날 것이다.

 

 

 

그래서 다른 방법을 이용해 크롤링을 하고자 코드를 변경했다.

계속 반복되기 때문에 조금 많은 for문을 이용해 데이터를 크롤링하고자했다.

홈페이지를 보면 빨간색 박스가 계속 반복되는 양상을 보이고,

빨간색 박스 안에는 날짜와 경기들이 포함되어 있다.

그리고 두번째 주황색 박스 안에는 각 경기가 있고,

그 각 경기 안에는 경기를 치루는 두 팀의 이름이 명시되어 있다.

 

그리고 박스의 클래스 명을 구했다.

빨간색 박스 -> card_item__3Covz

주황색 박스1 (날짜) -> card_date__1kdC3

주황색 박스2 (경기들) -> card_list__-eiJk

노랑색 박스 -> row_item__dbJjy

초록색 박스 -> row_name__IDFHz

 

from selenium import webdriver
from selenium.webdriver.common.by import By


search_url = "https://game.naver.com/esports/schedule/lck?date=2022-01"

browser = webdriver.Chrome('c:/chromedriver/chromedriver.exe')  # chromedriver 다운받고, 다운 받은 경로 써주어야함
browser.get(search_url)

browser.implicitly_wait(2)

oneday = browser.find_elements(By.CLASS_NAME, "card_item__3Covz")

for i in range(len(oneday)):
    date = oneday[i].find_element(By.CLASS_NAME, "card_date__1kdC3").text
    games = oneday[i].find_elements(By.CLASS_NAME, "card_list__-eiJk")

    for j in range(len(games)):
        teams = games[j].find_elements(By.CLASS_NAME, "row_item__dbJjy")

        for k in range(len(teams)):
            team1 = teams[k].find_elements(By.CLASS_NAME, "row_name__IDFHz")[0].text
            team2 = teams[k].find_elements(By.CLASS_NAME, "row_name__IDFHz")[1].text
            print(date, team1, team2)

browser.close()

 

 

for문을 3번이나 사용하면서 코드를 짜서 너무 복잡했지만,

비슷한 구조를 가졌지만 다른 데이터가 있는 홈페이지의 데이터를 크롤링해도 문제없이 잘 수행되었다.

 

 

 

 

728x90
Comments