はじめに
政府からの給付金も支給されるので,持ってなかったiPadを整備品で安く買いたい!と思いました.
整備品についてはこちら→https://www.apple.com/jp/shop/refurbished
僕が欲しかったのはiPad Air(第3世代)だったのですが,この記事を書いた時はなかなかの争奪で,新たに上げられてもすぐに瞬殺するほどです.
なので,他の人に先を越されないように定期的にスクレイピングして,Slackで通知することで,購入できるようにしようと思い,Pythonのプログラムを簡単に作成して,無事にiPad Airの整備品を買えたので,今回ご紹介します.
※今回はサイト一覧から販売されているリストを条件に応じて通知しているってだけなので,販売され続けていると定期実行されるたびに通知されるものなので,それが嫌な方はCSV駆使するなりして新たに上がったものだけを通知するようにしてください.
今回やったこと
用いたもの
・Python
・BeautifulSoup
・Slack API
・Windowsのタイムスケジューラ
スクレイピング環境のインストール
pip install requests
pip install beautifulsoup4
pip install lxml
Slack APIのTokenの取得
僕は自分だけが入ってるSlackを作って,リンク先(https://qiita.com/ik-fib/items/b4a502d173a22b3947a0 )にあるような形で,APIをポストするだけで通知の投稿をしてくれるIncoming Webhooksを取得・連携しました.
Pythonコード
Beautiful SoupとPython3を用いてスクレイピングしています.
今回はiPad Airの販売一覧を取得したかったので,"Air"と"Wi-Fi"の文字列が含まれているときに通知するようにしています.(Airだけだとメニューバーが通知されるため,Wi-Fiの文字列も含めています)
もし,iPad Proが欲しければ"Pro"を,iPad miniであれば"mini"をすればいいと思います(無印のだとどうすればいいのかは分かりませんが...)
# coding:utf-8
from bs4 import BeautifulSoup
import json
import requests
if(__name__ == "__main__"):
url="https://www.apple.com/jp/shop/refurbished/ipad"#iPadの整備済み製品一覧
headers = {"User-Agent": "Mozilla/5.0"}
soup2 = BeautifulSoup(requests.get(url, headers=headers).content, 'html.parser')#htmlの取得
a_tags=soup2.select("a")#<a>タグの取得
for entry in a_tags:#取得した各<a>タグについて
if 'Air' in entry.text and 'Wi-Fi' in entry.text:#iPad Airがあるとき
slackapi="投稿したいSlackのワークスペースのAPI"
text = '<!channel> '+entry.text
#Slackに通知
requests.post(slackapi, data = json.dumps({
"text": text
}))
定期実行
今回は常に電源ONにしてるWindowsデスクトップがあったので,それをWindowsのタスクスケジューラを用いることでPythonを定期実行するようにしました.
(AWSのLambdaを使うのもいいと思います)
タスクスケジューラの設定方法についてはこちらを参照( https://qiita.com/kawa-Kotaro/items/4005a43eb686eae41448 )しました.
ちなみに僕は5分ごとのトリガーを2つ作って,2分半ごとに実行するようにしました.
短いスパンで頻繁にスクレイピングさせると,Webサーバーに負荷をかけてることになり,クロールされる側の迷惑になったり,DoS攻撃(サーバーに過剰な負荷をかけてサービスを妨害する攻撃)とみなされるので注意しましょう.
実行結果
もし諸々が上手くいけば,以下のような感じでSlackに通知できます.
場合によっては,TwitterのBotである整備済み商品の投稿をするBotより早かったりします.