node.jsのsync-requestとjsdomを使って、アマゾンから商品のasinを取得してみる。
まず、5月24日発売のkindleの本を例にとって取得する。browsenodeを変えると違う内容も同じように取得できるだろう。ページ数は4あり、それぞれを自動で切り替えて最終ページになるとbreakして止まるようにしている。sync-requestを利用しているので同期処理で書いています。
sync-requestとjsdomはそれぞれ、インストールする。
npm install sync-request
npm install jsdom
5月24日発売のkindleの本のURL
https://www.amazon.co.jp/s?i=digital-text&bbn=2275256051&rh=n%3A2250738051%2Cn%3A2275256051%2Cp_n_date%3A20200524&dc&qid=1588732789&ref=sr_ex_n_1
日付やページの部分を書き換えて自動で取得している。
ページからjsdomでasinを配列として出力している。1ページあたり16冊まで表示する。
varrequest=require('sync-request');constjsdom=require("jsdom");const{JSDOM}=jsdom;fs=require('fs');day=20200524flag=1asinarray=[]loop1:for(leti=1;i<=100;i++){varurl='https://www.amazon.co.jp/s?i=digital-text&rh=n%3A2250738051%2Cn%3A2250739051%2Cn%3A2275256051%2Cp_n_date%3A'+day+'&s=date-desc-rank&page='+i+'&qid=1588652675&ref=sr_pg_2'//console.log(url)if(flag==0){break;}html=httpGet(url);asin=asinGet(html)asinarray=asinarray.concat(asin)}console.log(asinarray)functionhttpGet(url){varres=request('GET',url);response=res.getBody('utf-8')//console.log(response);returnresponse;}functionasinGet(html){constdom=newJSDOM(html);table=dom.window.document.querySelectorAll("h2.a-size-mini > a")asin=[]//配列宣言for(leti=0;i<table.length;i++){asin[i]=table[i].hrefasin[i]=asin[i].replace(/^.+dp\/(\w+)\/.+$/g,'$1')}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)returnasin}