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.
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.
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 |
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/)
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'}
Veröffentlicht auf github → hier
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
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
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]
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)
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')
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