はじめに
プロ野球の成績(打率や打点など)を毎日自動で投稿するtwitter botを作っていきます.
使用する技術は主に以下の3つです.
- twitterへの投稿
- webスクレイピング
- 定期的な自動投稿
#参考
使用する技術に関しては記事にしていますので, 適宜参照してください.
- twitterへの投稿 -TweepyでTwitterに投稿する
- webスクレイピング -pythonでwebスクレイピング
- 定期的な自動投稿 -scheduleライブラリで定期的にTwitterの検索andいいね
#実践
実際のコードは以下のようになります.
とりあえずセリーグのみです.
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import tweepy
import schedule
import time
# 先ほど取得した各種キーを代入する
CK="Consumer Key"
CS="Consumer Secret"
AT="Access Token"
AS="Access Token Secret"
# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)
api = tweepy.API(auth)
def job():
# ループ用word
words = ['打率', '本塁打', '打点', '盗塁', '失策']
for word in words:
# URL指定用の辞書
web_dic = {'打率':1, '本塁打':9, '打点':13, '盗塁':20, '失策':22}
# 成績index指定用の辞書
list_dic = {'打率':3, '本塁打':10, '打点':12, '盗塁':19, '失策':26}
# 成績指定
seek = str(word)
web_num = web_dic[seek]
list_num = list_dic[seek]
# URL指定
url = "https://baseball.yahoo.co.jp/npb/stats/batter?series=1&type="+str(web_num)
# Responseオブジェクト生成
response = requests.get(url)
# 文字化け防止
response.encoding = response.apparent_encoding
# BeautifulSoupオブジェクト生成
soup = BeautifulSoup(response.text, "html.parser")
# 取得した情報を書き込む用のファイル
f = open('grade.txt', 'w')
# タグを取得
elems = soup.find_all("div", id='odr_play')
# 順にファイルへ書き込み
for i in elems:
f.write(i.text)
f.close()
### 以下, 取得した情報を整理しているのみ
grade = [[] for i in range(10)]
f = open('grade.txt', 'r')
lines = f.readlines()
flag =False
f.close()
num = 0
grade[0].append('1')
check = '2019年'
for line in lines:
line = line.strip()
if line == '':
continue
elif check in line:
start = line.find('2') # 最初の文
end = line.find('新') # 最後の文
date = line[start:end+1] # 更新日を格納
elif num > 9:
break
elif flag == True:
grade[num].append(line)
if len(grade[num]) == 27:
num = num+1
elif line == str(1):
flag = True
print('セリーグ'+str(seek)+'順位')
print(date)
tweet = []
for i in range(10):
print(str(grade[i][0])+" "+str(grade[i][1])+str(grade[i][2])+" "+grade[i][list_num])
tweet.append(str(grade[i][0])+" "+str(grade[i][1])+str(grade[i][2])+" "+grade[i][list_num])
# 好きな言葉をツイート
api.update_status('【セリーグ'+str(seek)+'順位】'+'\n'+str(date)+'\n'+tweet[0]+'\n'+tweet[1]+'\n'+tweet[2]+'\n'+tweet[3]+
'\n'+tweet[4]+'\n'+tweet[5]+'\n'+tweet[6]+'\n'+tweet[7]+'\n'+tweet[8]+'\n'+tweet[9])
schedule.every().day.at("23:59").do(job)
while True:
schedule.run_pending()
time.sleep(1)
実行しておくと, 毎日自動で更新してくれます.
パリーグに関しても, URLに少し変更を加えるだけです.
これをベースにして, 投手成績バージョンも作ってみようと思います.