【Python】NBAの試合情報を取得してLINEに通知【コピペOK】

一部プロモーションを含みます

Pythonスクレイピング-コード解説-NBA速報

Pythonで、NBAの試合結果をスクレイピングで取得し、LINEに通知するプログラムを作成してみました。

今回スクレイピングに使ったサイトは、Yahoo!さんが提供している スポーツナビ(sportsnavi) からNBAの試合情報を取得しましたので、参考にしてみてください。

コピペして使うもよし!ちょっと改良して使うも良しです!

では解説していきます。

こんな方におすすめ

  • PythonでNBAの試合日程を自動で取得したい人!
  • Pythonで1円でも稼いでみたい人!
  • Pythonでスクレイピングの練習がしたい人!
  • スポーツナビから試合情報が取得できなくなった人!

NBAの試合情報をスクレイピングするプログラム全貌【コピペOK!】

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions
import requests
import time
import datetime

options = ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

browser = webdriver.Chrome('chromedriver',options = options)

browser.get('https://sports.yahoo.co.jp/basket/nba/schedule/')
time.sleep(2)

#ifram内をスクレイピングするための宣言
iframe = browser.find_element_by_id("widget-schedule")
browser.switch_to.frame(iframe)

hometeam_ls = []
awayteam_ls = []
game_ls = []

game_elem = browser.find_elements(By.CSS_SELECTOR,'#js-widget > div > section > table > tbody > tr')
for game in game_elem:
  gamedate = game.find_element(By.CSS_SELECTOR,'td.ba-tableGame__data.ba-tableGame__data--date').text
  if gamedate[-5] == '\n':
    b = gamedate[-4:]
  else:
    b = gamedate[-5:]
 
  b = datetime.datetime.strptime(b,'%H:%M') + datetime.timedelta(hours=9)
  gamedate = b.strftime('%-I:%M')
  #print(gamedate)
  hometeam = game.find_element(By.CSS_SELECTOR,'td:nth-child(2)').text
  awayteam = game.find_element(By.CSS_SELECTOR,'td:nth-child(4)').text
  game_ls.append(gamedate+' ' + hometeam+'VS'+awayteam)

  hometeam_ls.append(game.find_element(By.CSS_SELECTOR,'td:nth-child(2)').text)
  awayteam_ls.append(game.find_element(By.CSS_SELECTOR,'td:nth-child(4)').text)

#メッセージ文を作成
game_schedule = '\n'.join(game_ls)

##LINEで通知を送る
#必要な変数を設定
#取得したトークン
TOKEN = 'あなたのトークン'
#APIのURL
api_url = 'https://notify-api.line.me/api/notify'
#送りたい内容
send_contents = 'TodayGames\n' + game_schedule

TOKEN_dic = {'Authorization': 'Bearer' + ' ' + TOKEN} 
send_dic = {'message': send_contents}
print(TOKEN_dic)
print(send_dic)

requests.post(api_url, headers=TOKEN_dic, data=send_dic)



プログラム解説

それでは実際にプログラムの解説をしていきます。プログラムの流れは大きく分けて以下の5つです。

プログラムの流れ

 

  1. パッケージのインポート
  2. Webdriverの起動
  3. iframeタグ内の操作をする宣言
  4. 試合情報取得
  5. Lineで送信

パッケージのインポート

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions
import requests
import time
import datetime

ライブラリとかパッケージとかモジュールとか、Pythonのプログラムを作成するのに使う、便利道具みたいなものをまずは「コレを使います!」と宣言するところから始めます。

今回使用するライブラリは、主にSeleniumとrequests、timeとdatetimeの4つです。

日程を取得するために、Seleniumを用い、datetimeで整形、LINEで通知するときにrequestsを使います。

使用パッケージ一覧

 

  • selenium → スクレイピング用
  • requests → LINEに通知を送る用
  • time → seleniumの補助
  • datetime → スクレイピングしたデータを整形するときに使う用

Webdriverの起動

#Webdriverの起動
options = ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

browser = webdriver.Chrome('chromedriver',options = options)

上記のコードではSeleniumにてWebdriverを起動しています。今回NBAの試合日程をスクレイピングするには、BeautifulSoupではなく、Seleniumを使用しました。理由は後ほど出てくるiframeタグのせいです。

Seleniumはブラウザの操作ができるパッケージで、動的なWebサイトもスクレイピングできるのでかなり便利です。

options = ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

あたりは、Webdriverの設定を予めしており、ヘッドレスモードで開いて〜とか、処理速度を向上させる設定にしているだけなので気にしないでください。

最後の1行 browser = webdriver.Chrome('chromedriver',options = options) でWebdriverを起動している。厳密にはChromedriverを起動しています。

NBAの試合情報が載っているサイト(スポナビ)へアクセス

#スポナビへアクセス
browser.get('https://sports.yahoo.co.jp/basket/nba/schedule/')
time.sleep(2)

#ifram内をスクレイピングするための宣言
iframe = browser.find_element_by_id("widget-schedule")
browser.switch_to.frame(iframe)

今回NBAの試合日程をスクレイピングするのにお邪魔したのがヤフーが提供しているスポーツ情報サイト「Sports Navi(スポナビ)」というサイト。

そして、スポナビの試合日程は、Javascriptでカレンダー表示されているタイプのため、iframeタグ内を操作する必要があります。

そんな時は、switch_to.frame('iframeタグの要素') を使って「iframe内を操作する宣言」をする必要があります。

スポナビから試合日程をスクレイピングしていく

hometeam_ls = []
awayteam_ls = []
game_ls = []

game_elem = browser.find_elements(By.CSS_SELECTOR,'#js-widget > div > section > table > tbody > tr')
for game in game_elem:
  gamedate = game.find_element(By.CSS_SELECTOR,'td.ba-tableGame__data.ba-tableGame__data--date').text
  if gamedate[-5] == '\n':
    b = gamedate[-4:]
  else:
    b = gamedate[-5:]
 
  b = datetime.datetime.strptime(b,'%H:%M') + datetime.timedelta(hours=9)
  gamedate = b.strftime('%-I:%M')
  #print(gamedate)
  hometeam = game.find_element(By.CSS_SELECTOR,'td:nth-child(2)').text
  awayteam = game.find_element(By.CSS_SELECTOR,'td:nth-child(4)').text
  game_ls.append(gamedate+' ' + hometeam+'VS'+awayteam)

  hometeam_ls.append(game.find_element(By.CSS_SELECTOR,'td:nth-child(2)').text)
  awayteam_ls.append(game.find_element(By.CSS_SELECTOR,'td:nth-child(4)').text)

早速試合情報を取得していきます。

ホームチームを格納するリストと、アウェイチームを格納するリスト。最後に試合情報をひとまとめにするリストを作成するところから始めています。

スクレイピングに慣れていない人は、こちらの記事を参考にスクレイピングできるようにしていくのがおすすめです。

合わせて読みたい

スクレイピングスキルを身に付けるUdemy講座
本よりお得にスクレイピング習得!おすすめのUdemy講座3選

続きを見る

LINEに通知を送る

#メッセージ文を作成
game_schedule = '\n'.join(game_ls)

##LINEで通知を送る
#必要な変数を設定
#取得したトークン
TOKEN = 'あなたのトークン'
#APIのURL
api_url = 'https://notify-api.line.me/api/notify'
#送りたい内容
send_contents = 'TodayGames\n' + game_schedule

TOKEN_dic = {'Authorization': 'Bearer' + ' ' + TOKEN} 
send_dic = {'message': send_contents}
print(TOKEN_dic)
print(send_dic)

requests.post(api_url, headers=TOKEN_dic, data=send_dic)

取得した試合日程を少しメッセージように整形して、LINEに通知しましょう。

「あなたのトークン」と書かれている箇所にあなたのLine notify で発行したトークンを入れるだけでOKです。

Line notifyでトークンを発行する方法を確認していきましょう。

LINE Notify にアクセス

LINE Notify トップページ

まずはLINE Notifyでアカウントを作成していきましょう。

右上のログインから自身のLINEアカウントにログインしてあげるだけでOK。

ログインすると、右上の「ログイン」と書かれていた箇所が自身のアカウント名に変わっているはずですので、そちらをクリックすると「マイページ」に飛ぶことができます。

トークンの発行

Line notify トークン発行画面

下の方にスクロールすると「アクセストークンの発行」という見出しがあるので、その下部の「トークンを発行する」をクリック。

トークン名と、どこのグループに送信するかの2点を決めたら「発行する」をクリックしましょう。

ちなみにトークン名は、通知を送信した際に一番上にタイトルのような感じで[トークン名]が毎回つきますのでタイトルを設定するイメージです。今回の場合、「今日のNBAの試合日程」というトークン名にしておきました。

「1:1でLINE Notifyから通知を受け取る」を選択すると、自分のラインへLINE Notifyというアカウントから通知が送られてきます。今回はこちらを選択しています。

発行したトークンをコピー

「発行する」をクリックすると一度だけトークンが表示されます。

厄介なのが1度しか表示されないので後で忘れてしまった時や、間違えて消してしまった場合は再発行が必要になってしまいます。

しっかりコピーして必要であればメモもしておくことをおすすめします。

コピーしたトークンを「’あなたのトークン’」へコピペしてあげるとLINE Notifyから通知が来るようになっています。

まとめ

今回作成したプログラムは、スポナビから、NBAの試合情報を取得して、試合が終わっていたら試合結果も取得できるようなプログラムでした。

こちらをHerokuを使うことで、毎日定期的にLINEで通知するプログラムとかも作成できそうなので、時間があるときにでもプログラム書いて、解説するのでもうしばらくお待ち下さい。

他にもこんなプログラムコード解説の記事も是非読んでみてください!

合わせて読みたい

Pythonスクレイピング-メルカリ画像取得
【Pythonスクレイピング】メルカリのピックアップ商品名と画像を自動保存するプログラム【コピペOK】

続きを見る

SNSのフォローもお願いします!


Pythonを極めるならプログラミングスクールがおすすめ!

Pythonを習得することで、Google画像検索から画像を取得するだけでなく、メルカリの商品情報を取得したり、Twitterのbotを作成したりとさまざまなことができます。作りたいものがあるのであれば是非Pythonを習得しましょう!

爆速でPythonを習得するにはプログラミングスクールなどを有効に活用するのが一番です。ただプログラミングスクールはたくさんあってどこがいいのかわからないという人のために以下の記事で紹介しているので是非参考にしてください。

合わせて読みたい

Pythonが学べるプログラミングスクール比較12社比較
どう違う?Pythonが学べるプログラミングスクール12社比較

続きを見る

  • この記事を書いた人

ぺぺまる

  \人生を楽しむプロ/

札幌生まれ札幌育ちの27歳|大学受験失敗をきっかけに自分の本当にやりたいことを探求|暗号資産投資で失敗 ▶ 営業代行で自分の商品を作りたくなる ▶ イベント事業 ▶ ブログをはじめました!|アウトプットブログ ▶ 理想の働き方研究室へ|結局人生楽しんだもん勝ちだと思ってます!

-プログラミングスキル
-,