Yahooテレビ番組表から情報取得(Webスクレイピング初級)

みなさんこんにちは。

前回まででWebスクレイピング超初級は終了ですが、ただ情報を取るだけではつまらないので何か生活を便利にしたいなと考えをめぐらせておりました。

私は某アイドルグループのファンで彼女たちの出演情報は漏れなくチェックしているつもりなのですが、たまーに見逃すことがあり、悲しい思いをしたことがあります。ですので、テレビの出演情報をPythonにチェックさせてLINEに通知するプログラムを作りました。

Yahoo!テレビ.Gガイド [テレビ番組表]でキーワード検索していただくとわかるのですが検索後のURLには法則があることに気づきます。例えば「ニュース」というキーワードで、地域設定を東京、地上波&BS放送&CS放送、にすると以下のようになります。

https://tv.yahoo.co.jp/search/?q=ニュース&t=1%202%203&a=23&oa=1&s=1

私のサイトではないので法則に関して深堀することはやめておきますが、q=のあとがキーワード、a=のあとが地域設定、s=のあとがページ番号のはずです。のちほどソースコードを掲載しますが皆さんのやりたいことに応じてカスタムしてください。(地域設定に関してはURLのソースに記載がありました)動的なURLであればブラウザを自動で動かすようなプログラムが必要ですが今回はある程度単純なのでこれまで勉強した知識だけで処理ができそうです。

こんな感じのフローチャートでいきます。(見にくくてスミマセン)

今回はHTTPリクエストが正常かどうかのチェックを追加しています。こちらを参考にさせていただきました。

リクエストが正常でなければLINE Notifyを利用して通知します。

他は、検索数がゼロかどうかの判定、検索数からページ数を判断してループ処理、などを追加しています。

またURLのソースからあるタグの情報をゲットするにはChromeが大変便利です。ChromeでWebサイトを開いてから右クリック→「検証」を選ぶと、以下の画面が開きます。アイコンをクリックしてマウスを動かすと要素ごとのタグが自動で表示されていきます。こりゃ便利!

ではさっそくソースコードを記載します。

queryには皆さんが検索したいキーワード、URLは皆さんの状況に合わせてカスタムしてください。ブラウザで検索条件を変更したらURLも変わるはずです。

9~21行の部分、HTTPリクエストのステータスコードが200以外であればLINEに通知して処理を終了します。LINEの処理部分にあるアクセストークンはご自分の環境で取得したものを張り付けてください。

次にキーワード検索数を取得します。もし検索数がゼロであれば、29行のpには0でなくNoneが入ります。

ここから少しややこしいです。

検索数が1~10件ならばページ数は1、11~20件ならばページ数は2、というように増えていきます。検索数を取得してanswerに代入し、カウンタとして使用します。ループの最後でanswerから10を引いています。例えば検索数が30件ならば、

1回目の処理はanswer=30で1ページ目を取得

2回目の処理はanswer=20で2ページ目を取得

3回目の処理はanswer=10で3ページ目を取得

4回目の処理はanswer=0でループから抜ける

となります。スクレイピングするURLですが

URLは最後の部分、s=”+str(page)としています。1ページ目はs=1ですが、2ページ目はs=2ではなく、s=11が正解で、3ページ目はs=21、というように増えていくので、ループの最後に変数pageに10を足しています。またループの最後でsleepを入れることでサーバへの負荷を軽減しています。

ループを抜けたあとは74、75行で取得した情報をまとめたリストを作成、77行以降は前回からお得意の差集合を使います。92行以降はLINEへの通知部分ですが、差集合で得られた「新しい番組情報」のデータをリストに変換しただけでは順番がバラバラなので.sort()で文字列順で並べ直しています。またLINE Notifyの通知もfor文で繰り返していますが、これはLINEに一度で送ることができる文字列に制限があるため、あえて1番組ずつ送るようにしました。最後に今回のデータをテキストファイルに保存して終了です。pyファイルと同じフォルダにhogehoge.txtがないとエラーになりますので注意してくださいね。

  • ルーターの不調などでインターネットにつながらない場合が気づけない
  • ループ内の処理で、放送日時、放送局、番組タイトルを別々に取得していくので、どこか一部の情報が欠けると全ての番組において正しくない情報となる恐れがある
  • 番組タイトルが少し変更になっただけで、前回のデータと異なると判別されて通知されてしまう(本当は放送日時+放送局だけで判別すべきかもしれない)

など、少し問題点はありますが・・・

前回の投稿でLINE Notifyはグループでも使用できるということを記載しました。自分自身とLINE Notifyの2人だけでもグループを作ることができるので、処理ごとにグループを作れば情報が整理できてとても便利です。このAPI、ずっと使えるといいなぁ。

ひとまずこれで完成としたいと思います。お疲れ様でした。今回のプログラムを定期的に自動実行すれば素晴らしいオタクライフが待っているはずです。

さて次は何をやろうかな~。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です