반응형

오늘은 파이썬을 이용해서 네이버 스포츠의 농구 일정을 크롤링 하는 프로그램을 짜보겠습니다.

먼저 오늘 크롤링 할 네이버 농구 일정 페이지입니다.

먼저 크롤링하기전에 주소를 찾습니다.

sports.news.naver.com/basketball/schedule/index.nhn?date=20210224&month=02&year=2021&teamCode=&category=kbl

그리고 사이트구조를 크롬의 f12키를 통해서 찾아봅니다.

경기 일정은 DIV로 묶여져 있는데요.

치사하게 div class를 두개로 구분해놨습니다. class가 sch_tb와 sch_tb2로 구분되어 있습니다.

일단 여기까지 크롤링하는 프로그램을 짜보면, 

bs4, request, 저장하기 위해서 pandas를 부르구요

from bs4 import BeautifulSoup
import requests
import pandas as pd

address = "https://sports.news.naver.com/basketball/schedule/index.nhn?date=20210224&month=02&year=2021&teamCode=&category=kbl"
request = requests.get(address)
html = request.text
soup = BeautifulSoup(html, 'html.parser')
soupData = [soup.findAll("div", {"class" : "sch_tb"}), soup.findAll("div", {"class" : "sch_tb2"})] #sch_tb랑 tb2둘다 저장

주소를 적고 request를 통해서 불러옵니다.

soup를 통해서 html을 구분하구요.

findAll을 통해서 class가 sch_tb, sch_tb2인 것을 모두 불러옵니다.

여기까지 실행을 해서 print 해보면 제가 원하는 부분을 파싱해 왔음을 알 수 있습니다.

이제 개별 항목들을 불러와야 하는데요.

항목중에 rowspan이 정의되어 있습니다. 이게 하루에 있는 경기 수인데요.

1이면 그날 한경기 3이면 그날 3경기, 4이면 4경기, 5면 경기가 없는날입니다. 

이에 따라서 분기가 생겨야 겠네요. rowspan이 5인경우에는 남자프로농구 경기가 없습니다라고 표시됩니다.

실제로 웹브라우저에서도 이렇게 보여집니다.

그리고 각각의 변수를 찾으면 되는데요. 각각의 변수는 아래와 같습니다.

td_date = 경기일
td_hour = 경기시간
team_lft = 홈팀
team_rgt = 원정팀
td_stadium = 경기장

그러면 나머지 코드는 이를 따라서 코딩하면 됩니다.

그리고 마지막 출력은 판다스로 DataFrame을 만들어서 출력하면 됩니다.

저는 아래와 같은 방식으로 출력하였습니다.

df = pd.DataFrame(dataList)    #pandas로 출력        
df.T.to_csv('basket.csv', encoding='cp949')   #csv파일 출력  

실제 2월 전체 출력하면 아래와 같습니다.

basket.csv
0.00MB

그럼 잘 사용하시길

반응형

  • reply profile image

    파이섭

    코딩하신 내용 인상 깊게 봤습니다^^ 저도 스포츠 경기 결과를 크롤링 해보는 중인데 혹시 조언 좀 구할 수 있을까요?

    • reply profile image

      dorudoru

      저도 초보라서요 도움이 될지 모르겠습니다.. 페이지 형태를 보시고 판단하시면 되구요. 제가 포스팅한 다른 코드도 참고하셔서 코딩하시면 도움이 될것 같습니다. https://dorudoru.tistory.com/1672

    • reply profile image

      파이섭

      감사합니다^^

      Edit/Delete Address 2021.06.09 11:02
  • reply profile image

    isfj파린이

    안녕하세요. 스포츠 일정 크롤링을 해보고 싶어서 찾던 중 너무 도움되는 곳을 찾았네요ㅎㅎ 국내축구 일정은 농구와 다르게 되어 있는 것 같은데..혹시 몇가지 여쭤볼 수 있을까요?

    • reply profile image

      dorudoru

      어떤 부분이 안되시는 것일까요?

    • reply profile image

      isfj파린이

      우선 페이지 자체가 동적 html로 되어 있는게 아닌지 싶어서요.
      data = soup.find("div", {"class" : "schedule_month_table"})
      으로 프린트해보면 모든 값들이 다 나오지 않는 것으로 확인했습니다. 그리고 농구 일정과 축구 일정이 다르게 만들어져 있어서 말씀주신 코드를 사용할 수 없는게 아쉽네요ㅜㅜ 혹시 축구 일정은 어떻게 시도를 해야 하는지 알려주실 수 있으실까요?

      Edit/Delete Address 2022.01.23 23:54
    • reply profile image

      dorudoru

      맞습니다. 축구는 완전 다르게 생겨서 크롤링이 이런 방식으로는 안되는것 같습니다 ㅠ

복사했습니다!