前回の環境構築で「Nodejs + Phantomjs + Casperjs + Spookiejs」ができたので、色々なサイトのデータを取得してみたいと思います。
Spookiejsまでのインストールは
#1「Spookyjsの環境設定」を参照してください。
事前準備
Nodejsのライブラリを事前にインストールしておきましょう。
$ npm install date-utils
ソースコード@Amazonのタイムセールのリスト取得
var Spooky = require('spooky');
var fs = require('fs');
require('date-utils');
var dt = new Date();
var currentTime = dt.toFormat("YYYYMMDDHH24MISS");
var url = "https://www.amazon.co.jp/gp/goldbox/ref=nav_cs_gb";
var ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/601.2.7 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.7";
var req = {child: {transport: 'http'}};
var spooky = new Spooky(req , function(err){
spooky.userAgent(ua);
spooky.start(url);
spooky.then([{currentTime:currentTime} , function(){
var res = this.evaluate(function(currentTime){
var contents = document.getElementById("widgetContent");
if(contents==null){return;}
var items = contents.getElementsByClassName("singleCell");
var datas = [];
for(var i=0; i<items.length; i++){
var currentData = {
"dt" : currentTime,
"yen" : "",
"lnk" : "",
"img" : "",
"val" : ""
};
//price
var prices = items[i].getElementsByClassName("priceBlock");
if(prices.length){
var inlineBlock = prices[0].getElementsByClassName("inlineBlock");
if(inlineBlock.length){
var txt = inlineBlock[0].textContent;
var regExp = new RegExp("[ |,|(\u005C)|(\u00A5)]","g");
txt = txt.replace(regExp,"");
txt = txt.replace(/-/g,",");
currentData.yen = txt;
}
}
if(currentData.yen == ""){continue;}
//link , img , value
var dealTile = items[i].getElementsByClassName("dealTile");
if(dealTile.length){
//link
var links = dealTile[0].getElementsByTagName("a");
if(links.length){
currentData.lnk = links[0].href;
}
// img + value
var imgs = dealTile[0].getElementsByTagName("img");
if(imgs.length){
currentData.img = imgs[0].src;
currentData.val = imgs[0].alt;
}
}
datas.push(currentData);
// delete currentData;
}
return datas;
},currentTime);
this.emit("dataWrite",res);
}]);
spooky.then(function(data){
this.emit("end","Finish !!");
});
spooky.run();
});
spooky.on('dataWrite', function(datas) {
var dirPath = "./data/";
var filePath = dirPath + "amazon.json";
// data-folder
if(!fs.existsSync(dirPath)){
fs.mkdirSync(dirPath , 0755)
}
//data-lines
for(var i=0; i<datas.length; i++){
fs.appendFileSync(filePath , JSON.stringify(datas[i])+"\n");
}
});
spooky.on("end",function(msg){
res.end(msg);
});
実行
$ node amazon_timesale.js
実行後は、「data」「フォルダとその中に「amazon.js」ファイルが作成されます。
解説
データファイル「amazon.json」
毎回最新のデータが取得されますが、重複回避処理などは今回は入れていないので、コードを使う場合は、IDなどを入れて対応してください。
{"dt":"20170513092657","img":"https://m.media-amazon.com/images/G/09/Detail/Review/170513_AnkerDirect_DOTD._V509662549__AA210_.png","lnk":"https://www.amazon.co.jp/s/browse/ref=gbps_img_s-4_8327_31edf665?ie=UTF8&node=4817234051&smid=A2Q9OW6QVJC5XE&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"【20%OFF】Anker バッテリー、スピーカー、イヤホン 母の日セール","yen":"1119,4799"}
{"dt":"20170513092657","img":"https://m.media-amazon.com/images/G/09/goldbox/custom-image/20170331_0067_8100_DOTD._AA210_.jpg","lnk":"https://www.amazon.co.jp/dlp/d2a7c1bb/ref=gbps_img_s-4_8327_d2a7c1bb?smid=AN1VRQENFRJN5&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"【本日限定】象印の圧力IH炊飯ジャーがお買い得","yen":"17900,19900"}
{"dt":"20170513092657","img":"https://images-na.ssl-images-amazon.com/images/I/51gqUmXJY0L._AA210_.jpg","lnk":"https://www.amazon.co.jp/LG-55V%E5%9E%8B-%E6%9C%89%E6%A9%9FEL%E3%83%86%E3%83%AC%E3%83%93-%E5%A4%96%E4%BB%98%E3%81%91HDD%E9%8C%B2%E7%94%BB%E5%AF%BE%E5%BF%9C-55EG9100/dp/B01AOW6LE2/ref=gbps_img_s-4_8327_c3413e4e?smid=AN1VRQENFRJN5&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"LG 55V型 有機ELテレビ 曲面型 外付けHDD録画対応(裏録対応) OLED 55EG9100","yen":"158000"}
{"dt":"20170513092657","img":"https://images-na.ssl-images-amazon.com/images/I/31ZRHeDdXeL._AA210_.jpg","lnk":"https://www.amazon.co.jp/Anker-5200mAh-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%83%90%E3%83%83%E3%83%86%E3%83%AA%E3%83%BC-Android%E5%AF%BE%E5%BF%9C-A1211022/dp/B00P8TDWUI/ref=gbps_img_s-4_8327_448673e5?smid=A2Q9OW6QVJC5XE&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"Anker Astro E1 5200mAh コンパクトモバイルバッテリー 急速充電可 iPhone&Android対応","yen":"1279"}
{"dt":"20170513092657","img":"https://images-na.ssl-images-amazon.com/images/I/419oo3KN7aL._AA210_.jpg","lnk":"https://www.amazon.co.jp/%E3%83%8E%E3%83%BC%E3%83%88%E3%83%B3-%E3%82%A2%E3%83%B3%E3%83%81%E3%82%A6%E3%82%A4%E3%83%AB%E3%82%B9-%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF-1%E5%B9%B41%E5%8F%B0%E7%89%88-Win%E5%AF%BE%E5%BF%9C/dp/B01KTDHM62/ref=gbps_img_s-4_8327_b656706f?smid=AN1VRQENFRJN5&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"ノートン アンチウイルス ベーシックが38%OFF","yen":"2473"}
{"dt":"20170513092657","img":"https://images-na.ssl-images-amazon.com/images/I/41QNpasfDfL._AA210_.jpg","lnk":"https://www.amazon.co.jp/Amazon%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF-Apple%E8%AA%8D%E8%A8%BC-%E3%83%8F%E3%82%A4%E3%82%AF%E3%82%AA%E3%83%AA%E3%83%86%E3%82%A3%E3%83%BC-%E3%83%A9%E3%82%A4%E3%83%88%E3%83%8B%E3%83%B3%E3%82%B0USB%E5%85%85%E9%9B%BB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-%E5%B0%8F%E5%9E%8B%E3%83%98%E3%83%83%E3%83%89%E8%A8%AD%E8%A8%88/dp/B010U3XO3Q/ref=gbps_img_s-4_8327_3b9b3635?smid=AN1VRQENFRJN5&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"Amazonベーシック Apple認証 ハイクオリティー ライトニングUSB充電ケーブル 小型ヘッド設計 ブラック 約90cm","yen":"551"}
{"dt":"20170513092657","img":"https://images-na.ssl-images-amazon.com/images/I/51YzzCAsbmL._AA210_.jpg","lnk":"https://www.amazon.co.jp/Amazon%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF-AmazonBasics-HR-3UTG-AMZN-%E5%85%85%E9%9B%BB%E5%BC%8F%E3%83%8B%E3%83%83%E3%82%B1%E3%83%AB%E6%B0%B4%E7%B4%A0%E9%9B%BB%E6%B1%A0-%E6%9C%80%E5%B0%8F%E5%AE%B9%E9%87%8F1900mAh-%E7%B4%841000%E5%9B%9E%E4%BD%BF%E7%94%A8%E5%8F%AF%E8%83%BD/dp/B00CWNMV4G/ref=gbps_img_s-4_8327_9ecb7de9?smid=AN1VRQENFRJN5&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"Amazonベーシック 充電式ニッケル水素電池 単3形8個パック (最小容量1900mAh、約1000回使用可能)","yen":"1343"}
{"dt":"20170513092657","img":"https://images-na.ssl-images-amazon.com/images/I/51kD7ZiT5sL._AA210_.jpg","lnk":"https://www.amazon.co.jp/%E3%83%AC%E3%83%87%E3%82%A3%E3%83%BC%E3%82%B9-%E3%83%A9%E3%83%B3%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%B7%E3%83%A5%E3%83%BC%E3%82%BA-%E3%82%B9%E3%83%8B%E3%83%BC%E3%82%AB%E3%83%BC-%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0-24-5cm/dp/B01LXJZ06A/ref=gbps_img_s-4_8327_c82b77a8?smid=AZVSRFN3I9KN6&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"(メーレンヒューズ)Maylen Hughes スポーツ ランニングシューズ 軽量 通気 ウォーキング 男女通用","yen":"1999,2079"}
{"dt":"20170513092657","img":"https://images-na.ssl-images-amazon.com/images/I/31p0NanMe8L._AA210_.jpg","lnk":"https://www.amazon.co.jp/San-Benedetto-%E3%82%B5%E3%83%B3%E3%83%99%E3%83%8D%E3%83%87%E3%83%83%E3%83%88-%E3%83%8A%E3%83%81%E3%83%A5%E3%83%A9%E3%83%AB%E3%82%B9%E3%83%91%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%9F%E3%83%8D%E3%83%A9%E3%83%AB%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%BC500ml%C3%9736%E6%9C%AC-%E6%AD%A3%E8%A6%8F%E8%BC%B8%E5%85%A5%E5%93%81/dp/B00OPOJLT8/ref=gbps_img_s-4_8327_60ccf444?smid=AN1VRQENFRJN5&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"San Benedetto(サンベネデット) ナチュラルスパークリングミネラルウォーター500ml [正規輸入品]","yen":"1555,2150"}
{"dt":"20170513092657","img":"https://m.media-amazon.com/images/G/09/2017/electronics/other/JBL_CHARGE2Plus_ProductsImage._AA210_.jpg","lnk":"https://www.amazon.co.jp/dlp/a41582c7/ref=gbps_img_s-4_8327_a41582c7?smid=AN1VRQENFRJN5&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"【48%OFF】JBL Bluetoothスピーカー CHARGE2+","yen":"10100"}
{"dt":"20170513092657","img":"https://images-na.ssl-images-amazon.com/images/I/41Pb6F0pkVL._AA210_.jpg","lnk":"https://www.amazon.co.jp/dp/B06XDKWP74/ref=gbps_img_s-4_8327_362eee9d?smid=AN1VRQENFRJN5&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"アサヒ飲料 六条麦茶 660ml×24本","yen":"2066"}
{"dt":"20170513092657","img":"https://images-na.ssl-images-amazon.com/images/I/41ia7MVFiVL._AA210_.jpg","lnk":"https://www.amazon.co.jp/Amazon%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF-%E3%83%A8%E3%82%AC%E3%83%9E%E3%83%83%E3%83%88-%E5%8E%9A%E3%81%956%E3%83%9F%E3%83%AA-%E3%82%AD%E3%83%A3%E3%83%AA%E3%83%BC%E3%82%B9%E3%83%88%E3%83%A9%E3%83%83%E3%83%97%E4%BB%98%E3%81%8D%E3%81%A7%E6%8C%81%E3%81%A1%E9%81%8B%E3%81%B3%E3%81%AB%E4%BE%BF%E5%88%A9-%E3%83%91%E3%83%BC%E3%83%97%E3%83%AB/dp/B017C8O684/ref=gbps_img_s-4_8327_097e048d?smid=AN1VRQENFRJN5&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"Amazonベーシック ヨガマット 厚さ6ミリ キャリーストラップ付きで持ち運びに便利 パープル","yen":"1133"}
{"dt":"20170513092657","img":"https://images-na.ssl-images-amazon.com/images/I/41nylqddQXL._AA210_.jpg","lnk":"https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%AB%E9%87%91%E5%B1%9E-%E3%83%95%E3%83%A9%E3%82%A4%E3%83%91%E3%83%B3-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%80%E3%82%A4%E3%83%A4%E3%83%A2%E3%83%B3%E3%83%89%E3%82%B3%E3%83%BC%E3%83%88-HB-2018-IH%E9%9D%9E%E5%AF%BE%E5%BF%9C/dp/B01COWX4CC/ref=gbps_img_s-4_8327_4e895a70?smid=AN1VRQENFRJN5&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"パール金属 軽い フライパン 28cm ガス火専用 驚きの軽さ ブルーダイヤモンドコート HB-20","yen":"1454"}
{"dt":"20170513092657","img":"https://images-na.ssl-images-amazon.com/images/I/41t6jcv5XUL._AA210_.jpg","lnk":"https://www.amazon.co.jp/ANNTER-%E3%83%AF%E3%83%B3%E3%82%BF%E3%83%83%E3%83%81%E3%83%86%E3%83%B3%E3%83%88-%EF%BC%93-%EF%BC%94%E4%BA%BA%E7%94%A8-%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%97%E7%94%A8%E5%93%81-3%E8%89%B2%E9%81%B8%E6%8A%9E%E5%8F%AF%E8%83%BD/dp/B06XBYXW7T/ref=gbps_img_s-4_8327_db2dc0a6?smid=A1JHLFNIATAD36&pf_rd_p=c55b8890-4fe0-4b2b-81e7-3db3a6db8327&pf_rd_s=slot-4&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=NXAJBGMKDZZVCMFB6CFY","val":"ANNTER ワンタッチテント テント 3~4人用 設営簡単 防災用 2WAY キャンプ用品","yen":"5584"}
日本語フォントが表示されない
nodejsを実行するOSに日本語環境が無い場合は、正常に日本語対応ができません。
いかの対応をしてください。
#centos
$ yum install fonts-migmix
# ubuntu
$ apt-get install fonts-migmix
サーバーサイドで画面キャプチャ その2 #PhantomJs
クローリングするサイトのDOM構造の理解
クローリングする時に、どのエレメント情報を取得するかを見極める事が非常に重要です。
今回は下記の構造をプログラムでクロールしています。
#基本ID
ID:widgetContent
#リンク取得
class:singleCell
#画像URLとalt値(商品名)の取得
class:priceBlock
class:inlineBlock
上記のエレメントのどの属性を取得しているかは、JSコードを読み取ってください。
userAgent
nodejsでのクローリングをする際に、サイト側はユーザーエージェントがない状態になるらしく、端末判定などを行なっている場合は、意図しないソースコードが出力される場合があります。
それを回避する為に、ユーザーエージェントを設定しておきましょう。
var ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/601.2.7 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.7";
spooky.userAgent(ua);
関連リンク
クローリングシステム構築
0 件のコメント:
コメントを投稿