zoukankan      html  css  js  c++  java
  • nodeJs爬取网页数据

    发现node可以爬虫,正好我在找暑期实习,然后就使用node爬一下网站数据找实习。

    准备工作

    • 安装node,npm安装依赖包[cheerio, express, eventproxy]
    • httpexpress模块的使用学习

    爬取目标网站

    //加载http模块
    var http = require('http');
    
    //目标网站,嘿嘿,这个网站有很多实习职位
    var pageUrl = 'http://shixi.info/';
    
    http.get(pageUrl, function(res) {
        var html = '';
        res.on('data', function(data) {
            html += data;
        });
        res.on('end', function() {
            console.log(html);
        });
    });
    

    http的get请求一个目标网站,回调函数的参数是response,绑定两个事件,一个'data'事件,会不断触发获取数据,数据获取完触发’end‘ 事件。

    爬到的的数据就是目标网站的html源代码。

    现在html代码有了,我们该怎么解析这个呢?

    解析html代码

    在这里我们使用cheerio模块,是服务器端的html解析模块,使用方法类型jQuery

    var http = require('http');
    var cheerio = require('cheerio');
    var pageUrl = 'http://shixi.info/';
    
    http.get(pageUrl, function(res) {
        var html = '';
        res.on('data', function(data) {
            html += data;
        });
        res.on('end', function() {
            //数据获取完,执行回调函数
            callback(html);
        });
    });
    
    function callback(html) {
        //使用load方法,参数是刚才获取的html源代码数据
        var $ = cheerio.load(html);
        var arrUrl = [];
        
        //写法和jQuery一模一样,有没有觉得很cool
        $('article').each(function(index, element) {
            var href = $(element).find('.entry-title a').attr('href');
            arrUrl.push(href);
        });
    }
    

    这样我们就把目标页面的每条招聘信息的网址存放进了一个数组,当然我们也可以通过对象字面量存一些其他数据,比如招聘信息的title,date等等。

    可能有人会问,我只要网址干嘛?嘿嘿,因为JD是在详情页里面,不去爬详情页,我咋看JD。

    并发请求

    为演示方便:只获取了职位title。

    对arrUrl迭代,GET请求。因为是异步操作,所以在这里我们建一个count变量,每次完成一个操作count++,执行done函数,如果count值和arrUrl数组的长度相同,执行函数。

    var count = 0;
    var results = [];
    function done() {
        if (count == arrUrl.length) {
            console.log('done');
        }
    }
    arrUrl.forEach(function(item, index) {
        http.get(item, function(res) {
            var html = '';
            res.on('data', function(data) {
                html += data;
            });
    
            res.on('end', function() {
                var $ = cheerio.load(html);
                var title = $('.entry-title').text();
    
                results[index] = {
                    url: item,
                    title: title
                };
                count++;
                done();
            }); 
        });
    });
    

    使用express模块让数据响应到网页

    var express = require('express');
    var app = express();
    
    function done() {
        if (count == arrUrl.length) {
            //get 方法,第一个参数路径,是一个route的作用。
            //回调函数,参数分别是:请求,响应。
            //监听8888端口,浏览器打开 http://127.0.0.1:8888
            app.get('/', function(req, res) {
                res.send(JSON.stringify(results));
            }).listen('8888', '127.0.0.1');
            console.log('done');
        }
    }
    

    浏览器打开 http://127.0.0.1:8888,就能看到我们爬的数据了。

    当然我们也可以 对这些数据处理一下,返回到网页的是html内容文本。

    使用eventproxy模块控制并发

    刚才我们使用的是count变量,有些不够优雅。这里我们引入eventproxy模块。

    var eventproxy = require('eventproxy');
    //得到实例化对象ep
    var ep = new eventproxy();
    
    //after,第一个参数是事件名,第二个参数是事件的数量,回调函数的参数是list集合,
    ep.after('subscribe', arrUrl.length, function(results) {
        app.get('/', function(req, res) {
            res.send(JSON.stringify(results));
        }).listen('8888', '127.0.0.1');
        console.log('done');
    });
    
    arrUrl.forEach(function(item, index) {
        http.get(item, function(res) {
            var html = '';
            res.on('data', function(data) {
                html += data;
            });
    
            res.on('end', function() {
                var $ = cheerio.load(html);
                var title = $('.entry-title').text();
                
                //通知ep的subscribe事件,ep监测执行完的事件数量等于arrUrl.length,如果等于 执行回到函数。
                ep.emit('subscribe', {
                    url: item,
                    title: title
                });
    
            }); 
      });
    

    结束

    通过nodejs爬虫的学习,学习到了http,express,cheerio,eventproxy的简单使用。更了解到了node异步编程。

    《使用 eventproxy 控制并发》

    Http模块

  • 相关阅读:
    tomcat 闪退处理
    MVC的各个部分都有那些技术来实现?如何实现?
    jsp和servlet的区别、共同点、各自应用的范围?
    如何从CDN加载jQuery?
    window.onload()函数和jQuery中的document.ready()有什么区别?
    JQuery有几种选择器?
    jQuery 库中的 $() 是什么?
    JS 中 == 和 === 区别是什么?
    如何在JavaScript中每x秒调用一个函数
    undefined,null 和 undeclared 有什么区别?
  • 原文地址:https://www.cnblogs.com/Aralic/p/4591036.html
Copyright © 2011-2022 走看看