경마 예상 모델을 만드는 데 selenium을 사용한 스크래핑을 배웠다.

소개



 
지난번에 계속해서 netkeiba.com으로부터의 경마 데이터를 사용해 예상 프로그램을 만들고 있습니다. 예상 프로그램을 만드는 것보다, 스크래핑의 내용을 배울 수 있었으므로 비망으로 정리합니다.

Pandas를 사용하여 경마 데이터베이스를 검색했습니다.
h tps:// 퀵했다. 소 m/문 OA씨/있어 MS/1c1C429746아3아0아 d055

경마 예상 프로그램 자체는 이쪽의 동영상을 봐 주세요. 매우 정중하게 해설되어 있어 초학자라도 충분히 이해할 수 있습니다.

경마 예상으로 시작하는 데이터 분석 · 기계 학습
htps //w w. 요츠베. 코 m / 짱 l / u CDzw

javascript로 작성된 장소의 스크래핑 (Selenimum 활용)


html 로부터 출주표나 마명, 기수등의 정보를 취할 때에 pandas 를 활용해 취득할 수 있는 것은 전회 정리했습니다. 이것만으로는 충분하지 않을 수 있습니다. javascript 에 기술되어 있는 부분에 대해서는, 스크래핑에 한 번 걸어야 합니다.

Selenium이란?


Selenium 는 웹 브라우저의 조작을 자동화하기 위한 프레임워크입니다. Chrome 에서도 FireFox 에서도, IE 등에서도 사용할 수 있는 것 같습니다. 이번에는 Chrome를 사용합니다.



여기에서 Chrome 버전 selenium을 다운로드하십시오.
from selenium.webdriver import Chrome, ChromeOptions
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

URL 열기



간단히 URL을 여는 방법은 다음과 같습니다.

options= ChromeOptions()
driver = Chrome(executable_path=r'(chromedriver.exe)のパスを指定下さい',options=options)
driver.get(url)

여기에 choromedriverpath를 넣습니다. 시스템 환경설정에서 choromedriverpath 를 지정하면 이 프로그램상에서의 기술은 필요하지 않지만, 설정해도 동작하지 않았습니다. 따라서 일부러executable_path를 지정합니다.

출주 정보를 취하는 클래스 정의



아래에 출주 정보를 스크래핑하는 클래스를 정의합니다. pandas 데이터 프레임에 넣습니다.

from tqdm import tqdm_notebook as tqdm
import pandas as pd
import time

class ShutubaTable:
    def __init__(self):
        self.shutuba_table = pd.DataFrame()

    def scrape_shutuba_table(self, race_id_list):
        options= ChromeOptions()
        driver = Chrome(executable_path=r'C:\Users\lllni\Documents\Python\20200528_keiba\chromedriver_win32\chromedriver.exe',options=options)
        for race_id in tqdm(race_id_list):
            url = 'https://race.netkeiba.com/race/shutuba.html?race_id=' + race_id
            driver.get(url)
            elements = sample_driver.find_elements_by_class_name('HorseList')
            for element in elements:
                tds = element.find_elements_by_tag_name('td')
                row = []
                for td in tds:
                    row.append(td.text)
                    if td.get_attribute('class') in ['HorseInfo', 'Jockey']:
                        href = td.find_element_by_tag_name('a').get_attribute('href')
                        row.append(re.findall(r'\d+', href)[0])
                self.shutuba_table = self.shutuba_table.append(pd.Series(row, name=race_id))
        time.sleep(1)
        driver.close()


포인트로서,

1) 'HorseList` 클래스에 원하는 데이터가 들어 있기 때문에 다음과 같이 꺼낸다.
elements = sample_driver.find_elements_by_class_name('HorseList')

 


2) td 태그마다 말명, 확률 등 각각의 정보를 꺼낸다.
for element in elements:
  tds = element.find_elements_by_tag_name('td')
  row = []
  for td in tds:
     row.append(td.text)
    self.shutuba_table = self.shutuba_table.append(pd.Series(row, name=race_id))



td 태그를 각각 나열하여 javascript에 설명된 정보도 검색할 수 있습니다. 또한 element 는 말별입니다. 즉, 말이 바뀔 때마다 row 는 비워져 td 태그의 정보가 또 처음부터 넣을 수 있는 것입니다.

 

인스턴스화 및 로드


st = ShutubaTable1()
sample_driver = Chrome(executable_path=r'C:\Users\lllni\Documents\Python\20200528_keiba\chromedriver_win32\chromedriver.exe',options=options)
sample_driver.get(url
st.scrape_shutuba_table(['202005030211'])#予想したいrace_idを入れる
st.shutuba_table


레이스 id는 netkeiba.com이면 출주표의 URL의 말미에 수치가 들어가 있으므로, 보고 싶은 레이스 id의 수치만 꺼내 붙여 주세요.



무사히 꺼낼 수 있었습니다.

끝에



스크래핑에 대한 또 하나의 이해가 깊어졌습니다.

 

좋은 웹페이지 즐겨찾기