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 爬虫

时间: 2024-10-23 00:52:25

nodejs 爬虫的相关文章

Nodejs爬虫进阶教程之异步并发控制

Nodejs爬虫进阶教程之异步并发控制 之前写了个现在看来很不完美的小爬虫,很多地方没有处理好,比如说在知乎点开一个问题的时候,它的所有回答并不是全部加载好了的,当你拉到回答的尾部时,点击加载更多,回答才会再加载一部分,所以说如果直接发送一个问题的请求链接,取得的页面是不完整的.还有就是我们通过发送链接下载图片的时候,是一张一张来下的,如果图片数量太多的话,真的是下到你睡完觉它还在下,而且我们用nodejs写的爬虫,却竟然没有用到nodejs最牛逼的异步并发的特性,太浪费了啊. 思路 这次的的爬

NodeJS爬虫系统初探

NodeJS爬虫系统 NodeJS爬虫系统 0. 概论 爬虫是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上是针对爬虫而做出的优化. robots.txt是一个文本文件,robots.txt是一个协议,不是一个命令.robots.txt是爬虫要查看的第一个文件.robots.txt文件告诉爬虫在服务器上什么文件是可以被查看的,搜索机器人就会按照该文件中的内容来确定访问的范围. 一般网站的robots.txt查找方法: 例如www.qq.com http://ww

nodejs爬虫笔记(二)

node爬虫代理设置 最近想爬取YouTube上面的视频信息,利用nodejs爬虫笔记(一)的方法,代码和错误如下 var request = require('request'); var cheerio = require('cheerio');**** var url = 'https://www.youtube.com '; function crawler(url,callback){ var list = []; request(url,function(err,res){ if(e

Nodejs 爬虫简单编写

nodejs 爬虫原理,先用request请求页面内容,把内容获取到并iconv-lite设置编码格式,再用cheerio进行类似dom操作合并内容,转换写入文件中 1)获取单页面数据: var fs = require('fs') var request = require('request') var iconvLite = require('iconv-lite') var cheerio = require('cheerio') //请求 request({ url:'https://g

NodeJS 爬虫爬取LOL英雄联盟的英雄信息,superagent+cheerio+async

1.模块使用 (1)superagent:Nodejs中的http请求库(每个语言都有无数个,java的okhttp,ios的afnetworking) (2)cheerio:Nodejs中的html解析库(每个语言基本都有..) (3)async:Nodejs中的同/异步并发函数执行库(这个非常牛,其他语言同类型的不多) 2.爬取内容 多玩的英雄联盟英雄页面,通过解析页面内每个英雄的URL,然后并发请求英雄的详细数据,提取需要的数据得到结果 http://lol.duowan.com/hero

第一个nodejs爬虫:爬取豆瓣电影图片

第一个nodejs爬虫:爬取豆瓣电影图片存入本地: 首先在命令行下 npm install request cheerio express -save; 代码: var http = require('https'); //使用https模块 var fs = require('fs');//文件读写 var cheerio = require('cheerio');//jquery写法获取所得页面dom元素 var request = require('request');//发送reques

【nodeJS爬虫】前端爬虫系列

写这篇 blog 其实一开始我是拒绝的,因为爬虫爬的就是cnblog博客园.搞不好编辑看到了就把我的账号给封了:). 言归正传,前端同学可能向来对爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 php , python 等.当然这是在 nodejs 前了,nodejs 的出现,使得 Javascript 也可以用来写爬虫了.由于 nodejs 强大的异步特性,让我们可以轻松以异步高并发去爬取网站,当然这里的轻松指的是 cpu 的开销. 要读懂本文,其实只需要有 能看懂 Javascript 及

简单实现nodejs爬虫工具

约30行代码实现一个简单nodejs爬虫工具,定时抓取网页数据. 使用npm模块 request---简单http请求客户端.(轻量级) fs---nodejs文件模块. index.js var request = require('request'); var fs = require("fs"); var JJurl = "https://recommender-api-ms.juejin.im/v1/get_recommended_entry?suid=6bYFY7I

【实战】Ozon产品列表页及产品详情页nodejs爬虫

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 { "name": "1", "version": "1.0.0", "description": "", "main": "index.js", "dependencies": { "fs": "^0.