1. superagent
superagent 是一个流行的nodejs第三方模块,专注于处理服务端/客户端的http请求。在nodejs中,我们可以使用内置的http等模块来进行请求的发送、响应处理等操作,不过superagent提供了更加简单、优雅的API,让你在处理请求时更加方便。而且它很轻量,学习曲线平滑,内部其实就是对内置模块的封装。
可以认为是node端的ajax
request
.post('/api/pet')
.send({ name: 'Manny', species: 'cat' })
.set('X-API-Key', 'foobar')
.set('Accept', 'application/json')
.end(function(err, res){
if (err || !res.ok) {
alert('Oh no! error');
} else {
alert('yay got ' + JSON.stringify(res.body));
}
});
2. supervisor node
supervisor 可以监视代码的改动,并自动重启 Node.js,保证改动服务器代码后,不用手动重启服务器
npm -g install supervisor 必须全局安装
3. cheerio
在node中可以使用类似jQuery的方法操作html元素,可以方便的对爬虫到的网页html资源进行相关操作,上手容易,操作方法和jquery几乎一致
var cheerio = require("cheerio");
var server = require("./curl");
var url = "http://v.163.com/special/opencourse/englishs1.html"
server.download(url, function(data) {
if (data) {
//console.log(data);
var $ = cheerio.load(data);
$("a.downbtn").each(function(i, e) {
console.log($(e).attr("href"));
});
console.log("done");
} else {
console.log("error");
}
});
4. 爬虫逻辑实现完整代码演示
功能页面获取数据如下:
var superagent = require('superagent');
var cheerio = require('cheerio');
var url = require('url');
var qs = require('querystring');
var cnodeUrl = "https://www.xxxx.com/";
var CNode = function(url) {
cnodeUrl = url;
}
CNode.prototype = {
getData: function(res) { 此处res是index页面中的res
superagent.get(cnodeUrl) 实现类似ajax获取页面数据
.end(function(err, sres) { 写回调函数
if (err) throw err;
var $ = cheerio.load(sres.text); 引入cheerio入口
cheerio的类似jquery操作
var lastPageUrl = $('.className li:last-child').find('a').attr('href');
var queryUrl = url.parse(lastPageUrl).query; 获取url参数
var obj = qs.parse(queryUrl);
var totalPages = obj.page;
var items = []; 设置数组,存储需要的数据
$('#id .className').each(function(index, element) {
var $element = $(element);
var type = $element.parent().parent().find('.topic_tab').text();
items.push({
title: $element.attr('title'),
href: $element.attr('href'),
link: url.resolve(cnodeUrl, $element.attr('href')),
type: type
})
console.log(items)
})
items.totalPages = totalPages;
res.send(items); 向页面发送处理好的数据
})
}
}
module.exports = CNode; 对外暴露数据
index页面加载数据如下:(由于是在express assistant环境下写创建的,所以此处是以路由形式向外暴露,服务器运行在bin/www文件中)
var express = require('express');
var router = express.Router();
var CNode = require('./cnode');
/* GET home page. */
router.get('/', function(req, res, next) {
var requestUrl = " https://www.xxxx.com/";
var _cnode = new CNode(requestUrl);
_cnode.getData(res);
});
module.exports = router;
5. node-schedule 实现定时任务(可与高并发结合)
6. async实现高并发(限制不能频繁访问服务器)