[Nodejs入门]第四篇,用nodejs实现一个爬虫的功能(二)

来源:互联网 发布:足彩平局分析软件 编辑:程序博客网 时间:2024/06/11 19:34

前两天写了一篇从网上拉取网页源代码的文章,勾起了刚入行时的一些回忆。那时候,用新云啊、织梦啊这类cms建了很多垃圾站,每天的工作就是到处的采集别人的内容充实自己的小站,无聊却充实~

既然谈到了内容采集,那就着这个方向看看用nodejs怎么实现此类功能吧

通常采集系统会分为三个阶段,一、从网络上拉取内容;二、分析源代码,分离出有用的信息;三、将分析出的内容存入数据库或者嵌入自己的模版生成静态文件。

分离信息需要使用正则,这块内容网上教程和说明很多,再写一遍意义不大,后面做完整采集实例的时候,会涉及一些,这里就不多说了。现在,我们就谈谈如何将拉取的内容生成静态html文件

忘了带资料在身边,凭感觉写的,表达可能不太精确,有疏漏欢迎指正~~

个人理解的fs模块就是三个部分,读文件、写文件和操作目录,在本篇中主要涉及的是写文件的部分,不过读写文件的方法类似,看懂了写,读自然而言也就通了

fs的读和写都包括简单读写writeFile(readFile)、同步读写writeSync(writeSync)和异步write(read)读写三个方法,而写还会多一个通过流写入文件的方法。

简单读写,方法名的格式就是write或read后面跟一个File,使用上跟其他nodejs方法一样,方法名(参数…回调函数),很方便和顺手,没有特别的需求直接使用这个方法就好了,下面是语法:
fs.readFile(dir, options, function(err, data){})
fs.writeFile(dir, data, options, function(err){})
参数说明:dir - 文件路径(相对或绝对都可以)+完整文件名, data - 要写入文件的内容,options - 参数,主要是指定编码格式和打开方式(r),如果只需要制定一个参数,那只需传入一个字符串即可,说起来比较抽象,来个例子:

fs.readFile('file.txt','utf8',function(err, data){
console.log(data)
})

就是这样,非常简单,要指定多个参数,那像下面这样写就好了:

fs.writeFile('file.txt', '要写入的内容', {encoding: 'utf8', flag: 'w'}, function(err){})

其中flag指定文件的打开方式,常用的有三种, r读,w写,a追加,其他的看看官方文档就好了

好了,还记得上一篇的内容吗?

var request = require('request')
var fs = require('fs')
// 获取一篇博客的内容
request('http://blog.csdn.net/qq_29380855/article/details/50094433', function(err, response, body){
if(err) return console.log(err)
fs.writeFile('blog.html', body, function(err){
if(err) return console.log(err)
console.log('成功')
})
})

运行,打开当前文件所在目录,blog.html已经静静的躺在那里了

同步和异步读写一起说吧,有个比较容易记忆。同步异步都需要先打开文件,操作完成要关闭文件;同步方法没有回调函数,异步方法有回调函数;了解了这些,看下面的代码就很简单了


fs.openSync('blog.html', 'w', function(err, fd){
if(err) return console.log(err)
fs.writeSync(fd, body, null, null, null)
fs.close(fd)
})

使用同步方法,打开文件也要用openSync,之前因为没注意这点出过问题,但上面的代码使用open也能运行,但保险起见,还是建议大家如果用同步方法,还是用openSync吧

fs.open('blog.html', 'w', function(err, fd){
if(err) console.log(err)
fs.write(fd, body, null, null, function(err){
if(err) return console.log(err)
console.log('成功')
fs.close(fd)
})
})

这里要注意,你可以选择把文件存到不同的目录,比如说

fs.writeFile('../blog.html', body, function(err){...})

就是把文件保存到当前目录的上级目录,这当然没什么问题,但是,一旦你指定了一个不存在的目录,nodejs会挂掉,所以,在必须指定目录的情况下,首先要验证这个目录是否存在,这里用到的是fs.exists(路径, function(exists){}),这是fs操作目录的部分,不多做介绍,方法名与linux中目录操作的命令差不多,要了解更多还是看官方文档吧。言归正传,上面说了,如果指定的目录不存在,nodejs会挂,按照我在c#中的一贯写法

if(!文件夹存在){
创建文件夹
}
在这个文件夹里创建文件

行得通吗?你肯定能猜到这样是行不通的,nodejs会报错,虽然提醒的错误跟路径没啥关系,但确实是因为创建文件的时候,文件夹还不存在造成的,不相信的话,你手动创建目录再运行,就不会有任何错误了。

测试了几次,都没能解决这个问题,要么在创建文件之前,先执行一遍创建目录的操作,不要直接执行写操作,而是在目录创建成功后直接返回一个状态,提醒客户端再请求一次。或者执行fs.mkdir之后用timeout延时执行下面的操作?

0 0
原创粉丝点击