[Nodejs] クローリングシステム構築 #2.クローリング基本ソースコード

2017年5月16日

Nodejs テクノロジー プログラミング 特集

前回の環境構築で「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);

関連リンク

クローリングシステム構築

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ