UNPKG

crawler-js

Version:

Opensource Framework Crawler in Node.js

244 lines (229 loc) 10.2 kB
var utils = require('./utils'); get_html = require('./get_html'), lettersCombinations = require('./letters_combinations.js'), querystring = require('querystring'); var getAttributes = function(entry,config){ var csv = /\[csv:[^:]{0,}:[^:]{0,}:(.[0-9]{0,10}?):(.[0-9]{0,10}?)\]/gim; var mongodb = /\[mongodb:[^:]{0,}:[^:]{0,}:[^:]{0,}\]/gim; var words = /\[words:\[[^\]]{0,}\]\]/gim; var numbers = /\[numbers:(.[0-9]{0,10}?):(.[0-9]{0,10}?):(.[0-9]{0,10}?)\]/gim; var letters = /\[letters:(.[0-9]{0,}?)\]/gim; var types = []; if(words.test(entry) == true){ var types = types.concat(entry.match(words)); } if(numbers.test(entry) == true){ var types = types.concat(entry.match(numbers)); } if(letters.test(entry) == true){ var types = types.concat(entry.match(letters)); } if(mongodb.test(entry) == true){ var types = types.concat(entry.match(mongodb)); } if(csv.test(entry) == true){ var types = types.concat(entry.match(csv)); } var allAttributes = []; for(n in types){ var url = types[n].replace(/(\[|\])/gim,''); var attribute = url.split(':'); var attributes = []; attributes['name'] = attribute[0]; attributes['parameter'] = types[n]; if(attribute[0] == 'words'){ attribute = attribute.splice(1); attributes['init'] = 0; attributes['words'] = attribute; attributes['total'] = attribute.length-1; } else if(attribute[0] == 'numbers'){ attributes['init'] = parseInt(attribute[1]); attributes['size'] = parseInt(attribute[2]); attributes['diff'] = parseInt(attribute[3]); attributes['total'] = parseInt((attributes['size']-attributes['init'])/attributes['diff']); } else if(attribute[0] == 'letters'){ attributes['init'] = 0; attributes['letters'] = lettersCombinations(parseInt(attribute[1])); attributes['total'] = attributes['letters'].length-1; } else if(attribute[0] == 'csv'){ attributes['file'] = attribute[1]; attributes['delimiter'] = attribute[2]; attributes['data'] = attribute[3]; attributes['csvId'] = attribute[4]; attributes['total'] = 0; } if(attributes['total'] == 0){attributes['total']=1;} attributes['first']=1; allAttributes[n] = attributes; } return allAttributes; } var getEntry = function(font,url,config){ if(typeof font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']] !== 'undefined'){ for(var c = font[font['type']+'Attributes'].length-1; c>=0; c--){ if(c == font[font['type']+'Attributes'].length-1){ font[font['type']+'Attributes'][c]['interval'] = font.interval; }else{ font[font['type']+'Attributes'][c]['interval'] = font[font['type']+'Attributes'][c+1]['interval']*(font[font['type']+'Attributes'][c+1]['total']+1); } } var count = 0; if(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['first'] == 1){ font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['first'] = 0; getTypeUrl(font,url,config); count++; } if(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['name'] != 'csv'){ var i = setInterval(function(){ getTypeUrl(font,url,config); count++; if(count > font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['total']){ clearInterval(i); } }, font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['interval']); } }else{ if(font[font['type']+'Attributes'].length == 0){ if(font.preview > 1){ url['get'] = font['getSample']; if(font['postSample'] != ''){ url['post'] = font['postSample']; } }else{ url['get'] = font['get']; if(font['post'] != ''){ url['post'] = font['post']; } } } putItem(font,url,config); } } var getTypeUrl = function(font,url,config){ if(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['name'] == 'words'){ words(font,url,config); } else if(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['name'] == 'numbers'){ numbers(font,url,config); } else if(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['name'] == 'letters'){ letters(font,url,config); } else if(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['name'] == 'mongodb'){ readMongoDb(font,url,config); } else if(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['name'] == 'csv'){ readCsv(font,url,config); } } var numbers = function(font,url,config){ url[font['type']] = font[font['type']].replace(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['parameter'],font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['init']); font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['init'] = font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['init']+font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['diff']; var fontTemp = utils.clone(font); fontTemp[font['type']+'CurrentEntry']++; fontTemp[font['type']] = url[font['type']]; getEntry(fontTemp,url,config); } var letters = function(font,url,config){ url[font['type']] = font[font['type']].replace(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['parameter'],font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['letters'][font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['init']]); font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['init'] = font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['init']+1; var fontTemp = utils.clone(font); fontTemp[font['type']+'CurrentEntry']++; fontTemp[font['type']] = url[font['type']]; getEntry(fontTemp,url,config); } var words = function(font,url,config){ if((typeof font['encode'+font['type']] != 'undefined' && font['encode'+font['type']] == true) || (typeof font['encode'+font['type']] == 'undefined' && font['type'] == 'get')){ var urlTemp = encodeURIComponent(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['words'][font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['init']]); }else{ var urlTemp = font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['words'][font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['init']]; } url[font['type']] = font[font['type']].replace(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['parameter'],urlTemp); font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['init'] = font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['init']+1; var fontTemp = utils.clone(font); fontTemp[font['type']+'CurrentEntry']++; fontTemp[font['type']] = url[font['type']]; getEntry(fontTemp,url,config); } var putItem = function (font,url,config){ if((font['get'] != '' && font['post'] == '') || (font['get'] != '' && font['post'] != '' && font['type'] == 'post')){ if(font.preview === 1){ console.log(JSON.stringify(url)); }else{ var font = utils.clone(font); var url = utils.clone(url); get_html.getHtml(font,url,config); } }else{ font['type'] = "post"; var fontTemp = utils.clone(font); fontTemp[font['type']+'CurrentEntry']=0; getEntry(fontTemp,url,config); font['type'] = "get"; } } var readCsv = function(font,url,config){ var file = './' + font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['file']; var stream = require('fs').createReadStream(file); var first = 0; stream.on('data', onData).buffer = ''; function onData(chunk){ var i, hasData = Buffer.isBuffer(chunk); if(hasData){ stream.buffer += chunk.toString('utf8'); if(stream.paused) return; } if ((i = stream.buffer.indexOf('\n')) > -1) { var line = stream.buffer.substring(0, i); stream.buffer = stream.buffer.substring(i + 1); stream.pause(); stream.paused = true; onLine(font, url, config, line, onData, first); } else if (!hasData) { stream.resume(); stream.paused = false; } } function onLine(font, url, config, line, cb, first){ if(first == 1){ first = 0; var interval = 0; }else{ var interval = font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['interval']; } setTimeout(function(){ line = line.replace('\r','').replace(/^"(.+(?="$))"$/, '$1'); data = line.split('"'+font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['delimiter']+'"'); if(data.length == 1){ data = data[0].split(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['delimiter']); } toJson(font,url,data,config); cb(); }, interval); } } var toJson = function(font,url,row,config){ var data = font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['data']; var csvId = font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['csvId']; if(typeof row[data] !=='undefined' && row[data] !=''){ if(typeof row[csvId] !=='undefined' && row[csvId] !=''){ url.csvId = row[csvId]; } if((typeof font['encode'+font['type']] != 'undefined' && font['encode'+font['type']] == true) || (typeof font['encode'+font['type']] == 'undefined' && font['type'] == 'get')){ row[data] = encodeURIComponent(row[data].trim()); } url[font['type']] = font[font['type']].replace(font[font['type']+'Attributes'][font[font['type']+'CurrentEntry']]['parameter'], row[data]); var fontTemp = utils.clone(font); fontTemp[font['type']+'CurrentEntry']++; fontTemp[font['type']] = url[font['type']]; getEntry(fontTemp,url,config); } } module.exports = { getAttributes: getAttributes, getEntry: getEntry };