LoginSignup
2
6

More than 3 years have passed since last update.

Python3+BeautifulSoup4+Cloud Functionsで1時間で作るしいたけ占いBot

Posted at

はじめに

しいたけ占いという占いサイトをご存知でしょうか?
https://voguegirl.jp/horoscope/shiitake/

弊社では、よく当たると社長を筆頭に空前の大ブームを巻き起こしています。
毎週月曜日に更新され、LINEもあるけど、みんながみるSlackに流れてきたら嬉しいよね!といって一人で始めたら意外と簡単で1時間でできましたという話。

作ったもの

しいたけ占いの更新日時である月曜12時にSlackにスクレイピングした各星座の占い結果を流すだけ!
しいたけ占いBotのGitHub

環境

  • Google Cloud Functions
  • Google Cloud Scheduler
  • Google Cloud Pub/Sub
  • Python 3.7
  • BeautifulSoup4 4.8.1
  • slackweb 1.0.5

スクリーンショット 2019-10-25 18.13.31.png

こんな感じになります。
名前は基本「siitake」で統一していきます。

Cloud Schedulerの登録

スクリーンショット 2019-10-25 18.24.10.png

しいたけ占いの更新頻度に合わせて毎週月曜日の12時からに設定します。
この後Pub/Subを呼ぶのでターゲットはPub/Sub、トピックは「siitake」にしておきます。

Cloud Pub/Subの登録

スクリーンショット 2019-10-25 22.24.28.png

このトピックを作成ボタンを押してSchedulerと合わせるように「siitake」というトピックIDで作成します。

Cloud Functionsの作成

スクリーンショット 2019-10-25 22.27.13.png

上記のように、トリガーをCloud Pub/Sub、トピックを先ほど登録した「siitake」にして作成します。

main.pyの作成

あらかじめslackwebbs4をインストールしておきます。

$ pip install bs4 slackweb

流れ

1. 12星座の英語のリストを用意する

constellations = [
        "aries",
        "taurus",
        "gemini",
        "cancer",
        "leo",
        "virgo",
        "libra",
        "scorpio",
        "sagittarius",
        "capricorn",
        "aquarius",
        "pisces"
    ]

    constellations_kana = [
        "【おひつじ座】",
        "【おうし座】",
        "【ふたご座】",
        "【かに座】",
        "【しし座】",
        "【おとめ座】",
        "【てんびん座】",
        "【さそり座】",
        "【いて座】",
        "【やぎ座】",
        "【みずがめ座】",
        "【うお座】"
    ]

2. 今日の日付を取得。星座リストをループで回しながらベースのURLに各星座、日付を当てはめてbs4で毎回HTMLを取得

    base_url = "https://voguegirl.jp/horoscope/shiitake/"
    date = dt.date.today()
    slack = slackweb.Slack(url=os.environ["SLACK_URL"])

    for c, c_kana in zip(constellations, constellations_kana):
        url = base_url + c + "/" + date.strftime("%Y%m%d") + "/"

3. bs4で毎回HTMLを取得し欲しい部分に当たるclass="a-text"部分を得る

for c, c_kana in zip(constellations, constellations_kana):
        url = base_url + c + "/" + date.strftime("%Y%m%d") + "/"
        res = requests.get(url)
        soup = BeautifulSoup(res.text)
        res.close()
        base_txt = soup.find("div", class_="a-text").text

4. Slackに送るメッセージに合わせてテキストを当て込み送信!

    for c, c_kana in zip(constellations, constellations_kana):
        url = base_url + c + "/" + date.strftime("%Y%m%d") + "/"
        res = requests.get(url)
        soup = BeautifulSoup(res.text)
        res.close()
        base_txt = soup.find("div", class_="a-text").text
        txt = c_kana + "\n\n" + base_txt.strip() + "\n\n続きはこちら⇒ " + url
        slack.notify(text=txt)

実装

全コードは以下に省略

import requests
import datetime as dt
import os
import slackweb
from bs4 import BeautifulSoup

def siitake(a, b):
    constellations = [
        "aries",
        "taurus",
        "gemini",
        "cancer",
        "leo",
        "virgo",
        "libra",
        "scorpio",
        "sagittarius",
        "capricorn",
        "aquarius",
        "pisces"
    ]

    constellations_kana = [
        "【おひつじ座】",
        "【おうし座】",
        "【ふたご座】",
        "【かに座】",
        "【しし座】",
        "【おとめ座】",
        "【てんびん座】",
        "【さそり座】",
        "【いて座】",
        "【やぎ座】",
        "【みずがめ座】",
        "【うお座】"
    ]

    base_url = "https://voguegirl.jp/horoscope/shiitake/"
    date = dt.date.today()
    slack = slackweb.Slack(url=os.environ["SLACK_URL"])

    for c, c_kana in zip(constellations, constellations_kana):
        url = base_url + c + "/" + date.strftime("%Y%m%d") + "/"
        res = requests.get(url)
        soup = BeautifulSoup(res.text)
        res.close()
        base_txt = soup.find("div", class_="a-text").text
        txt = c_kana + "\n\n" + base_txt.strip() + "\n\n続きはこちら⇒ " + url
        slack.notify(text=txt)

実装は上記になります。
これ以外に、

  • Cloud Functionsの環境変数にSLACK_URLとしてincoming webhookのURLを登録
  • requirements.txtにbs4slackwebを登録する必要があります。

結果

スクリーンショット 2019-10-25 22.52.27.png

これを見てみんなでハッピーになりました。

感想とか

初めてCloud Functionsを使ったけどすごく簡単にできて楽しかった。
また、Pythonでのスクレイピングも初めてだったけど、直感的で使いやすかった。
何より、何かを作るのは楽しいし、社内でみんな喜んでくれると嬉しい!

2
6
0

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
2
6