博客详情

nodejs爬虫之request、cheerio (原创)

作者: 朝如青丝暮成雪
发布时间:2018-03-11 22:18:14  文章分类:nodejs   阅读(1383)  评论(0)

前面,我们介绍了nodejs中一些基础的api、express框架、mysql api、mongodb api 等。

本篇我们介绍下nodejs在爬虫领域的应用。相比python,nodejs的爬虫实现起来要更简单,又因为是异步,支持的并发高,性能相比python也更高一些。

好了,废话不多讲,直接上代码吧。

第一个案例,爬取京东网首页左侧栏的所有一级商品分类,并打印。

代码如下:



var request=require('request');
var cheerio=require('cheerio');

//获取京东首页的左侧栏一级菜单的列表
request.get("https://www.jd.com/",function (err,response,body) {
    if(err){
        throw err;
    }
    if(response&&response.statusCode==200){
         var $ =cheerio.load(body);
       // console.log($("li.cate_menu_item").length);//16
        //console.log($("ul.cate_menu li.cate_menu_item").length);//16

         var  arr=[];
        $("ul.cate_menu li.cate_menu_item").each(function (i) {
            //   arr[i]=$(this).text().replace(/[\n,\t]/g,'').trim();

            var title="";
            var aa =$(this).find('a').toArray();
            for(var item of aa){
               // console.log($(item).text());
                title+=$(item).text()+"/";
            }
            arr[i]=title.substring(0,title.length-1);

          });
         console.log(arr);//打印结果 (数组)
    }
});
打印结果如下:


[ '家用电器',
  '手机/运营商/数码',
  '电脑/办公',
  '家居/家具/家装/厨具',
  '男装/女装/童装/内衣',
  '美妆个护/宠物',
  '女鞋/箱包/钟表/珠宝',
  '男鞋/运动/户外',
  '房产/汽车/汽车用品',
  '母婴/玩具乐器',
  '食品/酒类/生鲜/特产',
  '艺术/礼品鲜花/农资绿植',
  '医药保健/计生情趣',
  '图书/音像/电子书',
  '机票/酒店/旅游/生活',
  '理财/众筹/白条/保险' ]

第二个案例,爬取电影天堂所有的最新上映的影片信息,并保存到本地文件。


var request=require('request');
var cheerio=require('cheerio');
var iconv=require('iconv-lite');
var fs=require('fs');

var async=require('async');

//var  url="http://www.dytt8.net/html/gndy/dyzz/list_23_1.html";
var  baseUrl="http://www.dytt8.net/html/gndy/dyzz/list_23_"; //1.html 2.html 3.html ...

//1 - 172 页
/*
 movie 对象
* {
* title:'xxxx',
* createtime:'2017-09-08 10:20:10',
* description:'xxxxx'
* }
* */

//获取最新电影
function getLatestMoves(page,callback) {
    request.get({
        url:baseUrl+page, //1.html  2.html  3.html ...
        encoding:null,
        headers:{
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
        }
    },function (err,response,body) {
        if (err) {
            throw err;
        }
        if(response&& response.statusCode==200){
            //co_content8
            //    var $=cheerio.load(body);
            var $=cheerio.load(iconv.decode(body, 'gbk'));


            //console.log($("div.co_content8 > ul > table").length);//25条数据 每页

            var movies =[];
            $("div.co_content8 > ul > table").each(function (i) {
                var ctx=$(this);
                var move ={};

                //title  ok
                var title=ctx.find("tr").eq(1).find('td').eq(1).text().trim();
                // console.log(title);
                move.title=title;

                //createtime
                var createtime =ctx.find("tr").eq(2).find('td').eq(1).text().trim();
                createtime=  createtime.replace(/点击\:\d+/g, '').replace(/日期\:/,'').trim();
                move.createtime=createtime;

                var description=ctx.find('tr').eq(3).find('td').eq(0).text().trim();
                 move.description=description;


                movies.push(move);
            });//end 循环

            callback(movies);//回调返回
        }else{
            callback(undefined);
        }
    });
}


var  pages=[];
for(var i=0;i<172;i++){
    pages[i]=(i+1)+".html";
}
var saveDir="f:/11/dyttData";

async.mapLimit(pages ,10, function(page, callback) {
    getLatestMoves(page,function (data) {
        // 1.html
        var i=page.replace(/\.html/g,'');

       fs.writeFile(saveDir+"/movie_"+i+".txt",JSON.stringify(data),function (err) {
           if (err) {
               throw  err;
           }else{
               console.log('写入数据ok');

              // callback(null);
           }
       });
        callback(null,"successful!");

    });

},function (err,results) {
    if(err){
        throw err;
    }
    // console.log(result);// 会输出一个有大量个 "successful!" 字符串的数组
    console.log("数据全部已下载完毕!");

});



需要注意的是电影天堂网(http://www.dytt8.net/)是采用gb2312的古老编码格式,故请求和获取响应时需要一些特殊的编码设置。


request.get({
        url:baseUrl+page, //1.html  2.html  3.html ...
        encoding:null,
        headers:{
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
        }
    },


var $=cheerio.load(iconv.decode(body, 'gbk'));



运行完成, 会下载电影信息到本地磁盘中。


关键字:  nodejs  爬虫
评论信息
暂无评论
发表评论

亲,您还没有登陆,暂不能评论哦! 去 登陆 | 注册

博主信息
   
数据加载中,请稍候...
文章分类
   
数据加载中,请稍候...
阅读排行
 
数据加载中,请稍候...
评论排行
 
数据加载中,请稍候...

Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1

鄂公网安备 42011102000739号