再走node路:(篇六) 使用cheerio模块实现node爬虫

17 篇文章 4 订阅

珊珊来迟,今日分node继续: 之前几天我们介绍使用node搭建服务器的一些小插曲,其实现在我觉得今天突然插入node爬虫不是很合适,我们应该先将node搭建服务器说完在继续这些,但考虑昨天的预告中我们说到了今天讲一下node爬虫,所以这里我们就当做一个小插曲吧,之后我们还是继续说一些node搭建服务器的东西,关于node使用redlock插件实现基于redis的node分布式锁就先往后延一延啦


  • 首先我们还是使用npm将cheerio模块安装到我们的项目中,( npm i cheerio --save) 同时我们这里也可以安装一个request模块进行http请求获取网页代码(关于request模块我们也可以使用http 和https模块代替,实际根据发送的是http请求还是https请求来定)
  • 安装好cheerio模块后,我们简单提一下怎么使用它就可以直接进入我们的爬虫了: 使用cheerio的作用是将一段html格式的, 甚至是xml格式的字符串封装成一个类似于jquery的对象,之后就可以使用类似于jquery的一些api完成文档节点的操作了, 如下所示:
// 引入cheerio模块:
const cheerio = require('cheerio')
const request = require('request')

// 定义一段html格式的字符串: 
const html = `<div class="container">
			<h1>这里是一段文字</h1>
		</div>
	`
// 将这段html字符串传递给cheerio的load()方法解析:
const $ = cheerio.load(html)
// 使用这个$对象进行类似于juqery的文档操作: 以获取h1中的文本信息为例
console.log($(".container h1").text())

  • 好了,其实cheerio模块的使用是很简单的,只要你对于前端的jquery框架是比较熟悉的,使用cheerio模块就会比较容易上手的。
  • 那么我们就进入我们今天 的主题,使用cheerio进行node爬虫, 今天我们将要爬取的是豆瓣电影网的即将上映的电影的信息: (这里说一下选择这个网页的原因:
  1. 豆瓣网的这个网站的页面的框架结构是比较好也比较清晰简单的
  2. 我在进行实验的时候也尝试过爬取都有直播平台王者荣耀主播人气的,但由于使用request请求到的网页信息时乱码,导致我们没办法解析,百度了半天说是可以使用设置encoding属性为null值进行解决,但实际试验是发现并没有效果,考虑良久后就选择了这个豆瓣电影的网页,之后我找到具体的解决方法后再说一下吧,其实掌握了方法才是最为主要的嘛,嘿嘿!!!
    )
    开始
// 引入相应的依赖模块:
const cheerio = require("cheerio")
const request = require("request")
const fs = require("fs")
// fs 模块时node的一个自带的文件处理模块,这里我们主要是准备使用该模块将我们爬虫读取到的数据信息写入到一个文本文件:

// 1: 封装一个promise函数处理request的请求,因为request请求是异步的
const http = (uri) => {
	return new Promise((resolve, reject) => {
		request({
			uri,
			method: "GET",
			encoding: "utf-8",
		}, (err, res, body) => {
			if(err){
				reject(err)
				return
			}
			resolve(body)
		})
	})
}
// 定义一个请求的路径:
const uri = "https://movie.douban.com/cinema/later/yaan/"
const http(uri).then(html => {
	// 通过request请求回来的网页信息我们在body中就可以得到,所以在这里的html便是我们请求回来的网页信息:
	// 使用cheerio解析网页信息:
	const $ = cheerio.load(html)
	// 这里我们为了方便,就直接用三个数组来存储我们需要的信息了,当然实际的应用中可定不能够这样进行的,毕竟如果当其中有一步出现了错误,就会导致信息对应不上,得到的信息有误的问题
	const movieName = []
	const movieTime = []
	const movieArea = []
	//实际考察豆瓣网的这个网页信息,我们可以发现它的电影的实际信息都是在一个带有.intro类的div容器中,所以我们就可以使用jquery获取节点的形式去查询这些节点拿到遍历拿到具体的信息:
	$('.intro').each((index, item) => {
        name.push($(item).find('h3 a').text())
        time.push($(item).find('ul li').eq(0).text())
        address.push($(item).find('ul li').eq(2).text())
    })
    // 如此我们的三个数组中就已经存储了我们需要的信息,且是一一对应的
    // 我们定义一个字符串将三个数组中的所有信息进行整理统一后存储到一个txt文件中:这里我们就出错的情况导致信息不对应的结果了,之后大家在爬取其他的网站的时候一定需要注意好这个问题
    let info = ""
    for(let i = 0; i < name.length; i++){
     info += "名称:\t" + name[i] + "\n上映时间:\t" + time[i] + "\n地区:\t" + address[i] + "\n\n"
 	}
 	// 使用fs模块的writeFile()将我们拼装好的信息写入到movie.txt文件中
     fs.writeFile('./movie.txt', info, (err) => {
        if(err) {
            throw err
        }
    } )
  • 最后我们再强调一下,这里我们只是图个方便,实际的应用中肯定是有一些bug的,实际中我们对于html字符串的解析处理,存储肯定都是需要单独拆分出来细致的进行的,但最重要的一点还是我们在解析前我们需要具体的了解到这个网页的具体的结构,知道我们需要的信息具体怎么去提取等等,所以,我们前期的工作一定需要做足的,不能直接上来就是写代码的,最会附上我爬取的结果,即将上映的电影,有相看电影的可以准备啦, 哈哈!!!

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值