码农日记

薄洪涛的个人博客

node学习及小爬虫的实现

菜鸟一只,抽空了解了下node,然后总结下学到的重点;

首先是安装nodejs,需要安装的版本最好是v6.0以上,不然有些特性不兼容

nmp是和nodeJS一起安装的一个管理包工具,类似于python的pip,php的composer
nodejs可以用来创建服务,可以看做是运行在服务器端的js,IO效率非常高,这个是node的优点
node的回调
node.js的异步编程是通过回调实现的,但是回调后程序不一定是异步化

回调函数在完成任务后被调用,node使用了大量的回调函数,且所有的API都支持回调函数

新手一定要慎重,不要掉入回调地狱

node的事件驱动

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

clipboard.png

简单说,就是把事件摞成队列,不耽误用户的请求(这也被称之为非阻塞式IO或者事件驱动IO),这就是node  IO效率高的原因
node缓冲区
缓冲区个人感觉是为流服务的,主要是用来保存一些二进制数据,比如读取了文件的一部分,可以保存在缓冲区中,因为js本身只有字符串类型,没有二进制类型
缓冲区的合并,读取,json化等操作
node流
读流:
就是从流中读取数据
写流:
把数据已流的方式写入文件

管道流:

画了一张无比形象的图,读取一个文件内容并将内容写入到另外一个文件中

2.png

链式流:
链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。
这部分可以看代码理解
模块
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。

模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。通过exports和requirel两个对象来获取外部的模块及模块的接口,主要掌握模块的创建和加载模块已有模块

GET/POST请求

这一块其实我是不想看的,python和php中的两种请求看起来都差不多,无非是方式的不同,node也一样吧;如果仅仅是想了解而不是使用这门语言的话,看看基础的就好了(其实就是懒)


接下来用node写了个小爬虫,感觉还没python好用,再一次体会到了不同的活要用不同的工具,没有好语言,只有最适合的语言;

不要问我为什么又爬安居客(其实还是懒,之前用python爬过,,这次写是为了学习node而不是爬虫,so , 不要在乎爬什么)

/**
 * Created by john on 2018/10/17.
 * 尝试自己写个基于nodejs的爬虫
 */
//引入需要的包
var request = require('request');
var cheerio = require('cheerio');
var mysql   = require('mysql');
var connection = mysql.createConnection({
    host     : '127.0.0.1',
    user     : 'root',
    password : '',
    database : 'spider'
});
var url = "https://jn.zu.anjuke.com/fangyuan/p2/"
/*
 * 请求数据
 */
function dataRequest(dataurl) {
    request({
        url:dataurl,
        method:'GET',
    },function (err,red,body) {
        //请求到body
        if(err){
            console.log(dataurl);
            console.error('[ERROR]Collection' + err);
            return;
        }
        if(dataurl && dataurl == url){
            dataPraseDolphin(body);
        }
    })
}

/*
 * 保存到mysql
 */
function save(title,info,add) {
    var  addSql = 'INSERT INTO node_room(id,title,info,address) VALUES(0,?,?,?)';
    var  addSqlParams = [title,info, add];
    connection.query(addSql,addSqlParams,function (err, result) {
        if(err){
            console.log(err.sql)
            console.log('[INSERT ERROR] - ',err.message);
            return;
        }
        console.log('--------------------------INSERT----------------------------');
        console.log('保存数据',addSqlParams);
        console.log('-----------------------------------------------------------------\n\n');
    });
}

/*
 * 解析HTML
 */
function dataPraseDolphin(html) {
    var $ = cheerio.load(html);
    var rooms = $('.list-content').children('.zu-itemmod');
    for(i=0;i<rooms.length;++i){
        var room = rooms[i];
        var title = $(room).find('.zu-info').find('h3').text().replace(/(^\s*)|(\s*$)/g, "");
        var info = $(room).find('.zu-info').find('.tag').text().replace(/(^\s*)|(\s*$)/g, "");
        var add = $(room).find('.zu-info').find('address').text().replace(/(^\s*)|(\s*$)/g, "").replace('\n','').replace(' ','').replace(/\s/g, "");
        save(title,info,add);
    }
}
//发起请求
dataRequest(url);

代码地址:https://github.com/BoHongtao/base-nodejs-code/blob/master/spider-test.js


总结下,如果学过web后端语言,比如java,php,python的话,node学学挺好,毕竟目前node还是很强大的,但是仍然不建议新手入门学习,毕竟回调很恶心;

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权所有 | 转载请标明出处