前文提到,nodejs可以做很多东西。但是,我一直觉得,nodejs是不合适去写网站的,至少现在不合适。所以,在这里我介绍怎么用nodejs去做一个简单的爬虫。
(想了解nodejs怎么写网站的话,你可以点这里:
https://github.com/nswbmw/N-blog/wiki/_pages)
接下来我要实现的爬虫的功能:访问一个url,然后获取里面需要的信息。
准备条件:安装好nodejs的环境,(建议在linux上学习,因为windows上面,很多第三方库都不支持,常常安装失败。)
预备知识:用nodejs写过helloworld的demo。
(我的笔记本常常出问题,所以现在我的教程只能基于windows的环境 &&nodejs.version = v.0.10.10 , 不过代码在linux下一样照样可以正常运行)
第一步:按照 Infoq上面的田永强叔叔的建议,我习惯采用如下的目录结构,所以,大家新建一个这样的目录结构:
├── Makefile // 构建文件,通常用于启动单元测试运行等操作 ├── app.js // 应用文件 ├── automation // 自动化测试目录 ├── bin // 存放启动应用相关脚本的目录 ├── conf // 配置文件目录 ├── controllers // 控制层目录 ├── helpers // 帮助类库 ├── middlewares // 自定义中间件目录 ├── models // 数据层目录 ├── node_modules // 第三方模块目录 ├── package.json // 项目包描述文件 ├── public // 静态文件目录 │ ├── images // 图片目录 │ ├── libs // 第三方前端JavaScript库目录 │ ├── scripts // 前端JavaScript脚本目录 │ └── styles // 样式表目录 ├── test // 单元测试目录 └── views // 视图层目录
第二步:在你的package.json敲下:
{ "name": "simple_spider", "version": "0.0.1", "scripts": { "start": "node app.js" }, "dependencies": { "jQuery" :"*", "jsdom" : "https://github.com/tmpvar/jsdom/tarball/4cf155a1624b3fb54b2eec536a0c060ec1bab4ab", "xmlhttprequest" : "*", "request" : "*", "htmlparser" : "*" } }
这个配置文件,主要是用来解决nodejs中的包依赖关系,就像linux系统中各种包管理器来安装软件一样。
name = 应用的名字 ; version = 应用的版本 ;
dependencies = 依赖关系主要在这里声明。例如上面的配置文件,就说明了本应用需要:jQuery包(与前端的jquery库不是一个东西,但功能差不多。jsdom , xmlhttprequest,request,htmlparser这四个东西,都是jQuery需要的依赖包)。
这里我需要特别说明一下,在linux下,如果你需要使用jQuery这个nodejs库的话,你是不需要配置jsdom,xmlhttprequest ,,,这四个东西的。但是,我的环境是windows,所以,对nodejs的依赖不是很好。所以,我要手动自行配置好jQuery的关系。所以,你是linux用户的话,可以直接这样配置:
{ "name": "simple_spider", "version": "0.0.1", "scripts": { "start": "node app.js" }, "dependencies": { "jQuery" :"*" } }
第三步:打开命令行,跳转到当前目录,输入:npm install -d
然后五颜六色的东西开始不停地跑。这就说明,我们已经开始下载应用所需要的依赖包了。(依赖关系由上面的dependencies给出。)
这个命令表示只安装应用里缺少的依赖包到本地目录(不会全局污染)。
安装完毕,你的目录下面的node_modules就会多几个文件,如下图所示:
等它安装完毕,就进入第四步。
第四步:在app.js输入如下内容:
var http = require('http'), $ = require('jQuery'); var options = { host: 'www.google.com.hk', port: 80, path: '/', method: 'GET' }; var req = http.get(options, function(res){ var pageData = ''; res.setEncoding('utf8'); res.on('data', function(chunk){ pageData += chunk; }); res.on('end', function(){ var dom = $(pageData); var elList = dom.find('#addlang a'); console.log(elList.eq(1).text()); }); });
上面的代码就实现了非常简单的网络爬虫。
第五步:在终端窗口运行node app.js
你会看到 "English" 的结果输出。
过程:
1:http句柄发出get请求,请求google.hk的网页内容,然后内容存在pageData这个变量里面。
2:我们在用jQuery去分析,获取我们需要的内容,再打印出来。(如果你觉得内容很重要,你也可以入库保存。)
这样,简单的网络爬虫就完成了。