Amazon Product APIで売り上げ実績が30日ないとエラーになるようになってた

以下のプログラムで何度やってもエラーになってた。 どうやら、2019年1月から、仕様変更があり、 売り上げ実績が30日ないとエラーを返すようになったらしい。

使いづらくなったなあ。

import os
import time

from amazon.api import AmazonAPI # pip install python-amazon-simple-product-api

AMAZON_ACCESS_KEY = os.environ['AMAZON_ACCESS_KEY']
AMAZON_SECRET_KEY = os.environ['AMAZON_SECRET_KEY']
AMAZON_ASSOCIATE_TAG = os.environ['AMAZON_ASSOCIATE_TAG']

amazon = AmazonAPI(AMAZON_ACCESS_KEY, AMAZON_SECRET_KEY, AMAZON_ASSOCIATE_TAG, Region='JP')
products = amazon.search(Keyword='kindle', SearchIndex='All')

for product in products:
    print(product.title)
    print(product.offer_url)
    price, currency = product.price_and_currency
    print(price, currency)

エラー

Traceback (most recent call last):
  File "5.6_amazon_product_search.py", line 13, in <module>
    for product in products:
  File "/Users/qhssk842/PycharmProjects/python_clowling/scraping/lib/python3.7/site-packages/amazon/api.py", line 544, in __iter__
    for page in self.iterate_pages():
  File "/Users/qhssk842/PycharmProjects/python_clowling/scraping/lib/python3.7/site-packages/amazon/api.py", line 561, in iterate_pages
    yield self._query(ItemPage=self.current_page, **self.kwargs)
  File "/Users/qhssk842/PycharmProjects/python_clowling/scraping/lib/python3.7/site-packages/amazon/api.py", line 573, in _query
    response = self.api.ItemSearch(ResponseGroup=ResponseGroup, **kwargs)
  File "/Users/qhssk842/PycharmProjects/python_clowling/scraping/lib/python3.7/site-packages/bottlenose/api.py", line 274, in __call__
    {'api_url': api_url, 'cache_url': cache_url})
  File "/Users/qhssk842/PycharmProjects/python_clowling/scraping/lib/python3.7/site-packages/bottlenose/api.py", line 235, in _call_api
    return urllib2.urlopen(api_request, timeout=self.Timeout)
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 531, in open
    response = meth(req, response)
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 569, in error
    return self._call_chain(*args)
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 503, in _call_chain
    result = func(*args)
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 503: Service Unavailable
ERROR: exit status 1

自身で売り上げ発生させればいいじゃんと思って、自分でつくったリンクで商品を購入してみたけど、ダメだね。。。 うーん。どうしたらいいかなぁ。。。。

GraphQL

RESTに代わる技術としてGraphQLが来そうだと感じた。

 

RESTによる情報の取得は、取得したパラメータの一部しか使われない場合がある。

 

そのような場合、通信の無駄であるし、メモリ、CPUも無駄に使っていることになる。

 

GraphQLは、必要なフィールドを指定して取得することができる技術のため、この問題を解決できる。

 

HTML中のa要素をすべて取得する

PythonでHTML中のa要素を取得する処理を作成。 動かすためには、lxmlとcssselectライブラリが必要です。 以下のコマンドを実行し、インストールしてください。

lxmlのインストール

pip install lxml

cssselectのインストール

pip install cssselect

ソース

#!/usr/bin/python
# coding: utf-8

# HTML内のa要素をすべて取得する

import lxml.html

# HTMLファイルを読み込み、getRoot()メソッドでHtmlElementオブジェクトを得る
tree = lxml.html.parse('test.html')
html = tree.getroot()

# cssselect()メソッドでa要素のリストを取得して、個々のa要素に対して処理を行う
for a in html.cssselect('a'):
    # href属性とリンクのテキストを取得して表示する
    print(a.get('href'), a.text)

お天気情報をアプリに組み込む

お天気の情報をアプリに組み込みたい場合、 Livedoorが提供するお天気Webサービスが便利だ。

ユーザ登録や認証が不要で、HTTPリクエストのみでデータが取得できる。

weather.livedoor.com

福岡県の天気情報を取得するURL http://weather.livedoor.com/forecast/rss/area/400010.xml

ビルドが終わったらLINE通知してくれるシェルを数分で作った

開発しているアプリのビルドが2分くらいかかる。。。 そのようなときは、終わるまでディスプレイ見て待ちます? やっぱ、別の作業をやりたいですよねー。

でも、別の作業をやっていると、 ビルドの結果が気になって。。。。そわそわ。

ウインドウを切り替えて、 ああ。。。まだ終わってなかったなんて。。。 そんな無駄な時間を過ごすのやだなーと思って

通知してくれるスクリプトの作り方を調べました。

簡単なのはLINE Notifyを使ったシェルスクリプトですね。 数分でできました。

シェルは以下の方を参考に。。。 qiita.com

LINE Notifyのページはこちら、入ってトークン発行するだけでした。

notify-bot.line.me

いろいろ使えそうです。

VirtualBox Guest Additions

Vagrantで開発環境をつくるときに、 共有フォルダが見れないとか、仮想マシンから共有フォルダが見れないときは、 VirtualBox Guest Additionsのバージョンに原因があったりする。

VirtualBox Guest Additions とは、VirtualBox 上に作成したゲストマシンにインストールするソフトウェア。 ホストマシンとゲストマシンとの間での操作を便利にしてくれる機能を持っている VirtualBox Guest Additions をゲスト OS にインストールすると、次のような事が可能になる。

  • クリップボードの共有
  • フォルダの共有
  • 自動ログイン
  • ホストマシンとの時刻同期

VagrantにはVirtual Guest Addistionを調整してくれる便利なプラグインがあり、 以下のコマンドでインストールできる。

vagrant plugin install vagrant-vbguest

vagrant up時に自動で起動してくれるので非常に楽チンだ。

Vagrant was unable to mount VirtualBox shared folders. This is usually because the filesystem "vboxsf" is not available.

VagrantでOSをcentos/7にすると以下のエラーが出た。

Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

ホスト⇔ゲスト間のフォルダ共有機能はGuest Additionsが提供しているが ホスト(VirtualBox)とゲスト(Guest Additions)でバージョン不一致があるとマウントエラーが起きる。

vagrant up時に自動的に新しいバージョンのGuest Additionsに更新してくれる 「vagrant-vbguest」というプラグインがあるので、こちらをインストールしておくと良い。

vagrant plugin install vagrant-vbguest