【Python】情熱大陸のサイトから次回出演者情報をスクレイピングし、Wikipediaから出演者URLを取得し、短縮URLに変換し、LINE Notifyで通知する方法

# 結論（何ができるか）
情熱大陸の次回出演者情報がLINE Notifyに通知される（***出演者のWikipediaのURLも付加される***）

## 背景
TVを見る時間が減ってきている。理由は子供ができて家族の時間が増えたこと、昔にくらべてTVの前に座って何時間も集中できなくなってきたことだ。年齢のせいだろう。そんななかでも、定期的に見る番組の一つとして情熱大陸がある。ただ、出演者によっては興味のない回がある。事前に出演者がわかれば、見る、見ないを判断できると思い、次回出演者情報をLINE Notifyに通知することにした。

## 全体の流れ
① 情熱大陸のサイトから次回出演者情報をスクレイピング
② 出演者名をWikipediaで検索し、URLを取得
③ 取得したURLを短縮URLに変換
④ LINE Notifyに通知

こんな感じ↓
<img width="375" alt="LINE Nonify_ss.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400635/1a3a0632-286e-97d1-72db-2c75c1ff05f8.jpeg">

日付が変わりサイトが更新されて、次回の出演者情報が取得できている。

## 実際のコード

```python:main.py
# モジュールの読み込み
import requests
from bs4 import BeautifulSoup
import wikipedia
import urllib.request

# 情熱大陸のサイトを指定
r = requests.get("https://www.mbs.jp/jounetsu/")
soup = BeautifulSoup(r.content, "html.parser")

# 次回日付を取得
css1 = soup.find_all("span", class_ = "top-next_date js-span")
next_week = css1[0].getText()
next_week = next_week.replace(".","月") + "日" # 日付を変換

# 次回出演者の名前を取得
css2 = soup.find_all("p", class_ = "top-next_name")
next_name = css2[0].getText()

# 次回出演者のタイトルを取得
css3 = soup.find_all("h2", class_ = "top-outline_ttl")
outline = css3[0].getText()
outline = outline.strip() # 余分な空白を削除

# wikipediaの言語を日本語化
wikipedia.set_lang("ja")

# wikipediaから出演者を検索、URLを取得
result = wikipedia.page(next_name).url

# 取得したURLをbitlyへ渡す(APIを使って短縮URLを生成)
def get_shortenURL(longUrl):
    url = "https://api-ssl.bitly.com/v3/shorten"
    access_token = "***************************"
    query = {"access_token": access_token,"longUrl": longUrl}
    r_bitly =requests.get(url,params=query).json()["data"]["url"]
    return r_bitly

s_url = (get_shortenURL(result))

# LINE Notifyの通知メッセージを作成
msg = "：" + next_week + "\n" + "出演：" + next_name + "\n" + "▶ " + outline + "\n" + s_url

LINE_TOKEN =  "***************************"
LINE_NOTIFY_URL = "https://notify-api.line.me/api/notify"

def send_jt_information(msg):
    method = "POST"
    headers = {"Authorization": "Bearer %s" % LINE_TOKEN}
    payload = {"message": msg}
    try:
        payload = urllib.parse.urlencode(payload).encode("utf-8")
        req = urllib.request.Request(
            url=LINE_NOTIFY_URL, data=payload, method=method, headers=headers)
        urllib.request.urlopen(req)
    except Exception as e:
        print ("Exception Error: ", e)
        sys.exit(1)

def main():
    send_jt_information(msg)


if __name__ == '__main__':
    main()
```
短縮URLに変換しているのが、ポイント。***WikipediaのURLをそのまま持ってくるとURLがめちゃくちゃ長くなる。***

プログラムの実行はHeroku schedulerを使用している。
ただ、Heroku schedulerだと細かい設定ができない。本来は前日に通知してくれるだけでいいが、Heroku schedulerの最小単位がデイリーだ。正直、毎日くるのは鬱陶しい。

## まとめ
情熱大陸のサイトを見にいくよりも効率的。***WikipediaのURLも取得しているので出演者の詳細な情報もその場で確認できる。***いろいろな技術を組み合わせることでもっと面白いことができそう。

今回もスクレイピング、API、LINE Notifyなどの技術に触れることができて学習になった。Pythonの学習を初めて一ヶ月くらいになる。なんとなくやりたいことをイメージして、調べて、試行錯誤してると形になるようになってきた。

Pythonはじめて2週間↓
[【Python】35歳＋営業職＋プログラミング経験なしが2週間でPythonを使って営業日報を効率化した話](https://qiita.com/1-row/items/9306f638b1f1ad426956)

Pythonはじめて3週間↓
[【Python】平成最後だから流行語で振り返る LINE BOTを作った話](https://qiita.com/1-row/items/67b5a85b6c0f00690c72)

## 参考にした情報
[情熱大陸](https://www.mbs.jp/jounetsu/)
[Pythonでスクレイピングした情報をLINE Notifyを使って通知する](https://qiita.com/tuna27/items/8a28db55d7c1165ee0dc)
[【Python】猫でも出来るWebスクレイピングの基礎【BeautifulSoup4】](https://qiita.com/aocattleya/items/2eab8ad744d9a28fb9ce)
[【Python】PythonのWikipedia APIを使ってみよう！前編](https://sannabocona.hatenablog.com/entry/wikipedia.api_python1)
[Pythonで短縮URLを生成する【bitlyAPI】](https://qiita.com/0x0/items/ab85152471417fdade3f)
[Pythonで文字列を置換（replace, translate, re.sub, re.subn）](https://note.nkmk.me/python-str-replace-translate-re-sub/)
[Herokuでお天気Pythonの定期実行](https://qiita.com/seigo-pon/items/ca9951dac0b7fa29cce0)