アマゾンのセール情報からASINを取得
以前とは違ってアマゾンのセール情報からASINを取得してみよう。セール情報から取得する場合はアマゾンが作ったセール用のnode番号が必要になる。
sync-requestとjsdomを使っていたが、今回はrequestとjsdomを使う。
Amazonの検索結果からasinをスクレイピング
https://qiita.com/99nyorituryo/items/c5d53a3ca8a4967b5927
ASINの取得
例として、「秋のKADOKAWAコミック&ラノベ フェア」のアドレスからASINをとる。
https://www.amazon.co.jp/b?ie=UTF8&node=8420570051
上のページを開いてからkindle本、ページ2を選ぶ。なぜそうするかというと、ページ番号を可変させて、一括でASINを取得したいから。
下のアドレスから、page=2を探して2の部分を入れ替えながら、requestで取得する。
jsdomやrequestをインストールする。
npm install jsdom
npm i request
ページからjsdomでasinを配列として出力している。1ページあたり16冊まで表示する。
サンプルコードは下のリンク先に置いています。
https://github.com/kyukyunyorituryo/books-paapi-sample
kindle_sale_asin_request.js
const request = require("request");
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
fs = require('fs');
function asinGet(html){
const dom = new JSDOM(html);
table=dom.window.document.querySelectorAll("h2.a-size-mini > a")
asin=[]//配列宣言
for (let i = 0; i < table.length; i++) {
asin[i]=table[i].href
asin[i]=asin[i].replace( /^.+dp\/(\w+)\/.+$/g , '$1' )
}
/*
ul class="a-pagination" li class="a-disabled a-last"
*/
if(dom.window.document.querySelectorAll("ul.a-pagination > li").length !== 0){
li=dom.window.document.querySelectorAll("ul.a-pagination > li")
flag=li[li.length-1].getElementsByTagName('a').length
}
else{flag=0}
console.log(asin)
console.log(flag)
return asin
}
function sleep(second) {
return new Promise(resolve => {
setTimeout(() => {
resolve()
}, second * 1000)
})
}
function requestPromise(param){
return new Promise((resolve, reject)=>{
request(param, function (error, response, body) {
if(error){
reject("ページを取得できませんでした");
}else{
// console.log(body);
asin=asinGet(body)
asinarray=asinarray.concat(asin)
resolve("取得できました");
}
})
})
}
(async function(){
day='秋のKADOKAWA'
flag=1
asinarray=[]
filename=day+'k.json'
//https://www.amazon.co.jp/s?rh=n%3A2250738051%2Cn%3A%212275265051%2Cn%3A%212275277051%2Cn%3A%218172192051%2Cn%3A%218187544051%2Cn%3A%218187545051%2Cn%3A%218187561051%2Cn%3A8187562051&page=2&qid=1594419906&ref=lp_8187562051_pg_2
//&price=100-10000
//'+i+'
loop1:for (let i =1; i <=500; i ++) {
var url='https://www.amazon.co.jp/s?i=digital-text&bbn=8420570051&rh=n%3A2250738051%2Cn%3A2275265051%2Cn%3A2275277051%2Cn%3A8172192051%2Cn%3A8419007051%2Cn%3A8420502051%2Cn%3A8420569051%2Cn%3A8420570051%2Cn%3A2275256051&dc&page='+i+'&fst=as%3Aoff&qid=1600614637&rnid=2250739051&ref=sr_pg_2'
if(flag==0){break loop1;}
await sleep(3)
await requestPromise(url);
console.log(i)
}
console.log(asinarray)
if(asinarray.length==0){
}else{
console.log('ファイルを書き込みます')
fs.writeFileSync(__dirname + '/json/kindle_sale/asin/'+filename, JSON.stringify(asinarray, null, 1),'utf-8')
}
}
)();
console.log("リクエスト開始");
取得したASINは次のリンクで説明するようにPA-APIでアフィリエイトサイトの情報やリンクを生成する。
PA-API v5でAmazonの商品情報を取得する
https://qiita.com/99nyorituryo/items/e337e6a75c361521f297
このASINを利用して実際のセールのページを作りました。
https://kyukyunyorituryo.github.io/kindle_sale/