记一次使用node写爬虫的经历

知道node也很久了,一直没有好好玩过什么东西。对node的了解也不多,一般也就起个服务器啊,使用npm引个包啊之类的。

也不止一次的想要彻底学习一下node,但是由于公司的项目中用不到,导致学了之后也很快就忘了,这也是现在一直拖着的重大原因。

最近有些空闲就想着能用node做点好玩的事情,既能学一下node也不容易忘。想来想去好像写个爬虫比较靠谱。好了废话不多说,直接干吧。

这次主要做的是爬豆瓣的书籍和评分,生成一个txt文件(其实非常简单)

本次实现主要使用了node的几个重要的包:

var request  = require('request') //请求
var cheerio = require('cheerio') //把request请求到的数据解析可以使用类似jquery的方法获取
var fs = require('fs')  //生成文件
var async  = require('async') //实现异步操作的循环

这几个包也是基本上所有的爬虫代码都需要用到的。

接下来就直接上代码吧

function reqDouban(){
	var count = 0;
	var str = ''
	var nextUrl = '/tag/小说'
	var urlArr = nextUrl.split('/')
	var name = urlArr[urlArr.length - 1]
	//使用async的whilst实现异步操作的循环
	async.whilst(
		function() { return count < 10; }, //循环条件判断
		function(callback) {//循环体
	        count++;
	        var url = 'https://book.douban.com/'+encodeURI(nextUrl);
	        console.log(url)
	        request({
	        	url: url,
    			headers:{
        			'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
        			'Referer': 'https://book.douban.com/'
    			}
    		},function(err, res, body){
		        $ = cheerio.load(body,{decodeEntities: false})
		        nextUrl = $('.paginator .next a').attr('href')
		        $('.subject-item').each(function(index,item){
		        	var $_info = $(this).find('.info')
		        	var name =  $_info.find('h2 a').attr('title') 
		        	var star = $_info.find('.star .rating_nums').text()
		        	var des = $_info.find('.pub').text().trim()
		        	str += '书名: ' + name + ', 评分: ' + star + ', 基本信息: '+ des +'\r\n' 	
		        })
		        //防止请求太频繁
		        /*setTimeout(function() {  
		              callback();  
		        }, 1000);*/
		        callback()
	    	})
		},
		function (err, n) {//循环结束
        	fs.writeFile(name+'.txt',str,'utf8')
    	})
	
}

其实是个很容易看懂的代码。我也不再多做说明。

需要注意几点:

1:有些网站会有防盗链的措施:所以需要在request的headers中添加referer字段,值就是你爬的网站的网址。

2:当request的url请求中有中文时需要使用 encodeURI(url)进行转码

3:对异步操作使用循环时需要用async模块,功能类似es7的async await但又是不一样的东西。或者可以使用直接babel从而直接使用es7的async或者promise。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ld767416042/article/details/80352393
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

记一次使用node写爬虫的经历

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭