zoukankan      html  css  js  c++  java
  • nodejs的简单爬虫

    闲聊

          好久没写博客了,前几天小颖在朋友的博客里看到了用nodejs的简单爬虫。所以小颖就自己试着做了个爬博客园数据的demo。嘻嘻......
         小颖最近养了条泰日天,自从养了我家仔仔后,我觉得我走上一条不归路,每天不到七点半就起床烧热水,然后给我家仔仔烫狗粮,给仔仔烫好狗粮后,我开始收拾自己,出门前给他再把热水瓶里的热水换了,每天跟伺候小孩一样伺候着我家小不点仔仔,然而在上周天他还是生病了,拉稀.......带宠物医院好不容易看好,医生说是低血糖,我就懵逼了,低血糖就不能让他饿着,可是他压根就不好好吃饭,我有什么办法,哎......操碎了心,祈祷吧希望我家小仔仔能健健康康快快乐乐的长大嘻嘻。

    看代码啦:

    1.首先先安装node。

    2.新建package.json:

    在自己创建的一个工程目录下打开cmd ,在里面输入命令npm init

    3.新建data和img文件夹

    4.新建app.js

    "use strict";
    
    // 引入模块
    var http = require('http');
    var fs = require('fs');
    var path = require('path');
    var cheerio = require('cheerio');
    
    // 爬虫的UR L信息
    var opt = {
      hostname: 'www.cnblogs.com',
      path: '',
      port: 80
    };
    
    // 创建http get请求
    http.get(opt, function(res) {
      var html = ''; // 保存抓取到的HTML源码
      var blogs = []; // 保存解析HTML后的数据,即我们需要的电影信息
    
      // 前面说过
      // res 是 Class: http.IncomingMessage 的一个实例
      // 而 http.IncomingMessage 实现了 stream.Readable 接口
      // 所以 http.IncomingMessage 也有 stream.Readable 的事件和方法
      // 比如 Event: 'data', Event: 'end', readable.setEncoding() 等
    
      // 设置编码
      res.setEncoding('utf-8');
    
      // 抓取页面内容
      res.on('data', function(chunk) {
        html += chunk;
      });
    
      res.on('end', function() {
        // 使用 cheerio 加载抓取到的HTML代码
        // 然后就可以使用 jQuery 的方法了
        // 比如获取某个class:$('.className')
        // 这样就能获取所有这个class包含的内容
        var $ = cheerio.load(html);
    
        // 解析页面
        // 每篇文章都在 item class 中
        $('#post_list .post_item .post_item_body').each(function() {
          // 获取图片链接
          var blog = {
            title: $('.post_item_body .titlelnk', this).text(), // 获取文章标题
            titleUrl: $('.post_item_body a', this).attr('href'), //文章链接地址
            peopleUrl: $('.post_item_summary a', this).attr('href'), // 博客地址
            peopleImg: $('.post_item_summary img', this).attr('src'),// 园友头像
            intro: $('.post_item_summary', this).text(), // 获取文章简介
            name: $('.post_item_foot .lightblue', this).text() // 获取文章简介
          };
    
          // 把所有文章放在一个数组里面
          blogs.push(blog);
          if (blog.peopleImg) {// 如果有图片则下载图片
            downloadImg('img/', 'http:' + blog.peopleImg);
          }
        });
    
        // 保存抓取到的文章数据
        saveData('data/data.json', blogs);
      });
    }).on('error', function(err) {
      console.log(err);
    });
    
    
    /**
     * 保存数据到本地
     *
     * @param {string} path 保存数据的文件
     * @param {array} blogs 文章信息数组
     */
    function saveData(path, blogs) {
      // 调用 fs.writeFile 方法保存数据到本地
      fs.writeFile(path, JSON.stringify(blogs, null, 4), function(err) {
        if (err) {
          return console.log(err);
        }
        console.log('Data saved');
      });
    }
    
    /**
     * 下载图片
     *
     * @param {string} imgDir 存放图片的文件夹
     * @param {string} url 图片的URL地址
     */
    function downloadImg(imgDir, url) {
      http.get(url, function(res) {
        var data = '';
    
        res.setEncoding('binary');
    
        res.on('data', function(chunk) {
          data += chunk;
        });
    
        res.on('end', function() {
          // 调用 fs.writeFile 方法保存图片到本地
          fs.writeFile(imgDir + path.basename(url), data, 'binary',
            function(err) {
              if (err) {
                return console.log(err);
              }
              console.log('Image downloaded: ', path.basename(url));
            });
        });
      }).on('error', function(err) {
        console.log(err);
      });
    }

    5.打开cmd执行 node app.js

    然后看data文件夹下会生成data.json文件,img文件夹下会生成许多图片。

    补充

    // 爬虫的UR L信息
    var opt = {
      hostname: 'www.cnblogs.com',
      path: '',
      port: 80
    };
  • 相关阅读:
    《MySQL必知必会》第六章:过滤数据
    《MySQL必知必会》第七章:数据过滤
    《MySQL必知必会》第五章:排序检索数据
    Java高级特性:clone()方法
    Java基础知识详解:abstract修饰符
    Java虚拟机:虚拟机内存区域和内存溢出异常
    Java虚拟机:源码到机器码
    Java虚拟机:本地方法栈与Native方法
    [LeetCode] 1481. Least Number of Unique Integers after K Removals
    [LeetCode] 331. Verify Preorder Serialization of a Binary Tree
  • 原文地址:https://www.cnblogs.com/yingzi1028/p/6554076.html
Copyright © 2011-2022 走看看