1. 概要
今週の金曜ロードショーの映画が何か、いちいちテレビ欄をチェックするのは面倒。
そこで、PythonのWebスクレイピングを用いて、PCのターミナル上からコマンド一つで金曜ロードショーの映画名を取得することが出来ないかと考えた。
2.目標
- ターミナル上のコマンド一つで、来週の金曜日に放送される映画のタイトルを表示させる。
- その際、金曜ロードショーのラインナップのページ(https://kinro.jointv.jp/lineup)を、PythonのBeautiful Soupを使ってスクレイピングする。予め、スクレイピングするページの構造を見ておこう。
金曜ロードショーWebサイト
...
<li>
<div class="photo">
<a href='/lineup/20170414'>
<img src="https://dtg3yjoeemd2c.cloudfront.net/pic/lineup/20170414/photo01_p62bphcy8m.jpg" alt="名探偵コナン 純黒の悪夢(ナイトメア)" />
</a>
</div>
...
</li>
<li>
<div class="photo">
<a href='/lineup/20170421'>
<img src="https://dtg3yjoeemd2c.cloudfront.net/pic/lineup/20170421/photo01_uyxdjywd.jpg" alt="シンデレラ" />
</a>
</div>
...
</li>
<li>
<div class="photo">
<a href='/lineup/20170428'>
<img src="https://dtg3yjoeemd2c.cloudfront.net/pic/lineup/20170428/photo01_9txwertpu3.jpg" alt="ワイルド・スピード スカイミッション" />
</a>
</div>
...
</li>
...
3.コード
kinro.py
#coding:utf-8
import urllib.request
import datetime
from bs4 import BeautifulSoup
def func():
html = urllib.request.urlopen("https://kinro.jointv.jp/lineup")
soup = BeautifulSoup(html, "lxml")
today = datetime.date.today()
nextFriday = today + datetime.timedelta(days = (4 - today.weekday()) % 7)
strnextFriday = nextFriday.strftime("%Y%m%d")
a = soup.find_all("a", href = "/lineup/" + strnextFriday)
tmp = a[0].find("img")
title = tmp.attrs['alt']
print(title)
if __name__ == '__main__':
func()
ターミナルを開き、このコードと同じディレクトリで、
$python kinro.py
というコマンドを実行して、
名探偵コナン 純黒の悪夢(ナイトメア) # 2017年4月14日以内
シンデレラ # 2017年4月15日~21日
のように映画のタイトルが表示されれば成功。
勿論、.barhrcで
alias kinro='python ~/my_dir/kinro.py' #ディレクトリ名は環境に合わせる
みたいにこのコマンドを定義しておけば、どのディレクトリ上でも$kinro
のコマンド1つで来週の金曜ロードショーの映画名を取得できる。
4. コードの解説
4.1. Webページの読込
最初の2行。
kinro.py(一部)
html = urllib.request.urlopen("https://kinro.jointv.jp/lineup")
soup = BeautifulSoup(html, "lxml")
4.2. 来週の金曜日の日付の取得
3~5行目。今日の日付を取得して、そこから来週の金曜日までの日数差を計算している。
kinro.py(一部)
today = datetime.date.today()
nextFriday = today + datetime.timedelta(days = (4 - today.weekday()) % 7)
strnextFriday = nextFriday.strftime("%Y%m%d")
4.3. 映画名の取得・出力
6~9行目。
kinro.py(一部)
a = soup.find_all("a", href = "/lineup/" + strnextFriday)
tmp = a[0].find("img")
title = tmp.attrs['alt']
print(title)
6行目で
金曜ロードショーWebサイト
<a href='/lineup/20170414'>
<img src="https://dtg3yjoeemd2c.cloudfront.net/pic/lineup/20170414/photo01_p62bphcy8m.jpg" alt="名探偵コナン 純黒の悪夢(ナイトメア)" />
</a>
の部分を取り出し、7行目でそこから更に
金曜ロードショーWebサイト
<img src="https://dtg3yjoeemd2c.cloudfront.net/pic/lineup/20170414/photo01_p62bphcy8m.jpg" alt="名探偵コナン 純黒の悪夢(ナイトメア)" />
を、8行目では更にそこから
名探偵コナン 純黒の悪夢(ナイトメア)
の部分だけを取り出している。
5. 参考URL
5.1. スクレイピングに関して
- http://qiita.com/rusarusa/items/d7f014ba80d6fe7a3e07
- https://www.crummy.com/software/BeautifulSoup/bs4/doc/