普段は無在庫の出品について、Libreoffice Calcで作ったツールを1日2回動かしてAmazonの在庫を確認していました。
それが今日になって急に動かなくなってしまいました。
エラーの内容と原因の特定
さて今日も1日頑張ろうと思って活動始めにツールを動かしたら、このようなエラーが出て止まってしまいました。
何か変なプロセスが残っていて悪さをしているかもしれないと思ったので、まずはPCを再起動してもう一度動かしてみました。
しかし結果は同じでした。
もしAmazonがサイトを変えたのであれば、今まで取れていたデータが取れなくなるなどになってもプログラムがエラーを出すことはないと思いました。
なので、まずは自分自身のPC環境に変化はなかったかを調べてみました。
具体的には、Windows Updateで何か変なものを更新していないかとか、LibreOfficeが自動で更新されていないかなどです。
ですが、昨日から今日にかけてこれらは何も更新されていませんでした。
これはもうお手上げだと思いながらも、ネットで情報を探してみました。
すると、文法的に間違ったHTMLをIEのinnerHTMLに入れるとエラーになるという情報がありました。
今の自分はこれに近い手段で情報を取得しているので、ひょっとしたらこれが原因かなと考えました。
という事はやっぱり、Amazonがサイトを何か変更したという事になります。
試しにURLをGoogleやYahooのトップページに変えて動かしてみると、エラーになっていた箇所で止まらずに進みました。
これで原因がAmazonにあるというのはますます確かそうです。
ただ、当然ながらツールが正常に動いていた時のAmazonのサイトのソースなんて保存しているわけないので、どこを変えたかというのは検討もつきません。
じゃあそのページを文法チェックにかけてエラーを見てみればいいと思うかもしれませんが、それをやると無数のエラーが出てきます。
大体、HTMLの文法的に完璧なウェブサイトというのが世の中にどれだけあるか分かりませんが、恐らく数えるほどしかないと思います。
対処法
実はまだ対処できていません。
Amazonのサイトをどうこうしようというのはこちらでは不可能なので、これについてのあたりを付けるのは諦めてどのように対処するかを考えてみました。
上記の情報があったサイトをよく見ると、FirefoxのinnerHTMLだとエラーにならないというような記述もあったので、じゃあFirefoxでHTMLを取得しようと考えました。
これについて調べて、IE以外のウェブブラウザを操作するにはSelenium VBAを使うといいという情報があったので、早速探して入れてみました。
しかしこちらの開発はもう終了したのか、昔のバージョンのものしか見つかりませんでしたが、それでも入れてみました。
ですが今のFirefoxに対応していないのか何なのか分かりませんが、上手くインストールできませんでした。
今日のところはお手上げです
今日はここまででした。
これ以上は分からないと思ったので、とりあえず今日のところは手動で在庫チェックを行いました。
普段はツール動作の2分程度プラスそれを目で確認してeBayの出品を修正する時間を合わせて5分程度で終わっていた作業が、今日は1時間近くかかってしまいました。
これを1日2回やるのは結構厳しいので、しばらくは1日1回程度のチェックになりそうです。
まだこの程度で終わったからよかったものの、出品が1,000件レベルになると1日がかりの作業になりそうです。
もし手動でチェックが終わらないのであればVacation Settingsを利用して一時販売をストップする事も考えていましたが、そこまでの必要はなかったのでよかったです。
あと、もしお金をとってこのツールを配布していたらと思うと、冷や汗モノでした。
内部での動きをろくに理解しないまま、ネット上で見つけたサンプルを参考にして作っただけのツールなので、まだまだ販売できるステージではなかったという事のようです。
これについては、引き続き調査を続けます。
コメント
私も、くれもなさんの投稿に刺激されてAmazonの価格とタイトルを取り込む
プログラムを作ってみました。 現在、実店舗での仕入れがメインで
Amazonのデータをチェックする必要がないのでASINではなく製品の
リンクからページを読み込みデータ取り出すお試しレベルのものです。
開発環境はGoogleスプレッドシートとそのマクロを使用しています。
var url = sheet.getRange(‘E5’).getValue();
var opt = {“contentType”:”text/html”,”method”:”get”};
var response = UrlFetchApp.fetch(url,opt);
var html_src = response.getContentText();
var title= html_src.match(/meta name=”title” content=”(.+?)” \/>/);
var price_str = html_src.match(/”a-size-medium a-color-price”>(.+?)/);
var price= price_str[1].replace(“¥”,””);
今でもこのようなコードで取りあえずタイトルと価格を取り出すことができています。
(セルE5にアマゾンの製品リンクを貼り付けています)
私の場合、アマゾンの方はここで中断してしまい
現在はEbayのAPIを使ってリサーチ用のツールを作ろうとしています。
最初の作品はEbayの出品中の品物をタイトルでサーチして
検索に引っ掛かった出品数、タイトル名、ライバルの価格、ユーザー名、評価、
ストア名等の一覧表を作るものです。
一応、リストアップは1000件を上限としていますがEbayの仕様上は
10000件までリストアップすることが可能なはずです。
100件あたり10秒程度で処理できています。
他のセラーと比べた自分の位置を把握でき、かなり参考になりますね。
次は売れた品物をキワードで調べてリストにしてみようと考えているところです。
くれもなさんも次はEbayのAPIに挑戦されてはいかがでしょうか。
私の場合、アマゾンのAPI利用を申請したのですが審査で
却下されてしまいました。
OZ
Google apps script環境だけでなく
Libreoffice Calcのマクロでebay apiを使えるとこまでは確認しました。
Libreofficeではwebservice関数とFILTERXML関数を使用することで
Ebay APIから返って来る情報を取り出せました。
OZ
>OZさん
いつもありがとうございます。
今回のOZさんのコメントのおかげでwebservice関数が存在するという事に気づき、IEを使ってではなくそこからHTMLソースを取得することを思いつきました。
それでツールをちょいといじって、おかげでまた動くようになりました。
本当に本当に助かりました。
ありがとうございました。
今回のことは今日のブログ記事にしようと思います。
Googleスプレッドシートも結構複雑なことができるんですね。
正規表現というものでしょうか?をあまりよく理解していないので細かくまでは分からなかったのですが、何となくこんな動きをしているというのは掴めたと思います。
eBayのAPIを使って何かしようとは考えたことがありませんでした。
確かに、他のセラーとの比較などが簡単にできるようになると便利ですね。
今はツールよりもリサーチに労力をかけたいメンタルになっていますが、気が向いたらこれも調べてみようと思います。
今回のOZさんのコメントのおかげで、本当に助けられました。
どうもありがとうございました。
くれもなさん、
ネットで検索した情報をもとに日々の為替レートを77銀行から
取ってくることができました。 アマゾンのHTMLソースが
変数に収まるか判りませんが、このやり方を使えばデータロードまでの
時間待ちをなくすことが出来るかもしれません。
‘ Get FX rate from 77 bank
Get_FX_rate()
j = instr(sFX_DataLine, Conv_date_format(Paid_on_Date))
destCell.value = val(mid(sFX_DataLine, j+23, 6)
Sub Get_FX_rate()
Dim oFileAcc As Object
Dim sURL As String
Dim oInputStream As Object
Dim vData As Variant
Dim sLine As String
sURL = ConvertToURL(“https://www.77bank.co.jp/kawase/usd2016.html”)
oFileAcc = createUnoService(“com.sun.star.ucb.SimpleFileAccess” )
oInputStream = CreateUnoService(“com.sun.star.io.TextInputStream”)
oInputStream.setEncoding( “S-JIS” )
If oFileAcc.exists(sUrl) Then
vData = oFileAcc.openFileRead(sUrl)
oInputStream.setInputStream(vData)
While NOT oInputStream.isEOF()
sLine = oInputStream.readLine()
sFX_DataLine = sFX_DataLine & sLine & Chr(10)
WEnd
oInputStream.closeInput()
End if
End Sub
>OZさん
情報ありがとうございます。
4行目で決め打ちでj+23としていますが、月と日の桁数が変わっても対応できるのかどうかというのがちょっと気になりました。
まず日付で検索して、その位置から最初に出てくる”>”の次から6文字を切り取るようにするといい気がしました。
為替レートの自動取得は僕もやろうとした事があったのですが、細かい変動を気にするよりも自分の設定したレートで見込みの利益を計算する方がよさそうだと思ったので、途中でやめてしまいました。
まあこれも用途によりますね。
僕は今のところ、無在庫の仕入先チェックにしかマクロを使っていないので。
利益は自分の設定したレートで計算しながら、その時点での実際のレートも取得して差を見るようにすれば、大きく変動した際にも比較的早く気付くことができるかもしれません。
まあこれは後で検討してみます。
ありがとうございました。
くれもなさん、
私の場合、経理上は月初の為替レートをその月のレートとして売り上げを計算して
翌月始めのレートで為替差益を計算しています。
(今年の帳簿処理はまだ手付かずで放置状態ですが)
今回作ったマクロは売れた品物個々の利益率を把握するために
作成しました。 商品の仕入れ価格を在庫管理用テーブルから参照し、
また売れた個数だけ在庫数を減らすマクロになっています。
ebayの出荷待ち商品のデータをCSVでダウンロードして
以前お話したSKU(カスタムラベル)をキーとして仕入れ価格を参照し、
同時に在庫数を減らしています。
これまで手作業で在庫管理していたのですが出荷して安心してしまい
在庫減することを忘れることが多かったのでこれで確実です。
その代わり購入時の在庫登録を忘れるとマイナス在庫になってしまいますが。
Libreofficeのマクロを書くのは初めてで結構苦労しましたが
今日から実戦投入しています。
>OZさん
結構なシステム化が進んでいるようで、すごいですね。
僕はまだ手作業に頼っている部分がかなり多いです。
在庫管理については入出庫と概算損益を計算するシートを作っていて、SUMIFと足し算引き算を使用して、入庫した数から売れた数を引いて現在の個数を求めるという感じの計算をするようにしています。
売れたらその取引での損益が気になるので、入力をし忘れるという事も今のところはありません。
入庫はたまに忘れますが。
OZさんもLibreOfficeを使い始めましたか。
僕はAmazonの在庫チェックのみLibreOfficeで、その他はOpenOfficeを使っています。
LibreOfficeの方が、Ctrl+;で日付一発入力できたりするので、どちらかと言うと使いやすいです。