読者です 読者をやめる 読者になる 読者になる

anti scroll

ブラウザと小説の新しい関係を模索する

amazonの価格変動をチェックするスクリプト

プログラミング

 先日ウイニングイレブン2011というゲームを買おうと思ってアマゾンを見たら、なんと驚きの8900円。めちゃめちゃ高かったので、仕方なく別の通販サイトで買ったのですが、直後にアマゾンをチェックしたら一気に値下げしてて、そこで買った値段より五百円も安くなっていてガックリ、ということがありました。

 で、ついカッとなってamazonの商品の価格変動をチェックするスクリプトを書きました(apiとか使えばもっと楽なんだろうけど、なんか違うやり方をしてみたかった)。

 珍しくもなんともないものだと思いますが、役に立つ人もいるかもしれないと思って載せておきます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import re
import urllib
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate
from lxml import etree

TMP_FILE = "/var/tmp/amazon.html"
FROM_ADDR = "checker@localdomain.localhost"
TO_ADDR = "someone@localdomain.localhost"

# http://www.amazon.co.jp/dp/(....) に入る部分の文字列
DP_ID = "B003DSHMM0"

def fetch_dp_id_xml(dp_id):
    urllib.urlretrieve("http://www.amazon.co.jp/dp/" + dp_id, TMP_FILE)
    return etree.parse(open(TMP_FILE, "r"), parser=etree.HTMLParser())

def check_title(xml):
    return xml.xpath('//*[@id="btAsinTitle"]/text()')[0]

def check_price(xml):
    price = xml.xpath('//*[@class="priceLarge"]/text()')
    if len(price) > 0:
        return int(re.sub("[^0-9]", "", price[0]))
    return -1

def create_msg(from_addr, to_addr, subject, body, encoding="ISO-2022-JP"):
    msg = MIMEText(body, "plain", encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    return msg

def send_mail(from_addr, to_addr, subject, body):
    msg = create_msg(from_addr, to_addr, subject, body)
    s = smtplib.SMTP("127.0.0.1")
    s.sendmail(from_addr, [to_addr], msg.as_string())
    s.close()

def get_price_file_path(dp_id):
    return "/var/log/amazon/price-" + dp_id

def check_pre_price(dp_id):
    path = get_price_file_path(dp_id)
    if not os.path.exists(path):
        return -1
    f = open(path, "r")
    try:
        price = int(f.next())
        f.close()
        return price
    except StopIteration:
        return -1

def set_cur_price(dp_id, price):
    f = open(get_price_file_path(dp_id), "w")
    f.write(str(price))
    f.close()

if __name__ == '__main__':
    if len(sys.argv) >= 2:
        DP_ID = sys.argv[1]

    xml = fetch_dp_id_xml(DP_ID)
    title = check_title(xml)
    price = check_price(xml)
    pre_price = check_pre_price(DP_ID)

    if price != pre_price:
        subject = "price change!! " + title
        body = str(pre_price) + "yen -> " + str(price) + "yen"
        send_mail(FROM_ADDR, TO_ADDR, subject, body)

    set_cur_price(DP_ID, price)
    os.remove(TMP_FILE)

 やってることは、商品ページを取得して、XPathで価格を抜き出し、変動があればメールする、というだけです。

 動かすにはPythonlxmlというモジュールが必要で、lxmlをインストールするにはlibxml2libxsltのインストールが必要です。

 巡回する商品を指定するには、DP_ID(呼び方がわからないので適当にネーミングしました)のところに商品のIDを入れてください。

 上のコードでは、さいきん価格の変動が激しいと言われているコーヒーを使っています。

 今後は値崩れしそうな商品は、cron で一時間おきに上記スクリプトを走らせ、凄腕トレーダーのごとく買い時を逃さないようにしたいと思います。