はじめに
しいたけ占いという占いサイトをご存知でしょうか?
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

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

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

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

上記のように、トリガーをCloud Pub/Sub、トピックを先ほど登録した「siitake」にして作成します。
main.pyの作成
あらかじめslackweb
とbs4
をインストールしておきます。
$ 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に
bs4
とslackweb
を登録する必要があります。
結果

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