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

2017年5月16日

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

t f B! P L
前回の環境構築で「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);

リンク

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

1. Spookyjsの環境設定 2. クローリング基本ソースコード 3. WEBシステムとの連動環境構築

このブログを検索

プロフィール

自分の写真
プログラミングとサーバーを心の底から楽しむクリエーターです。 経営者であり、開発者でもありますが、得意としているのは、アイデア創出で、出来高は無限大です。

ブログ アーカイブ

QooQ