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.
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!
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!
Mit pip eintreten
#Für pip
pip install request, beautifulsoup4, numpy
#Für pipenv
pipenv install request beautifulsoup4 numpy
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
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'>
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
print(type(soup))
# output
# <class 'bs4.BeautifulSoup'>
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
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
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! !! ** ** **
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
Recommended Posts