Amazonで販売するための商品を探す、リサーチしているとき、利益出そうだな!と思った商品はエクセルファイルなんかに記録を残していったりしますよね。
そんなとき、下記の項目をコピペしているのではないでしょうか。
- 商品名
- 重量
- 高さ
- 長さ
- 幅
項目は多いし、Amazonの商品ページのどの辺に書かれているのかよくわかりません。
しかも探した後に、さらに送料の計算をしたりといろいろ面倒で仕方ないですよね。
そんなときはMWS APIを使えば一撃で商品データを取得することができます。
今回はMWS APIを使って商品データを自動で一括取得する方法についてご紹介します。
MWS APIを使った商品情報・データの自動一括取得方法
MWS APIを使えば効率よく商品データを取得することができる。
そんなとき、ほしい情報といえば上記で説明した項目や価格などでしょう。
価格の取得方法については以前お話させていただきました。
手数料の自動一括取得については下記ページです。
価格については網羅してきたつもりですので、今度は商品情報についてです。
取得方法は2種類ある。あなたはどっちのGetMatchingProduct?
ほぼ1択のような気もしますが、一応Amazonのリファレンスを読んだ限りでは2種類の方法で商品情報の取得ができます。
- GetMatchingProduct
- GetMatchingProductForId
前者がASINをもとに商品情報を取得するライブラリで、後者がASIN、またはASIN以外(JANなど)で商品情報を取得できるライブラリとなっています。
前者は1時間に7,200件、後者は1時間に18,000件の商品データ取得までという制限です。
お気づきでしょうか?前者を使う理由がまったくないということに。
理由はよくわかりませんが、Amazonは後者のGetMatchingProductForIdを使ってほしいのだそうです。
試していないのでわかりませんが、この2つはリソースが競合しないため、同時に使うといのもできるのではないかと思います。
2つ併用して使えば、1時間で25,200件の商品データが取得できる、かもしれません。
商品情報の取得にはGetMatchingProductForIdを使う
Amazonも推奨していますし、GetMatchingProductを使う必要性もそこまで感じていないため、わたしは後者のGetMatchingProductForIdを使っています。
併用できるのかもしれませんが、その分だけ複雑になってバグが出たりして手間かければ、逆に効率ダウンですからね。
最速・最強がもっとも効率が良いとは限らない、というわけです。なのに人はなぜか最速・最強を目指します。
ここはノータイムでGetMatchingProductForIdを使いましょう。
Amazon MWS APIを使って商品情報・データ(重量やサイズとか)を取得するサンプルソースコード
GetMatchingProductForIdを使ったサンプルソース
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MarketplaceWebServiceProducts; using MarketplaceWebServiceProducts.Mock; using MarketplaceWebServiceProducts.Model; using System.Xml; using System.Xml.Linq; namespace _00_sample { class Program { static void Main(string[] args) { string appName = ""; // アプリの名前 string appVer = ""; // アプリのバージョン string merchantId = ""; // 出品者ID string accessKeyId = ""; // アクセスキー string secretAccessKey = ""; // 秘密キー string marketPlaceId = "A1VC38T7YXB528"; // ←日本はこの値固定 MarketplaceWebServiceProductsConfig config = new MarketplaceWebServiceProductsConfig(); config.ServiceURL = "https://mws.amazonservices.jp"; MarketplaceWebServiceProductsClient service; service = new MarketplaceWebServiceProductsClient(appName, appVer, accessKeyId, secretAccessKey, config); GetMatchingProductForIdRequest request = new GetMatchingProductForIdRequest(); // 1度に突っ込めるASINは5個まで! IdListType idList = new IdListType(); idList.Id.Add("B00WXLQBEI"); idList.Id.Add("B00HIVH840"); idList.Id.Add("B00MHXHL64"); idList.Id.Add("B01ASQ2G6G"); idList.Id.Add("B00PDMJ7VS"); request.IdList = idList; request.IdType = "ASIN"; request.SellerId = merchantId; request.MarketplaceId = marketPlaceId; GetMatchingProductForIdResponse response = null; response = service.GetMatchingProductForId(request); // 今回は見やすくするためにファイル出力にします。 System.IO.StreamWriter sw = new System.IO.StreamWriter("tmp.csv", true, System.Text.Encoding.GetEncoding("shift_jis")); sw.WriteLine( "商品名,重さ,高さ,長さ,幅" ); for (int i = 0; i < idList.Id.Count; i++ ) { // 商品情報はAmazonが公開しているクラスライブラリではデシリアライズ不可。XMLをパースするしかない。 XmlElement xmlElem = (XmlElement)response.GetMatchingProductForIdResult[i].Products.Product[0].AttributeSets.Any[0]; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlElem.ParentNode.InnerXml); XmlNamespaceManager xmlNsm = new XmlNamespaceManager(xmlDoc.NameTable); xmlNsm.AddNamespace("ns", "https://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd"); XmlNodeList xmlNl; string[] productInfoAry = new string[5]; xmlNl = xmlDoc.SelectNodes("/ns:ItemAttributes/ns:Title", xmlNsm); if (xmlNl.Count >= 1) // 商品タイトルはcsv表示に支障が出そうな文字列を削除。 productInfoAry[0] = xmlNl[0].InnerText.Replace(",", " ").Replace("\"", "").Replace("\n", " "); // 重さや高さなどはインチ表記。お好みでcmとかに換算してください。 xmlNl = xmlDoc.SelectNodes("/ns:ItemAttributes/ns:PackageDimensions/ns:Weight", xmlNsm); if (xmlNl.Count >= 1) productInfoAry[1] =xmlNl[0].InnerText; xmlNl = xmlDoc.SelectNodes("/ns:ItemAttributes/ns:PackageDimensions/ns:Height", xmlNsm); if (xmlNl.Count >= 1) productInfoAry[2] = xmlNl[0].InnerText; xmlNl = xmlDoc.SelectNodes("/ns:ItemAttributes/ns:PackageDimensions/ns:Length", xmlNsm); if (xmlNl.Count >= 1) productInfoAry[3] = xmlNl[0].InnerText; xmlNl = xmlDoc.SelectNodes("/ns:ItemAttributes/ns:PackageDimensions/ns:Width", xmlNsm); if (xmlNl.Count >= 1) productInfoAry[4] = xmlNl[0].InnerText; sw.WriteLine(string.Join(",", productInfoAry)); } sw.Close(); sw.Dispose(); } } }
GetMatchingProductForIdの実行結果
重さはポンドで高さや長さなどはインチとなっています。お好みで換算してあげてください。
商品によっては重量やサイズを設定されていないものがありますので注意してください。
また、商品名については極稀に改行コードが入った商品名がいたりします。取得した結果をそのままcsvやエクセルにぶっこむとおかしなことになるので注意しましょう。
わたしは、というか当ブログで公開しているAsinStockerは、ダブルクォーテーションと改行とカンマは除去しています。サンプルコードもそのようになっています。
商品名から英数記号の全角を半角に置換して、正規表現で英数記号だけ残してアメリカAmazonで検索しやすい文字列を生成するのもアリですね。(もちろん当ブログのStokerはそうしてます)
そもそもMWS APIはどんな商品情報・データが取得できるのか?
重量とかサイズが取得できるのはわかった!というかわかっている!
そもそも、いったいどんな商品データが取得できるのか?取得できるもの全部教えてくれ!
…そんなことを考えたことがあるのではないでしょうか?
教えましょう。これがわたしの目から見える商品情報です。
ここでは、並行輸入品でもっとも有名な例の商品をピックアップします。商品ページの記載と見比べてみると良いでしょう。
<?xml version="1.0" encoding="utf-8"?> <ns2:ItemAttributes xml:lang="ja-JP" xmlns:ns2="https://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd"> <ns2:Binding>おもちゃ&ホビー</ns2:Binding> <ns2:Brand>TruForce Collectibles</ns2:Brand> <ns2:Color>青</ns2:Color> <ns2:ItemDimensions> <ns2:Height Units="inches">6.00</ns2:Height> <ns2:Length Units="inches">2.00</ns2:Length> <ns2:Width Units="inches">2.00</ns2:Width> <ns2:Weight Units="pounds">0.95</ns2:Weight> </ns2:ItemDimensions> <ns2:IsAdultProduct>false</ns2:IsAdultProduct> <ns2:Label>Bluefin Distribution Toys</ns2:Label> <ns2:Languages> <ns2:Language> <ns2:Name>english</ns2:Name> <ns2:Type>Unknown</ns2:Type> </ns2:Language> </ns2:Languages> <ns2:Manufacturer>Bluefin Distribution Toys</ns2:Manufacturer> <ns2:ManufacturerMaximumAge Units="months">600.00</ns2:ManufacturerMaximumAge> <ns2:ManufacturerMinimumAge Units="months">36.00</ns2:ManufacturerMinimumAge> <ns2:Model>TRU02001</ns2:Model> <ns2:PackageDimensions> <ns2:Height Units="inches">2.90</ns2:Height> <ns2:Length Units="inches">10.00</ns2:Length> <ns2:Width Units="inches">8.10</ns2:Width> <ns2:Weight Units="pounds">0.95</ns2:Weight> </ns2:PackageDimensions> <ns2:PackageQuantity>1</ns2:PackageQuantity> <ns2:PartNumber>TRU02001</ns2:PartNumber> <ns2:Platform>No Operating System</ns2:Platform> <ns2:ProductGroup>Toy</ns2:ProductGroup> <ns2:ProductTypeName>TOYS_AND_GAMES</ns2:ProductTypeName> <ns2:Publisher>Bluefin Distribution Toys</ns2:Publisher> <ns2:SmallImage> <ns2:URL>https://ecx.images-amazon.com/images/I/411XrwtrIyL._SL75_.jpg</ns2:URL> <ns2:Height Units="pixels">75</ns2:Height> <ns2:Width Units="pixels">52</ns2:Width> </ns2:SmallImage> <ns2:Studio>Bluefin Distribution Toys</ns2:Studio> <ns2:Title>Designer Series X "Megaman X" アクションフィギュア (並行輸入品)</ns2:Title> </ns2:ItemAttributes>
上記はXMLという形式の文書です。こういう形での提供で申し訳ないです。さすがにすべてを手直しして公開、というのは大変すぎます。
XML文書とかいうやつは人間の目では理解しづらいのですが、プログラムには読み込ませやすい文書なんです。読み込ませて解析して自動で膨大な量をさばきます。
この中から英語を翻訳して、どんな情報が詰め込まれているか、解析してみてください。
重量やサイズについては、商品の重量・サイズと、発送重量・発送サイズで分かれていたりします。セラーとしてほしい情報はもちろん後者でしょう。
ただ、ここに乗っている情報がすべてなのかと言われるとそうではなくて、商品によってはバージョンなども取得することができます。
取得できるデータ量が膨大なので、わたしもすべてを把握できているのかと言われるとちょっと自信ないです。
また、JANなんかが取得できないのですが、それはPA-API側でしか取得できないようですね。
まとめ
今回ご紹介したライブラリでは、商品名や重量・サイズといったものが取得できます。
こういった情報は頻繁に更新されるものではないため、1度取得したらそれ以降使用しないような作りにしても良いかもしれませんね。
たとえば、ASINを1列に列挙して、その順番が入れ替わらないようであれば、実行は1度限りにしておくとか。
このライブラリは1時間に18,000件しかさばけません。こいつを使用しないようにしておけば、あとは価格の取得だけで済みますので、1時間に36,000件さばくことが可能になりますね。