LoginSignup
9
13

More than 3 years have passed since last update.

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

Posted at

はじめに

プロ野球の成績(打率や打点など)を毎日自動で投稿する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)

実行しておくと, 毎日自動で更新してくれます.
スクリーンショット 2019-05-25 23.37.59.png
パリーグに関しても, URLに少し変更を加えるだけです.
スクリーンショット 2019-05-25 23.41.25.png

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

9
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
13