Nodejs 网络爬虫(资讯爬虫) 案例
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实现高并发(限制不能频繁访问服务器)
Nodejs 网络爬虫(资讯爬虫) 案例的更多相关文章
- NodeJS网络爬虫
原文地址:NodeJS网络爬虫 网上有很多其他语言平台版本的网络爬虫,比如Python,Java.那怎么能少得了我们无所不能的javascript呢
- NodeJs实现简单的爬虫
1.爬虫:爬虫,是一种按照一定的规则,自动地抓取网页信息的程序或者脚本:利用NodeJS实现一个简单的爬虫案例,爬取Boss直聘网站的web前端相关的招聘信息,以广州地区为例: 2.脚本所用到的nod ...
- 【java爬虫】---爬虫+基于接口的网络爬虫
爬虫+基于接口的网络爬虫 上一篇讲了[java爬虫]---爬虫+jsoup轻松爬博客,该方式有个很大的局限性,就是你通过jsoup爬虫只适合爬静态网页,所以只能爬当前页面的所有新闻.如果需要爬一个网站 ...
- 中国爬虫违法违规案例汇总github项目介绍
中国爬虫违法违规案例汇总github项目介绍 GitHub - 本项目用来整理所有中国大陆爬虫开发者涉诉与违规相关的新闻.资料与法律法规.致力于帮助在中国大陆工作的爬虫行业从业者了解我国相关法律,避免 ...
- 【java爬虫】---爬虫+jsoup轻松爬博客
爬虫+jsoup轻松爬博客 最近的开发任务主要是爬虫爬新闻信息,这里主要用到技术就是jsoup,jsoup 是一款 Java的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非 ...
- [爬虫]Python爬虫基础
一.什么是爬虫,爬虫能做什么 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.比如它在抓取一个网 ...
- (Pyhton爬虫03)爬虫初识
原本的想法是这样的:博客整理知识学习的同时,也记录点心情...集中式学习就没这么多好记录的了! 要学习一门技术,首先要简单认识一下爬虫!其实可以参考爬虫第一章! 整体上介绍该技术包含技能,具体能做什么 ...
- python3爬虫--反爬虫应对机制
python3爬虫--反爬虫应对机制 内容来源于: Python3网络爬虫开发实战: 网络爬虫教程(python2): 前言: 反爬虫更多是一种攻防战,针对网站的反爬虫处理来采取对应的应对机制,一般需 ...
- PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台_3(附源码持续更新)
说明 文章首发于HURUWO的博客小站,本平台做同步备份发布. 如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览. 原文链接 PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二 ...
随机推荐
- FullCalendar日历插件(中文API)
FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发,本文将FullCalendar的常用属性和方法.回调函数等整理成中 ...
- Python__关于列表的引用 以append操作为例
对于列表这样的可变类型来说,对它操作是不会改变内存地址的. 若列表里面存的元素是整数这样的不可变类型,若修改这个元素那地址还是会改变,如: >>> a = [,,] >> ...
- linux socketpair
相对于无名管道来说,socketpair也是使用在亲缘进程之间,不过它提供了能够全双工通信的通道 man socketpair: #include <sys/types.h> /* See ...
- POJ:2367-Cleaning Shifts
传送门:http://poj.org/problem?id=2376 Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- 20145202 《信息安全系统设计基础》git安装
git的安装 直接输入指令将其安装就可以了. 安装的时候要设置公钥,我不知道以前在windows上设置过的公钥是否还能用所以我就还是从新搞了一个. 验证可以连通 遇到的问题
- android stadio open recent 在同一窗口打开
Android staido 有一个功能是open recent ,默认是下面这样的: 就出来一个框,给你选择,是在新的窗口打开,还是在当前窗口打开.如果你选了当前窗口,并且点了Remember,do ...
- java.lang.RuntimeException: Handler (com.***.behavior.BEvent$1) {421bca80} sending message to a Hand
java.lang.RuntimeException: Handler (com.***.behavior.BEvent$1) {421bca80} sending message to a Hand ...
- Java与Scala的两种简易版连接池
Java版简易版连接池: import java.sql.Connection; import java.sql.DriverManager; import java.util.LinkedList; ...
- zedboard烧写SD卡启动linux镜像
1. 先把SD卡格式化,然后把镜像文件拷贝到SD卡,下面应该是没有文件系统的 2. 插上SD卡,Zedboard设置启动模式,有5个跳线帽,配置如下,上电启动 3. 看下串口的输出
- 《Cracking the Coding Interview》——第3章:栈和队列——题目1
2014-03-18 03:19 题目:用一个数组实现3个栈. 解法: 首先我想过让三个栈动态决定长度.要么左右各一个向中间靠拢,要么三个穿插着,后来都觉得实现起来太复杂,而且思路总有各种功能缺陷,会 ...