プロ野球の打者成績を毎日自動投稿するtwitter botを作る


はじめに

プロ野球の成績(打率や打点など)を毎日自動で投稿するtwitter botを作っていきます.
使用する技術は主に以下の3つです.
1. twitterへの投稿
2. webスクレイピング
3. 定期的な自動投稿

参考

使用する技術に関しては記事にしていますので, 適宜参照してください.
1. twitterへの投稿 -TweepyでTwitterに投稿する
2. webスクレイピング -pythonでwebスクレイピング
3. 定期的な自動投稿 -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に少し変更を加えるだけです.

これをベースにして, 投手成績バージョンも作ってみようと思います.