nodejs 爬虫
参考了各位大大的,然后自己写了个爬虫
用到的modules:
utils.js --- moment
module_url.js
var http = require("http"); //获得页面数据
var cheerio = require("cheerio"); //分析页面数据,提取内容
var sanitize = require("validator"); //过滤没用的数据 如空格等
var fs = require('fs'); //操作文件,保存结果
app.js
var async = require("async"); //异步操作 如each, filter
var ts = require("timespans") //计算花费时间
var sanitize = require("validator"); //过滤没用的数据 如空格等
获得每个页面的话题列表 -- 并行的
根据话题列表获得的话题具体内容 -- 并行的 但是最后输出的内容是按顺序的
别处拷来的utils 里面重写了下console.log 增加了输出的时间
var moment = require('moment');
exports.inc = function(n, callback, timeout) {
timeout = timeout || 200;
setTimeout(function() {
callback(null, n+1);
}, timeout);
};
exports.fire = function(obj, callback, timeout) {
timeout = timeout || 200;
setTimeout(function() {
callback(null, obj);
}, timeout);
};
exports.err = function(errMsg, callback, timeout) {
timeout = timeout || 200;
setTimeout(function() {
callback(errMsg);
}, timeout);
};
// utils
exports.log = function(msg, obj) {
process.stdout.write(moment().format('ss.SSS')+'> ');
if(obj!==undefined) {
process.stdout.write(msg);
console.log(obj);
} else {
console.log(msg);
}
};
exports.wait = function(mils) {
var now = new Date;
while(new Date - now <= mils);
}
utils.js
抓取页面数据
//获得页面数据
var http = require("http");
//分析页面数据,提前内容
var cheerio = require("cheerio");
//过滤没用的数据 如空格等
var sanitize = require("validator");
//操作文件,保存结果
var fs = require('fs'); var scrapy = {};
scrapy.get = function(url, callback) {
http.get(url, function(res) { var size = 0;
var chunks = []; res.on('data', function(chunk) {
size += chunk.length;
chunks.push(chunk);
}); res.on('end', function() {
var data = Buffer.concat(chunks, size);
callback(null, data);
}); }).on('error', function(e) {
callback(e, null);
});
} var getPage = function(pageUrl, callback){
scrapy.get(pageUrl, function(err, data){
if(err){
callback(err);
} var html = data.toString();
$ = cheerio.load(html);
//title link, link to detail page
var news = $('.cell .topic_title_wrapper a');
callback(null, news);
});
} var getDetail = function(detailUrl, callback){
scrapy.get(detailUrl, function(err, data){
if(err){
callback(err);
} var html = data.toString();
$ = cheerio.load(html);
var item = {};
item.href = detailUrl;
$('.header .topic_full_title .put_top').remove(); //删除 “置顶”
item.title = sanitize.escape(sanitize.trim($('.header .topic_full_title').text()));
item.content = sanitize.escape(sanitize.trim($('.inner.topic .topic_content').text())); callback(null, item);
});
} var save = function(fileName, data) {
var result = JSON.stringify(data);
fs.writeFileSync(fileName, result);
} exports.getUrl = scrapy.get;
exports.getPage = getPage;
exports.getDetail = getDetail;
exports.save = save;
module_url.js
主文件
//自定义console.log 加入了输出时间
var utils = require("./utils");
var log = utils.log;
//异步操作 如each, filter
var async = require("async");
//计算花费时间
var ts = require("timespans")
//过滤没用的数据 如空格等
var sanitize = require("validator");
var url = require("./module_url") var baseUrl = 'http://cnodejs.org';
var pageUrl = baseUrl + '/?page=';
var isOnlyTitle = true;
var pages = [];
for (var i = 1; i < 4; i++) {
pages.push(i);
}; ts.start();
var titles = {};
//page 之间并行
async.forEach(pages, function(page, callback_each){
titles[page] = []; url.getPage(pageUrl + page, function(err, news){
if(err){
log("page error");
return;
} if (news.length === 0) {
log("no data for the page:" + page);
return;
} async.filter(news, function(index, callback){
var detailUrl = baseUrl + news[index].attribs['href']; if(isOnlyTitle){
var curNew = news[index];
var item = {};
item.href = detailUrl;
$(curNew).find(".put_top").remove(); //删除 “置顶”
item.title = sanitize.escape(sanitize.trim($(curNew).text())); titles[page][index] = item; callback(true);
}
else{
url.getDetail(detailUrl, function(err, item){
if(err){
log("detail error");
return;
}
titles[page][index] = item;
//titles[page].push(item); callback(true);
});
}
}, function(result){
//log("filter news:", result);
callback_each(null);
}); });
}, function(err){
ts.stop();
//ts.pause(); --- ts.continue();
console.log('total: %s pause: %s used: %s', ts.elapsedtime(), ts.pausetime(), ts.usedtime());
log(titles);
//url.save("cnodejs.json", titles);
});
app.js
另外:想实现抓取某个时间段内的话题,努力ing...
nodejs 爬虫的更多相关文章
- NodeJS 爬虫爬取LOL英雄联盟的英雄信息,批量下载英雄壁纸
工欲善其事,必先利其器,会用各种模块非常重要. 1.模块使用 (1)superagent:Nodejs中的http请求库(每个语言都有无数个,java的okhttp,OC的afnetworking) ...
- Nodejs爬虫进阶教程之异步并发控制
Nodejs爬虫进阶教程之异步并发控制 之前写了个现在看来很不完美的小爬虫,很多地方没有处理好,比如说在知乎点开一个问题的时候,它的所有回答并不是全部加载好了的,当你拉到回答的尾部时,点击加载更多,回 ...
- NodeJS爬虫系统初探
NodeJS爬虫系统 NodeJS爬虫系统 0. 概论 爬虫是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上是针对爬虫而做出的优化. robots.txt是一个文本文 ...
- nodejs爬虫——汽车之家所有车型数据
应用介绍 项目Github地址:https://github.com/iNuanfeng/node-spider/ nodejs爬虫,爬取汽车之家(http://www.autohome.com.cn ...
- nodejs爬虫笔记(三)---爬取YouTube网站上的视频信息
思路:通过笔记(二)中代理的设置,已经可以对YouTube的信息进行爬取了,这几天想着爬取网站下的视频信息.通过分析YouTube,发现可以从订阅号入手,先选择几个订阅号,然后爬取订阅号里面的视频分类 ...
- nodejs爬虫笔记(二)---代理设置
node爬虫代理设置 最近想爬取YouTube上面的视频信息,利用nodejs爬虫笔记(一)的方法,代码和错误如下 var request = require('request'); var chee ...
- 【nodeJS爬虫】前端爬虫系列
写这篇 blog 其实一开始我是拒绝的,因为爬虫爬的就是cnblog博客园.搞不好编辑看到了就把我的账号给封了:). 言归正传,前端同学可能向来对爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 ph ...
- 简单实现nodejs爬虫工具
约30行代码实现一个简单nodejs爬虫工具,定时抓取网页数据. 使用npm模块 request---简单http请求客户端.(轻量级) fs---nodejs文件模块. index.js var ...
- 第一个nodejs爬虫:爬取豆瓣电影图片
第一个nodejs爬虫:爬取豆瓣电影图片存入本地: 首先在命令行下 npm install request cheerio express -save; 代码: var http = require( ...
- nodejs爬虫如何设置动态ip以及userAgent
nodejs爬虫如何设置动态ip以及userAgent 转https://blog.csdn.net/u014374031/article/details/78833765 前言 在写nodejs爬虫 ...
随机推荐
- Exadata Adaptive Scrubbing Schedule
1.为什么要引入"Hard Disk Scrub and Repair"特性 在exadata的11.2.3.3.0版本中,开始引进了"Automatic Hard Di ...
- 解决Eclipse导入Gradle项目时在 Building gradle project info 一直卡住
问题描述 在使用 Eclipse 导入 Gradle 项目时一直卡住,不能导入项目 问题解决 解决办法主要有两种:一是直接下载 gradle 离线包,二是修改项目的 ..\gradle\wrapp ...
- PHP var_export
var_export可以将一个数组转为一个字符串 不同于var_dump,var_export并不会输出数据的类型以及字符大小等,只会简单把数组的key跟value拼接成一个字符串 <?php ...
- AD按键-矩阵按键-独立按键:
原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...
- 牛客网训练赛26D(xor)
题目链接:https://www.nowcoder.com/acm/contest/180/D 线性基的学习:https://www.cnblogs.com/vb4896/p/6149022.html ...
- zk小结
一 ZooKeeper功能 1.文件系统 2.通知机制 二 Zookeeper文件系统 每个子目录项都被称作为znode,和文件系统一样,我们能够自由的增加.删除znode,在一个znode下增加.删 ...
- Cache 和 Buffer 区别是什么
一 从常识来说,cache叫缓存,buffer叫缓冲. 二 尴尬的是缓存是什么?缓冲是什么? 缓冲,缓和冲击.也就是100次保存数据库,先把操作保存到本地,然后满10次才保存到数据库. 缓存,就是缓冲 ...
- ElasticsearchIllegalArgumentException[failed to find analyzer [ik]]问题解决
ElasticsearchIllegalArgumentException[failed to find analyzer [ik]] 没有找到分词器 请查看本博客经得住实践的文章:http://bl ...
- SpringBoot2.0之三 优雅整合Spring Data JPA
在我们的实际开发的过程中,无论多复杂的业务逻辑到达持久层都回归到了"增删改查"的基本操作,可能会存在关联多张表的复杂sql,但是对于单表的"增删改查"也是不 ...
- 使用compiz出现奔溃的一些应急办法
Linux Mint 17.1 CompizConfig is also installed by default so you can configure every aspect of Compi ...