#1-4 경마 데이터 수집하기 - 경주 결과 웹크롤링 하기

목차

    2017. 8. 26. 10:43

    경마
    경마

    그럼 이제 하나의 경주 결과를 크롤링 해 보겠습니다. 웹크롤링(crawling)을 위해서는 HTML의 구조를 잘 아는 것이 도움이 됩니다. 하지만 여기서는 HTML에 대한 자세한 설명은 생략하겠습니다. 이미 인터넷에 잘 설명된 문서가 많습니다. 크롬에서 HTML문서 구조를 확인하는 방법부터 알아보겠습니다.

     

     

    크롬_개발자도구
    크롬의 '개발자 도구' 이용해서 확인하는 모습

     

    1. 경마 경기 결과 위치 확인

    크롬에서 HTML문서의 구조를 확인하기 위해서는 '개발자도구'를 이용해야 합니다. 개발자 도구를 이용하는 방법은 렛츠런 파크 싸이트에 접속한 후, 메뉴에서 '도구 더보기'를 클릭합니다. 그리고 '개발자 도구'를 선택합니다. 단축키로 'F12'를 눌러도 바로 확인할 수 있습니다. ( 참조: 렛츠런파크 경기결과 싸이트 보기 )

     

    HTML_테그_찾기
    웹페이지에서 표 위치 찾기

     

    개발자 도구를 선택하면 우측에 HTML코드를 볼 수 있는 화면이 나옵니다. 여기에서 표를 그리는 HTML의 코드 위치를 찾기 위해 아래와 같이 합니다.

    1. 화살표 모양의 아이콘을 클릭
    2. 표가 있는 곳을 클릭
    3. 개발자 도구에서 HTML 태그 데이터 확인

     

    위의 방법으로 경기 결과표의 HTML 태그 위치를 찾았습니다. 참고로 HTML에서 표를 그리기 위해서는 <table>태그를 이용합니다. <div>는 영역을 지정하는 태그인데, 여기서는 그리 중요하지는 않습니다. 해당 태그 부분을 가져오면 경기결과를 가져올 수 있습니다. 이제 파이썬을 실행하고 경기결과를 크롤링해 보겠습니다.

     

     

    2. 파이썬 코드 작성

    우선 필요한 패키지를 import 해야 합니다. 패키지는 특정 기능들을 누군가 미리 작성해 놓은 것이라고 보면 됩니다. import라는 구문을 이용해서 해당 패키지를 가져오면, 해당 기능을 이용하여 편리하게 코딩할 수 있습니다.

    # coding=UTF-8

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    from html_table_parser import parser_functions as parser

     

    # coding = UTF-8은 코드에서 한글을 사용하기 위해, 코드의 인코딩을 지정하는 구문입니다. 코딩할 때 한글을 사용하려면 이 문구를 반드시 실행해야 합니다. 거의 사용구로 봐도 무방하겠습니다. 매번 입력하는 것이 귀찮다면 파이참의 코드 템플릿 기능을 이용하여, 미리 입력해놓은 템플릿을 불러다가 쓸 수도 있습니다.

     

    렛츠런파크-입장권-온라인-구매
    렛츠런파크-입장권-온라인-구매

     

    다음 urlopen은 렛츠런 파크 싸이트의 url에 접속하기 위한 라이브러리입니다. 웹크롤링을 위해서 반드시 사용해야 하는 라이브러리입니다. from문은 특정 라이브러리에서 한 부분만을 불러와서 사용할 때 사용하는 구문입니다. urllib.request에서 urlopen 이라는 부분만 불어와서 사용하겠다는 뜻입니다.

     

    from bs4 import BeautifulSoup이라는 구문도 bs4에서 BeautifulSoup이라는 라이브러리를 불러오겠다는 내용입니다. BeautifulSoup은 HTML태그를 함수를 이용해서 효과적으로 파싱할 수 있게 도와주는 라이브러리입니다. 이 역시 웹크롤링에서 반드시 사용해야 합니다.

     

    as 구문은 불러온 라이브러리의 별칭을 지정하는 구문입니다. 라이브러리를 사용할 때 불러온 라이브러리명을 다 입력해야 하는데, 이게 귀찮으니 별칭을 붙이고 사용합니다. parser_functions를 불러올 때, as구문을 붙여주었기 때문에 앞으로는 parser라고 입력해서 해당 라이브를 사용할 수 있습니다.

    html_table_parser는 HTML table태그를 긁어와서, 파이썬 데이터 프레임으로 저장할 때 유용하게 사용됩니다. 파이썬 데이터 프레임은 데이터 분석을 용이하게 도와주는 데이터 구조입니다.

     

    url=" http://race.kra.co.kr/raceScore/ScoretableDetailList.do?meet=1&realRcDate=20170723&realRcNo=1 "
    result = urlopen(url)
    html = result.read()
    soup = BeautifulSoup(html, 'html.parser')

     

    다음으로 url을 변수에 입력합니다. 렛츠런파크 싸이트에서는 특정 날짜의 경기 결과를 확인하기 위해 url주소에 날짜를 지정할 수 있습니다. 위의 url의 ? 뒤부분은 우리가 원하는 경기결과를 찾기 위해서, 변수를 지정하는 부분이라고 보면 됩니다. 주소의 meet=1이라는 것은 서울경마장을, realRcDate=20170723은 2017년 7월 23일을, realRcNo=1은 첫 번째 경기결과를 보고 싶다는 의미입니다. urlopen을 이용해서 해당 주소에 연결하고, read라는 함수로 HTML을 읽어옵니다.

     

    읽어온 HTMl을 BeautifulSoup을 이용해서 파싱합니다. soup에 저장된 값을 출력하면 아래와 같습니다.

     

    In[10]: soup

    Out[10]: 
    <!DOCTYPE doctype html>
    <!--141210--><html lang="ko"><!--//141210-->
    <head>
    <meta content="IE=edge" http-equiv="X-UA-Compatible"/>
    <meta charset="utf-8"/>
    <title>경마정보 | 서울경마</title>
    <meta content="" name="description"/>
    <link href="/images/letsrunico.ico" rel="shortcut icon"/>
    <link href="/css/common.css" rel="stylesheet" type="text/css"/>
    <link href="/css/sub.css" rel="stylesheet" type="text/css"/>
    <script src="/js/jquery-1.9.1.min.js" type="text/javascript"></script>
    <script src="/js/common.js" type="text/javascript"></script>
    <script src="/js/jquery.extend.js" type="text/javascript"></script>
    <script src="/js/jquery.cookie.js" type="text/javascript"></script>
    </head>

    <body>
    <p id="skipNavi">
    <a href="#gnb">전체메뉴로 가기</a>
    <a href="#lnb">상세메뉴로 가기</a>
    <a href="#contents">컨텐츠로 가기</a>
    <a href="#footer">사이트 정보로가기</a>
    </p>
    <div id="wrap">
    <!--header-->
    <div id="header">
    <!--공통 유틸-->
    <div class="utilmenu">
    <!--141023-->
    <dl>
    <dt class="haze">경마사이트링크</dt>
    <dd>
    <a href="/fromRouter.do?url=https://www.kra.co.kr/index.jsp" target="comp" title="새창열림"><img alt="기업정보" src="/images/common/menuUtil11.png"/></a>
    </dd>
    <dd>

     

    soup이라는 변수에 위와 같이 HTML 코드가 저장돼 있습니다. 이제 우리가 필요한 정보만 가져와야 합니다. 처음에 표시한 경기 결과표를 가져와 보겠습니다.

    아래와 같이 find_all함수를 이용하면, TABLE태그로 지정된 곳만 뽑아서, 배열 형태로 저장됩니다. 아래의 예에서 temp[0]로 하면, 가장 먼저 table태그가 사용된 곳의 코드를, temp[1]로 하면 두 번째 table태그가 사용된 곳의 코드를 가져옵니다. 우리가 필요로 하는 테이블은 3번째 테이블입니다.

     

    temp = soup.find_all('table')
    print(temp[2])

     

    이제 html_table_parser를 이용해서 pandas 데이터프레임 형태로 저장해 보겠습니다.

     

    import pandas as pd
    p=parser.make2d(temp[2])
    df=pd.DataFrame(p[1:],columns=p[0])

     

    데이터프레임을 사용하기 위해서, pandas 라이브러리를 불러옵니다. parser.make2d를 이용하면 HTML의 table 태그가 파이썬의 list 데이터 구조로 변환됩니다. 해당 결과를 데이터프레임으로 변환하면 작업이 끝납니다.

     

    파이썬 웹크롤링으로 HTML의 표 데이터를 가져와 보았습니다. 파이썬의 패키지를 이용해서 작업은 어렵지 않게 할 수 있었습니다.

     

    다음에는 url의 파라미터를 조정하여, 다수의 경기결과를 크롤링하여 DB로 만들고자 합니다. 자세한 내용이 궁금하다면, 아래 포스팅을 참조해보시기 바랍니다. ( 참조: 다수의 경주결과를 크롤링하여 DB화 하기

     

    경주결과 데이터를 수집하는 코드를 수정해 보았습니다. MySQL DB에 저장하고 코드를 좀 다듬었습니다. 자세한 내용은 아래 포스팅을 참조하기 바랍니다. ( 참조: 파이썬 웹크롤링, 경마 경기결과 데이터 수집하는 방법은?! )