MMathias PetterssonUpdate jQuery
97f7a322创建于 2011年6月1日历史提交
var request = require('request');
var jsdom  = require('jsdom');
var requestDefaults = {
	'uri': null
	, 'headers': {
		'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
	}
};
var fetchDefaults = {
	'reqPerSec': 0
};
module.exports = function scrape(requestOptions, callback, fetchOptions) {
	if (!fetchOptions) {
		fetchOptions = {};
	}
	if (!callback) {
		callback = function(){};
	}
	Object.keys(fetchDefaults).forEach(function(key) {
		if (fetchOptions[key] === undefined) {
			fetchOptions[key] = fetchDefaults[key]
		}
	});

	var fetches = [];
	var queue = [];

	if (!Array.isArray(requestOptions)) {
		fetches.push(requestOptions);
	} else {
		fetches = requestOptions;
	}

	fetches.forEach(function(requestOptions, index) {
		queue.push(function() {
			Object.keys(requestDefaults).forEach(function(key) {
				requestOptions[key] = requestOptions[key] || requestDefaults[key];
			});
			if (typeof requestOptions === 'string') {
				requestOptions = {
					'uri': requestOptions
				}
			}

			if (!requestOptions['uri']) {
				callback(new Error('You must supply an uri.'), null, null);
			}

			request(requestOptions, function (err, response, body) {
				body = body.replace(/<(\/?)script/g, '<$1nobreakage');
				setTimeout(runNextFetch, timeSpacing);
				if (err) {
					callback(err, null, null);
				}
				if (response && response.statusCode == 200) {
					var window = jsdom.jsdom().createWindow();
					jsdom.jQueryify(window, __dirname+'/../deps/jquery-1.6.1.min.js', function(win, $) {
						$('head').append($(body).find('head').html());
						$('body').append($(body).find('body').html());
						callback(null, $);
					});
				} else {
					callback(new Error('Request to '+requestOptions['uri']+' ended with status code: '+(typeof response !== 'undefined' ? response.statusCode : 'unknown')), null, null);
				}
			});
		})
	});

	var concurrentConnections = !fetchOptions['reqPerSec'] ? queue.length : (Math.floor(fetchOptions['reqPerSec']) || 1);
	var timeSpacing = !fetchOptions['reqPerSec'] ? 0 : 1000/fetchOptions['reqPerSec'];

	for (var i=0; i < concurrentConnections; i++) {
		runNextFetch(i);
	};

	function runNextFetch(i) {
		if (!i) {
			i = 0;
		}
		if (queue[i]) {
			queue[i]();
			queue.shift();
		}
	}
};