[PYTHON] Holen Sie sich alle Live-Tweets von professionellen Baseball

Einführung

Ich habe in meiner Universitätsforschung Live-Tweets über Baseball gesammelt und sie zusammengefasst. Ich schreibe hauptsächlich über das Scraping von Geschichten und das Erhalten vieler Tweets mit Tweepy.

2019 Professional Baseball (NPB) Live-Tweet

Wir werden die Ergebnisse der weiteren Erfassung von Live-Tweets des professionellen Baseballs (NPB) von 2019 mit Hashtags jeden Tag veröffentlichen. Ich habe die Python-Datei jeden Tag mit cron ausgeführt und sie ein Jahr lang erhalten.

スクリーンショット 2019-10-16 15.21.44.png

Die gesuchten Hash-Tags lauten wie folgt. Möglicherweise sind aktive Hash-Tags vorhanden, die noch nicht gefunden wurden. Ist es in Hanshin "#tiger van"?

Serigu Pacific League
Riese #kyojin, #giants Japanischer Schinken #lovefighters
Chunichi # dragons Softbank #sbhawks
Hiroshima #carp Rakuten #rakuteneagles
Yakult #swallows,#yakultswallows Seibu #seibulions
Hanshin #hanshin,#tigers Lotte #chibalotte
DeNA #baystars ORIX #Orix_Buffaloes

Übersicht über die Live-Tweet-Erfassung

1. Holen Sie sich die Spielkarte / Spielzeit des Zieltages

Erhalten durch Scraping von Websites, die aktuelle Sportnachrichten liefern.

--Scraping Ziel - SPORTS BULL(https://sportsbull.jp/stats/npb/) --Sports Navi (von Yahoo! JAPAN) (https://baseball.yahoo.co.jp/npb/schedule/)

2. Holen Sie sich Live-Tweets von Hashtags, indem Sie den Zeitpunkt des Spiels angeben

ID und Hash-Tag jedes Teams (Suchanfrage)

Hashtag-Wörterbuchobjekt (tag_list) Schlüssel: team_id von mir selbst gesetzt item: Hash-Tag (Abfrage bei der Suche nach Tweets)

tag_list = {0: '#kyojin OR #giants', 1: '#dragons',\
            2: '#carp', 3: '#swallows OR #yakultswallows',4: '#hanshin OR #tigers',\
            5: '#baystars', 6: '#lovefighters', 7: '#sbhawks',8: '#rakuteneagles',\
            9: '#seibulions', 10: '#chibalotte', 11: '#Orix_Buffaloes'}

Implementierung

Veröffentlicht auf github → hier

Spezifikationsbibliothek (Python)

Die diesmal verwendete Bibliothek lautet wie folgt. Bitte installieren Sie entsprechend.

getLiveTweet_NPB.py


from urllib.request import urlopen
import tweepy
from datetime import timedelta
import time
import sqlite3
from contextlib import closing
import datetime
from bs4 import BeautifulSoup
import urllib.request as req

Holen Sie sich eine Matchkarte

SPORTS BULL(https://sportsbull.jp/stats/npb/) Verschrotten des gespielten Spiels an dem von angegebenen Datum und der Uhrzeit. Sie können es von Sponavi erhalten, aber dieses hat eine einfachere HTML-Struktur.

getLiveTweet_NPB.py



def get_gameteamId(gamedate):
    url = 'https://sportsbull.jp/stats/npb/home/index/' + gamedate
    print(url)
    res = req.urlopen(url)
    soup = BeautifulSoup(res, 'html.parser')
    q = soup.select('.game-block a')
    gameId_list = []
    flag_list = [1 for i in range(12)]
    i = 0
    for p in q:
        urls = p.get('href')
        #Verarbeitung bei Abbruch
        p_ = p.select('.st-03')
        for p__ in p_:
            if 'Stornieren' in str(p__.text):
                print('Stornieren')
                flag_list[i] = 0
                flag_list[i+1] = 0
        if flag_list[i] == 1:
            print(urls[-10:])
            gameId_list.append(urls[-10:])
        i += 2
    print('flag_list: ',flag_list)
    q = soup.select('.game-block .play-box01 dt')
    teamId_list = []
    teamId_dict = {'Riese': 0, 'Chunichi': 1, 'Hiroshima': 2, 'Yakult': 3, 'Hanshin': 4, 'DeNA': 5,
                  'Japanischer Schinken': 6, 'Softbank': 7, 'Rakuten': 8, 'Seibu': 9, 'Lotte': 10, 'ORIX': 11}
    i = 0
    for p in q:
        if flag_list[i] == 1:
            teamId_list.append(teamId_dict[p.text])
        i += 1
    return gameId_list, teamId_list


#Datum
def get_date(days_ago):
	date = datetime.date.today()
	date -= datetime.timedelta(days=days_ago)
	date_str = str(date)
	date_str = date_str[:4]+date_str[5:7]+date_str[8:10]
	return date_str


#Beispiel--------------------------
n = 1
game_date = get_date(n) #Automatisch(Daten vor n Tagen abrufen)
game_date = '20200401' #Manuelle Eingabe
print(game_date,'Daten abrufen für,')
# -----------------------------

#Liste der Spiel-IDs und Team-IDs
gameteamId_list = get_gameteamId(game_date)
gameId_list = gameteamId_list[0]
teamId_list = gameteamId_list[1]
print('gameId_list:',gameId_list)
print('teamId_list:',teamId_list)

Beispiel für das Ausführungsergebnis

Daten für 20200401 abrufen
https://sportsbull.jp/stats/npb/home/index/20200401
flag_list: [1,1,1,1,0,0,0,0,0,0,0,0]
gameId_list: [2020040101,2020040102]
teamId_list: [0,1,2,3]

in diesem Fall, Giant (Heim) gegen China (Auswärts) bei gameId = 2019040101 Hiroshima (Heim) gegen Yakult (Auswärts) bei gameId = 2019040102 Das Match wurde abgehalten

Holen Sie sich die Start- und Endzeiten des Spiels

Yahoo! Sponavi (https://baseball.yahoo.co.jp/npb/schedule/) Jede Match-Seite https://baseball.yahoo.co.jp/npb/game/[game_id]/top Da die Startzeit und die Spielzeit entnommen werden können, addieren Sie sie, um die Start- und Endzeit zu erhalten.

getLiveTweet_NPB.py



#Holen Sie sich Start- und Endzeiten von Spielen durch Schaben
def gametime(game_id):
    url = 'https://baseball.yahoo.co.jp/npb/game/' + game_id + '/top'
    res = req.urlopen(url)
    soup = BeautifulSoup(res, 'html.parser')
    time = []

    #Startzeit
    css_select = '#gm_match .gamecard .column-center .stadium'
    q = soup.select(css_select)
    time.append(q[0].text[-6:-4])
    time.append(q[0].text[-3:-1])

    #Endzeit
    minutes = []
    while True:
        try:
            css_select = '#yjSNLiveDetaildata td'
            q = soup.select(css_select)
            minutes = q[1].text.split('Zeit')
            minutes[1] = minutes[1][:-1]
            break
        except:
            continue
    time = time + minutes
    return time

↑ Ausgabe dieser Funktion

#Startzeit 18:00, wenn die Spielzeit 3 Stunden und 15 Minuten beträgt
[18,0,21,15]

Suche nach Twitter API

Holen Sie sich alle Tweets rechtzeitig mithilfe der Suche auf der Twitter-API. Da mit einer Anfrage 100 Tweets erfasst werden können, wiederholen Sie diese. Wenn Sie im API-Limit stecken bleiben, halten Sie an und warten Sie 15 Minuten.

Das Ziel sind Tweets vom Spielbeginn bis 5 Minuten nach Spielende.

getLiveTweet_NPB.py



# TwitterAPI
APIK = 'consumer_key'
APIS = 'consumer_secret'
AT = 'access_token'
AS = 'access_token_secret'
auth = tweepy.OAuthHandler(APIK, APIS)
auth.set_access_token(AT, AS)
api = tweepy.API(auth)

#Twitter API-Suche
def search_livetweet(team_num, api, game_id, query):
    print(query)    #Holen Sie sich von den neuesten Tweets
    print('Suchseite: 1')
    try:
        tweet_data = api.search(q=query, count=1)
    except tweepy.TweepError as e:
        print('Fehler: 15 Minuten warten')
        time.sleep(60 * 15)

    tweet_data = api.search(q=query, count=100)
    table_name = 'team' + str(team_num)
    #Diese Funktion dient zum Speichern in der Datenbank
    saveDB_tweet(table_name, 0, tweet_data, game_id)
    print('************************************************\n')
    next_max_id = tweet_data[-1].id

    page = 1
    while True:
        page += 1
        print('Suchseite:' + str(page))
        try:
            tweet_data = api.search(q=query, count=100, max_id=next_max_id - 1)
            if len(tweet_data) == 0:
                break
            else:
                next_max_id = tweet_data[-1].id
                #Diese Funktion dient zum Speichern in der Datenbank
                saveDB_tweet(table_name, page - 1, tweet_data, game_id)
        except tweepy.TweepError as e:
            print('Fehler: 15 Minuten warten')
            print(datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
            print(e.reason)
            time.sleep(60 * 15)
            continue
        print('*'*40 + '\n')


#Zeit angeben → Abfrage erstellen → Tweet-Suchfunktion (Suche)_livetweet())
def get_livetweet(team_id, game_id):
    date = game_id[:4] + '-' + game_id[4:6] + '-' + game_id[6:8]
    time = gametime(game_id)
    sh, sm = time[0], time[1]
    eh = int(time[0]) + int(time[2])
    em = int(time[1]) + int(time[3]) + 5  #5 Minuten nach dem Ende
    if em >= 60:
        em -= 60
        eh += 1
    eh = '{0:02d}'.format(eh)
    em = '{0:02d}'.format(em)
    
    print(date, sh, sm, eh, em)
    tag_list = {0: '#kyojin OR #giants', 1: '#dragons',\
            2: '#carp', 3: '#swallows OR #yakultswallows',4: '#hanshin OR #tigers',\
            5: '#baystars', 6: '#lovefighters', 7: '#sbhawks',8: '#rakuteneagles',\
            9: '#seibulions', 10: '#chibalotte', 11: '#Orix_Buffaloes'}
    tag = tag_list[team_num]
    query = tag + ' exclude:retweets exclude:replies\
            since:' + date + '_' + sh + ':' + sm + ':00_JST \
            until:' + date + '_' + eh + ':' + em + ':59_JST lang:ja'
    search_livetweet(team_id, api, game_id, query)

Führen Sie nun die obige Funktion aus

Holen Sie sich Tweets von zwei Teams für jedes Spiel aus der oben erstellten gameId_list und teamId_list.

getLiveTweet_NPB.py



for i in range(len(gameId_list)):
    game_id = gameId_list[i]

    #away
    team_id = teamId_list[2*i+1]
    get_livetweet(team_id, game_id)
    print('='*60 + '\n')

    #home
    team_id = teamId_list[2*i]
    get_livetweet(team_id, game_id)
    print('='*60 + '\n')

abschließend

Wenn das Spiel durch Regen unterbrochen wird, können möglicherweise nicht alle Tweets abgerufen werden. Es scheint, dass eine Verbesserung notwendig ist.

Der Teil, um Tweets durch Angabe der Zeit zu erhalten, kann in jeder Domain verwendet werden, daher hoffe ich, dass er hilfreich ist.

Recommended Posts

Holen Sie sich alle Live-Tweets von professionellen Baseball
Holen Sie sich viele Ihrer Tweets mit Tweepy
Holen Sie sich viele Twitter-Tweets auf einmal
Methode zum Abrufen aller Schlüssel des verschachtelten Diktats
[Python] Ermittelt die Anzahl der Aufrufe aller veröffentlichten Artikel
Löschen Sie alle Ihre Tweets
Holen Sie sich Tweets mit Tweepy
Ruft alle IP-Adressen von Instanzen in der Autoscaling-Gruppe ab