所谓爬虫,能够简单理解为利用程序操做文件,只是这些文件不在本地,须要咱们拉取过来。html
Node 提供了不少接口来获取远程地址代码,就拿 AlloyTeam 的页面举例吧,把他首页几篇文章的信息爬取过来。由于 AlloyTeam 使用的协议是 http:// ,本文就不介绍 Node 中 https:// 的使用了。node
var http = require("http"); var url = "http://www.alloyteam.com/"; var data = ""; // 建立一个请求 var req = http.request(url, function(res){ // 设置显示编码 res.setEncoding("utf8"); // 数据是 chunked 发送,意思就是一段一段发送过来的 // 咱们使用 data 给他们串接起来 res.on('data', function(chunk){ data += chunk; }); // 响应完毕时间出发,输出 data res.on('end', function(){ // dealData(data); console.log(data); }); }); // 发送请求 req.end();
上面短短七八行代码,就拿到了 AlloyTeam 首页的代码,真的十分简单,若是是 https:// 就得引用 https 模块咯,都是差很少的。jquery
先看下咱们要抓取的内容:git
因为没有使用其余库,咱们没办法像操做 DOM 同样获取目标内容,不过写正则也挺简单的,好比咱们要 获取标题/文章连接/摘要 这些内容,正则表达式为:github
// function dealData var reg = /<ul\s+class="articlemenu">\s+<li>\s+<a[^>]*>.*?<\/a>\s+<a href="(.*?)"[^>]*>(.*?)<\/a>[\s\S]*?<div\s+class="text">([\s\S]*?)<\/div>/g; var res = []; while(match = reg.exec(data)) { res.push({ "url": match[1], "title": match[2], "excerpt": match[3] }); }
这里的正则看起来有点晦涩,不过呢,正则在编程中十分基础的东西,若是没有太多的了解,建议先去搞清楚,这里就不细说啦。这里要强调的一点是:正则表达式
reg.exec(data);
若是只写上面这句话,只会拿到第一个匹配结果,因此须要使用 while 循环来处理,没处理一次,正则匹配的位置就会日后推一下。其实上面这条语句执行后返回的是一个对象,其中包含一个 index 属性,具体能够查阅 JavaScript 正则的内容。数据库
这里返回(res)的数据格式是:npm
<编程
pre class="prettyprint linenums">api
[{ "url: url, "title": title, "excerpt" excerpt }];
上面虽然拿到了内容,不过咱们须要的是纯文本,其余标签什么的得过滤掉,excerpt 中包含了一些标签:
var excerpt = excerpt.replace(/(<.*?>)((.*?)(<.*?>))?/g, "$3");
虽然说文章中有不少代码,有些标签是不该该删除的,不过这里是摘要内容,这些内容的标签都删除掉,方便咱们储存。而后把长度处理下:
excerpt = excerpt.slice(0, 120);
我这里是把文件储存到文件之中,存放格式为:
[title](url) > excerpt
哈哈,很熟熟悉吧,markdown 语法,看起来也比较清晰。
var str = ""; for(var i = 0, len = data.length; i < len; i++){ str += "[" + data[i].title + "](" + data[i].url + ")\n" + data[i].excerpt.replace("\n\s*\n?", ">\n") + "\n\n"; }
先拼接数据,而后写入到文件:
fs.writeFile('index.md', str, function (err) { if (err) throw err; console.log('数据已保存~'); });
大功告成,过程实际上是很简单的。拿到的内容:
![图片上传中...]
若是对正则不太熟悉,上面的工做是不太好完成的,不少开发者为 Node 提供了工具库,使用 npm 能够安装,若是不习惯正则,使用一些工具包辅助处理,能够把拿到的数据看成 DOM 来解析。
我了解到的有一个叫作 node-jquery 的库貌似还不错,具体请读者本身去网上搜吧,应该挺多的。
(收藏学习一下)
做者:Barret Lee
出处:http://barretlee.github.io/spider-with-node