[Python] Praktisch schöne Suppe ~ Kratzen Sie die Triple Single Odds-Tabelle auf der offiziellen Website des Bootsrennens ~

Zweck

Die Datenerfassung ist mühsam, nicht wahr? Ich wollte in Zukunft Bootsrennen analysieren, um Daten zu sammeln Quotenübersicht auf der offiziellen Website für Bootsrennen = 02 & hd = 20200511) wird abgekratzt.

Überblick

Was Sie kratzen möchten und wie Sie ausgeben

ファイル名 ↑ Dies ist eine dreifache Tabelle! Wenn Sie gerne spielen, sollten Sie es gesehen haben! Aus dieser Abbildung möchte ich den Wert abrufen, ihn zu einem Python-Wörterbuchtyp machen und ihn wie folgt aufrufen!
print('sample1:', three_rentan_odds_dict['1']['2']['3'])
print('sample2:', three_rentan_odds_dict['6']['5']['4'])

# output:
# sample1: 47.2
# sample2: 285.7

Natürlich ist der Listentyp in Ordnung, aber der Wörterbuchtyp ist schneller zugänglich, und die Reihenfolge im Array spielt keine Rolle, also graben Sie hier nicht zu viel ein!

Vorbereitungen

Die Entwicklung verwendet Python3.7, aber ich denke, Sie können mit jeder 3er Serie gehen! Es könnte einfacher sein, mit Jupiter oder so etwas zu kopieren und einzufügen!

Zu installierendes Paket

Mit pip eintreten

#Für pip
pip install request, beautifulsoup4, numpy

#Für pipenv
pipenv install request beautifulsoup4 numpy

Was Sie überhaupt nicht tun sollten

Handlungen, die den anderen Server belasten

Unbeabsichtigt oder unbeabsichtigt ** Den anderen Server niemals belasten **. Es gibt auch Fälle von Verhaftung. Insbesondere ist es in Ordnung, den hier eingeführten Quellcode so zu kopieren und einzufügen, wie er ist, und ihn nur einmal auszuführen. Wenn Sie jedoch versuchen, die Informationen des gesamten Zeitplans mit der Anweisung ** for zu löschen, wird die Belastung des Servers erhöht. Bitte tun Sie dies nicht, da dies zu Unannehmlichkeiten führen kann **. Es scheint, dass das Scraping zum Zwecke der Datenanalyse nicht illegal ist. Weitere Informationen hier

Implementierung

Importieren Sie HTML durch Angabe der URL

from urllib.request import urlopen
from bs4 import BeautifulSoup
#Am Beispiel der Triple Single Odds-Tabelle des 12. Rennens der Toda Racecourse am 11. Mai 2020
target_url = \
    'https://www.boatrace.jp/owpc/pc/race/odds3t?rno=12&jcd=02&hd=20200511'
#Lesen Sie HTML
html_content = urlopen(target_url).read()
print(type(html_content))

# output
# <class 'bytes'>

Laden Sie mit schöner Suppe zum Schaben

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
print(type(soup))

# output
# <class 'bs4.BeautifulSoup'>

Verwenden Sie die von beautifulsoup bereitgestellte Auswahlmethode.

In der select -Methode können Sie den angegebenen CSS-Selektor verwenden, um die Position des HTML-Tags für das Scraping anzugeben. Dieses Mal möchte ich den Teil der Quotenliste des Tripletts herausnehmen. Verwenden Sie daher das Überprüfungstool des Browsers, um den CSS-Selektor des Zielorts abzurufen. Speziell

  1. Bewegen Sie den Cursor auf die Tabelle und klicken Sie mit der rechten Maustaste, um ** Verification ** zu öffnen (Ich denke, F12 ist in Ordnung, aber ich benutze die Maus, weil Tilix mit F12 startet). ファイル名
  2. Wenn Sie mit der Maus über das HTML des Überprüfungstools fahren, wird der entsprechende Teil der HTML-Beschreibung auf der Seite gestrickt. Suchen Sie also den Ort, an dem der Tabellenteil ausgewählt ist. Dateiname
  3. Klicken Sie mit der rechten Maustaste auf dieses Timing und wählen Sie Kopieren-> Kopierauswahl Dateiname
  4. Bereiten Sie die Variable target_table_selector vor und fügen Sie sie ein.
#Fügen Sie den kopierten CSS-Selektor ein
target_table_selector = \
    'body > main > div > div > div > '\
    'div.contentsFrame1_inner > div:nth-child(6) > table'

# select_Rufen Sie das mit der einen Methode angegebene HTML ab
odds_table = soup.select_one(target_table_selector)
print(type(odds_table))

# output:
# <class 'bs4.element.Tag'>
# print(odds_table)Wenn Sie ausführen, wird HTML nur des angegebenen Tabellenteils angezeigt

Extrahieren Sie Elemente aus der Gewinnchancen-Tabelle

Wenn Sie sich das Verifizierungswerkzeug des Browsers ansehen, das wir zuvor gesehen haben, wird zum Extrahieren der Elemente nur der Teil "tbody" in der "Odds_table" benötigt. Geben Sie ihn daher mit "select_one" an. Um dann jede Zeile als Liste zu speichern, geben Sie mit select den Teil'tr' an und machen Sie daraus eine Liste.

#Spezifikation des Körpers
odds_table_elements = odds_table.select_one('tbody')

#Geben Sie tr an und speichern Sie es als Liste
row_list = odds_table_elements.select('tr')
print(len(row_list))

# output:
# 20 :Entspricht der Anzahl der Zeilen in der Tabelle

Wenn wir als nächstes auf das Tag achten, das den Wert der Quoten speichert, die die Elemente sind, können wir sehen, dass es sich um eine Klasse namens "OddsPoint" im td-Tag handelt. ファイル名 Da wir dies für jede Zeile extrahieren möchten, erstellen Sie zuerst eine Funktion.

#Verarbeitung für jede Zeile
def getoddsPoint2floatlist(odds_tr):
    #Rufen Sie die HTML-Liste des Teils ab, in dem der Quotenwert gespeichert ist
    html_list = odds_tr.select('td.oddsPoint')
    print(html_list[0])
    # example output:
    # <td class="oddsPoint">47.2</td>
    #Mithilfe von Text können Sie nur die Elemente extrahieren, die von Tags umgeben sind
    text_list = list(map(lambda x: x.text, html_list))
    # print(text_list)
    # example output:
    # ['47.2', '60.3', '588.7', '52.8', '66.0', '248.7']
    #Da Odds ein Dezimalwert ist, wandeln Sie ihn in den Float-Typ um
    float_list = list(map(
        lambda x: float(x), text_list))
    return float_list

Verwenden Sie die Kartenfunktion, um eine Matrix zu generieren, die nur die Elemente der gesamten Tabelle extrahiert

odds_matrix = list(map(
    lambda x: getoddsPoint2floatlist(x),
    row_list
))

print(odds_matrix)

# output
# [[47.2, 60.3, 588.7, 52.8, 66.0, 248.7],
#  [14.7, 13.3, 994.9, 361.6, 363.8, 1276.0],
#  [12.0, 11.1, 747.7, 67.1, 137.8, 503.6],
#  [26.7, 26.6, 1155.0, 96.5, 123.7, 414.5],
#  [157.0, 188.8, 566.8, 50.4, 64.3, 241.5],
#  [242.2, 215.7, 660.5, 261.5, 314.5, 1037.0],
#  [237.5, 190.8, 561.6, 36.4, 66.8, 183.4],
#  [403.5, 281.1, 926.8, 49.2, 73.1, 183.6],
#  [35.0, 25.4, 1276.0, 750.0, 930.3, 2462.0],
#  [219.2, 152.2, 959.6, 517.5, 799.1, 1950.0],
#  [59.6, 23.6, 963.4, 650.0, 1139.0, 1779.0],
#  [89.4, 38.4, 1433.0, 639.7, 1237.0, 2321.0],
#  [34.6, 23.8, 1019.0, 63.9, 119.7, 387.5],
#  [212.5, 143.8, 752.3, 36.9, 64.1, 174.3],
#  [76.3, 30.5, 1231.0, 270.8, 452.2, 952.1],
#  [79.6, 35.8, 1614.0, 44.9, 84.1, 244.4],
#  [83.7, 90.6, 2031.0, 110.1, 171.1, 391.8],
#  [356.3, 308.5, 1552.0, 63.2, 103.9, 201.7],
#  [159.7, 77.7, 1408.0, 326.7, 560.3, 1346.0],
#  [136.0, 69.0, 1562.0, 71.4, 148.1, 285.7]]

** Damit ist das Schaben abgeschlossen! !! ** ** **

Bonus: Im Wörterbuchtyp speichern

Dies ist kein wesentlicher Bestandteil des Schabens, daher werde ich eine ausführliche Erklärung weglassen.

import numpy as np
#numpy Array
odds_matrix = np.array(odds_matrix)
#Nehmen Sie die Inversion, verbinden Sie sich und listen Sie auf
odds_list = list(odds_matrix.T.reshape(-1))

#In einem Wörterbuch speichern
three_rentan_odds_dict = {}
for fst in range(1, 7):
    if fst not in three_rentan_odds_dict.keys():
        three_rentan_odds_dict[str(fst)] = {}
    for snd in range(1, 7):
        if snd != fst:
            if snd not in three_rentan_odds_dict[str(fst)].keys():
                three_rentan_odds_dict[str(fst)][str(snd)] = {}
            for trd in range(1, 7):
                if trd != fst and trd != snd:
                    three_rentan_odds_dict[str(fst)][str(snd)][str(trd)] = \
                        odds_list.pop(0)

print('sample1:', three_rentan_odds_dict['1']['2']['3'])
print('sample2:', three_rentan_odds_dict['6']['5']['4'])

# output:
# sample1: 47.2
# sample2: 285.7

Komplett

Recommended Posts

[Python] Praktisch schöne Suppe ~ Kratzen Sie die Triple Single Odds-Tabelle auf der offiziellen Website des Bootsrennens ~
[Python3] Verstehe die Grundlagen von Beautiful Soup
[Python] Eine Tabelle mit Beautiful Soup kratzen
Scraping Mitgliederbilder von der offiziellen Website der Sakamichi Group
Tischkratzen mit schöner Suppe
[Python] Ein Memorandum der schönen Suppe4
Kratzen mit Python und schöner Suppe
Website-Scraping mit Beautiful Soup in Python
[Python] Ruft das Datum der letzten Aktualisierung der Website ab
Zum Zeitpunkt des Python-Updates mit Ubuntu