背景
みなさん運動してますか?
引きこもりにはもってこいのリングフィットアドベンチャーが最近任天堂から発売されました!!
私も買いたかったのですが、どこも品切れらしくて辛いです。かと言って、メルカリとかヤフオクで転売ヤーから高値で買うのも腹立つので、なんとか正規ルートで買おうと頑張ってみました。
やったこと
色々ググってるとどうも時々通販で、商品が入荷され在庫が復活するということを聞きました。ただ、ずっと通販サイトの前で張り付いているわけには行かないので、在庫が復活したら通知してくれないかなーと考えていました。
そこで、こういう便利なサイトをつかって、ここで在庫が復活していたらLineで通知するアプリを作りました。
成果物はこちら!
https://github.com/aitaro/inventory-notification
ちなみにitemcodeを変えたら他の商品でも使えます。
環境構築
正直言語はなんでもいいです。個人的にRubyが好きなのですが、なんとなくPythonにしました。
開発はローカルでやりますが、在庫通知という特性上、どこかにデプロイすることを念頭において開発しましょう。
フォルダ構造
.
├── README.md
├── main.py
└── requirements.txt
line-bot-sdk
selenium
chromedriver-binary
実装
基本的には2ステップです。
- net-zaiko.comからスクレイピング
- lineへ送信
これを適当なサーバにデプロイします。(今回はheroku)
スクレイピングはseleniumを使う方法とbeautifulsoup4を使う方法がありますが、このサイトではアクセスしてから他のサイトの在庫情報を取りに行くので、ブラウザの挙動をそのまま再現するseleniumを使います。また、lineはここからbotを作成し、アクセストークンを発行します。コード中のGOOGLE_CHROME_SHIM
はchromeの実行ファイルの場所です。
from linebot import LineBotApi
from linebot.models import TextSendMessage
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
import re
import time
import os
# 在庫情報取得
# リングフィットアドベンチャー
item_id = '4902370543278'
# item_id = '4988013097025'
# ブラウザーを起動
options = Options()
options.binary_location = os.getenv('GOOGLE_CHROME_SHIM')
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
# net-zaikoにアクセス
url = 'https://www.net-zaiko.com/item/' + item_id
driver.get(url)
time.sleep(10)
targetElements = driver.find_elements_by_css_selector("#sl0 .siSa,.siSb,.siSc,.siSd,.siSe")
title = driver.find_element_by_id("itmH0").text
# それぞれのネットショップで在庫があるか確認
flag = False
for el in targetElements:
# amazonはマケプレでぼったくってくるから除外
pattern = r'Amazon\.co\.jp'
result = re.search(pattern, el.text)
if not result:
flag = True
print('在庫あり')
print(el.text)
print(title)
# ブラウザーを終了
driver.quit()
# Lineに通知
line_bot_api = LineBotApi(os.getenv('LINE_CHANNEL_ACCESS_TOKEN'))
if flag:
messages = TextSendMessage(text=f"{title}の商品在庫があります!\nこちらよりアクセスして下さい{url}")
line_bot_api.broadcast(messages=messages)
工夫した点
- サイトによって在庫ありの表記に揺れがあったので、緑枠(siSa 〜 siSe)で在庫ありを判定
- Amazonはマケプレボッタクリ詐欺がひどいので除外
デプロイ
chromeが入って、定期実行できる必要があったので、その条件で色々検討したのですが、herokuが無料で行けそうだったのでherokuにしました。
herokuでのアプリに作り方は割愛しますが、add-onでheroku schedulerを入れるのと、buildpackでchromeとchromedriveを入れるといけます。ここらへん参照。
感想
2時間ぐらいかけてつくりました。まだ買えてません。早くほしいです。
スクレイピングは迷惑にならない範囲でやりましょう。