准备用cheerio去抓一些网页看看。

可以参考的材料有:

http://www.cnblogs.com/CraryPrimitiveMan/p/3674421.html

http://cnodejs.org/topic/5203a71844e76d216a727d2e

首先打开WebStorm,新建一个空项目,名为HelloWorld,然后在主目录新建一个HelloWorld.js,内容

console.log("Hello World");

然后直接Run,命令行会自动调用node命令来运行:

/usr/local/bin/node /Users/baidu/Documents/Data/Work/Code/Self/nodejs/helloworld/HelloWorld.js
Hello World! Process finished with exit code 0

主要是看这个url上面的例子:

http://www.cnblogs.com/CraryPrimitiveMan/p/3674421.html

先安装一下cheerio

npm install cheerio

先写了个curl.js,代码如下:

/**
* Created by baidu on 16/10/17.
*/
var http = require("http"); function download(url, callback) {
var data = '';
http.get(url, function(res) {
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function () {
callback(data);
});
}).on('error', function () {
callback('error');
})
} exports.download = download;

然后主程序HelloWorld.js中引用该函数:

/**
* Created by baidu on 16/10/17.
*/ console.log("Hello World"); var cheerio = require('cheerio');
var curl = require('./curl');
var iconv = require('iconv-lite'); var url = 'http://open.163.com/special/opencourse/englishs1.html'; curl.download(url, function (data) {
if (data) {
var $ = cheerio.load(data);
$('a.downbtn').each(function (i, e) {
var str = $(e).attr('data-name');
console.log(str);
});
console.log('done');
}
else {
console.log('error');
}
});

但是结果都是乱码。。

上网查发现需要使用 iconv-lite 包,在引入这个包之后:

var str = $(e).attr('data-name');
str = iconv.decode(str, 'gbk');

发现报错,并且提示查阅:

https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding

原来是在 data += chunk的时候,已经发生的默认针对utf-8的转码,使得文字的码发生了混乱。

按照上文中给出的例子,使用chunks数组存数组,然后使用Buffer.concat合并数组的内容。修改了以上两个文件的代码,curl.js:

/**
* Created by baidu on 16/10/17.
*/
var http = require("http"); function download(url, callback) {
var chunks = [];
http.get(url, function(res) {
res.on('data', function(chunk) {
chunks.push(chunk);
});
res.on('end', function () {
callback(chunks);
});
}).on('error', function () {
callback(chunks);
})
} exports.download = download;

HelloWorld.js:

/**
* Created by baidu on 16/10/17.
*/ console.log("Hello World"); var cheerio = require('cheerio');
var curl = require('./curl');
var iconv = require('iconv-lite'); var url = 'http://open.163.com/special/opencourse/englishs1.html'; curl.download(url, function (chunks) {
if (chunks) {
var data = iconv.decode(Buffer.concat(chunks), 'gbk');
var $ = cheerio.load(data);
$('a.downbtn').each(function (i, e) {
var str = $(e).attr('data-name');
console.log(str);
});
console.log('done');
}
else {
console.log('error');
}
});

然后运行,得到如下结果:

/usr/local/bin/node /Users/baidu/Documents/Data/Work/Code/Self/nodejs/helloworld/HelloWorld.js
Hello World
新西兰国立南方理工学院公开课:英语强化课程I > be动词、冠词、指示代词、情态动词、一般现在时
新西兰国立南方理工学院公开课:英语强化课程I > 可数名词、不可数名词、不定代词、形容词比较级、最高级、一般过去时、现在进行时
新西兰国立南方理工学院公开课:英语强化课程I > 形态动词、疑问词、常用的时间短语
新西兰国立南方理工学院公开课:英语强化课程I > 如何询问价格和质量、疑问句词序、人称代词如何配搭动词、不同时态中的时间短语
新西兰国立南方理工学院公开课:英语强化课程I > 过去式中动词的用法、如何使用定冠词
新西兰国立南方理工学院公开课:英语强化课程I > 动名词、一般现在时与一般过去时中的被动语态、过去完成时、虚拟条件句
新西兰国立南方理工学院公开课:英语强化课程I > 四种形态的助动词、一般现在时、现在进行时、规则动词与不规则动词、现在完成时、现在完成进行时
新西兰国立南方理工学院公开课:英语强化课程I > 将来时、将来时从句、特殊形容词、主动句与被动句、礼貌请求用语
新西兰国立南方理工学院公开课:英语强化课程I > 预测、过去完成时、间接引语、义务和许可、虚拟语气
新西兰国立南方理工学院公开课:英语强化课程I > 各种动词形式、助动词、名词后缀、形容词后缀、单词前缀、陈述句、现在进行时
新西兰国立南方理工学院公开课:英语强化课程I > be动词、冠词、指示代词、情态动词、一般现在时
新西兰国立南方理工学院公开课:英语强化课程I > 可数名词、不可数名词、不定代词、形容词比较级、最高级、一般过去时、现在进行时
新西兰国立南方理工学院公开课:英语强化课程I > 形态动词、疑问词、常用的时间短语
新西兰国立南方理工学院公开课:英语强化课程I > 如何询问价格和质量、疑问句词序、人称代词如何配搭动词、不同时态中的时间短语
新西兰国立南方理工学院公开课:英语强化课程I > 过去式中动词的用法、如何使用定冠词
新西兰国立南方理工学院公开课:英语强化课程I > 动名词、一般现在时与一般过去时中的被动语态、过去完成时、虚拟条件句
新西兰国立南方理工学院公开课:英语强化课程I > 四种形态的助动词、一般现在时、现在进行时、规则动词与不规则动词、现在完成时、现在完成进行时
新西兰国立南方理工学院公开课:英语强化课程I > 将来时、将来时从句、特殊形容词、主动句与被动句、礼貌请求用语
新西兰国立南方理工学院公开课:英语强化课程I > 预测、过去完成时、间接引语、义务和许可、虚拟语气
新西兰国立南方理工学院公开课:英语强化课程I > 各种动词形式、助动词、名词后缀、形容词后缀、单词前缀、陈述句、现在进行时
新西兰国立南方理工学院公开课:英语强化课程I > 复习四种时态、一般现在时、完成时、冠词、关系代词、量词、动名词、不定式、连词
新西兰国立南方理工学院公开课:英语强化课程I > 情态动词及其过去式、将来时、将来进行时、将来完成时、虚拟语气及其过去式、间接引语
done Process finished with exit code 0

Node & Cheerio & WebStorm 学习实验的更多相关文章

  1. node.js + webstorm :配置开发环境

    一.配置开发环境: 1.先安装node (1).访问http://nodejs.org打开安装包,正常安装,点击next即可. 为了测试是否安装成功,打开命令提示符,输入node,则进入node.js ...

  2. 【干货分享】Node.js 中文学习资料和教程导航

    这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...

  3. OpenState之 Mac学习 实验

    OpenState之 Mac学习 实验 目录 OpenState安装 Port Knocking 实验 Mac Learning 实验 环境要求: 系统ubuntu 14.04 mininet:2.3 ...

  4. 常用增强学习实验环境 II (ViZDoom, Roboschool, TensorFlow Agents, ELF, Coach等) (转载)

    原文链接:http://blog.csdn.net/jinzhuojun/article/details/78508203 前段时间Nature上发表的升级版Alpha Go - AlphaGo Ze ...

  5. Node.js 中文学习资料和教程导航

    这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...

  6. Node.js知识点学习

    Node.js知识点学习 一.基本概念 Node.js,或者 Node,是一个可以让 JavaScript 运行在服务器端的平台.可以说,Node.js开创了javascript模块化开发的先河,早期 ...

  7. node的重点学习笔记(1)————node

    node的重点学习笔记(1)----node 提到node就必须提一下他的npm了,npm是世界上最大的开放源代码的生态系统.通俗来说这就如同亚马逊丛林,要啥物种有啥物种,一个巨大的生态圈,里面有一堆 ...

  8. ELK学习实验014:Nginx日志JSON格式收集

    1 Kibana的显示配置 https://demo.elastic.co/app/kibana#/dashboard/welcome_dashboard 环境先处理干净 安装nginx和httpd- ...

  9. Node.js的学习--使用cheerio抓取网页数据

    打算要写一个公开课网站,缺少数据,就决定去网易公开课去抓取一些数据. 前一阵子看过一段时间的Node.js,而且Node.js也比较适合做这个事情,就打算用Node.js去抓取数据. 关键是抓取到网页 ...

随机推荐

  1. HDU 3045 picnic cows(斜率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3045 题目大意:有n个数,可以把n个数分成若干组,每组不得小于m个数,每组的价值=除了该组最小值以外每 ...

  2. opencv 图像转换

    #include <cv.h> #include <highgui.h> int main() { CvPoint2D32f srcTri[], dstTri[]; CvMat ...

  3. Guava Cache 使用笔记

    https://www.cnblogs.com/parryyang/p/5777019.html https://www.cnblogs.com/shoren/p/guava_cache.html J ...

  4. .net 多播委托的使用方法以及场景,更简单的观察者模式

    首先来说一下什么是多播委托 多播委托就是在委托里定义一个或者多个方法的一个集合 使用方法: public Action actList; //添加方法 public void AddActionMet ...

  5. windows10 易升 下载失败 解决方法

    在你剩余最大空间的硬盘里有一个名字大概是Windows10Updata的文件夹里找到一个名字14339开头的升级镜像,把这个文件的名字用记事本保存下来方便以后使用,同时在这个文件夹里还有一个叫prod ...

  6. CentOS6.5修改/etc/pam.d/sshd后root无法ssh登陆

    现象:由于公司需要服务器的登陆操作进行安全加固,同事为了省事,直接把CentOS7上的/etc/pam.d/sshd替换掉CentOS6.5上的/etc/pam.d/sshd,导致root用户ssh登 ...

  7. 7.spark Streaming 技术内幕 : 从DSteam到RDD全过程解析

    原创文章,转载请注明:转载自 听风居士博客(http://www.cnblogs.com/zhouyf/)   上篇博客讨论了Spark Streaming 程序动态生成Job的过程,并留下一个疑问: ...

  8. java线程基本知识

    如何去定义一个线程?(三种方式)    1.Thread:继承这个类,然后重写run方法:将业务逻辑或任务写到run方法中,然后调用start来启动线程:    2.Runnable: 实现这个接口, ...

  9. YII2 源码阅读 综述

    如何阅读源码呢? 我的方法是,打开xdebug的auto_trace [XDebug] ;xdebug.profiler_append = 0 ;xdebug.profiler_enable = 1 ...

  10. fetch初步了解

    前言 对于ajax请求,我们不仅可以使用XMLHTTPrequest,还可以使用fetch 正文 promise 在使用ajax时,如果想要使得第二个ajax请求调用第一个ajax请求,就得使用在on ...