当前位置: 首页 > 后端技术 > Node.js

Node命令行工具开发【看笑话小工具】

时间:2023-04-03 11:47:40 Node.js

Node命令行工具开发【看笑话】你有没有过上班想看笑话又怕被领导发现的经历?现在我们用几十行代码写了一个命令行看笑话的小程序,不用担心领导的检查。这篇和上一篇几乎都是命令行小工具的开发,不过这篇更偏向于小爬虫的开发概览:命令行看笑话小程序先来看看我们今天的小目标:首先创建aFate:joke-cli爬取尴尬事百科全书的笑话输出到命令行。用法与jQuery相同。有了它,我们就可以在写小爬虫的时候抛开那些可爱又可恨的正则表达式了。拥抱幸福生活,从现在开始。用法如下:letcheerio=require('cheerio')//将html文本转换成jQuery可以操作的dom,然后就可以把它当作jQuery了let$=cheerio.load('Helloworld')$('h2.title').text('你好!')$('h2').addClass('welcome')$.html()//=>Hellothere!更多信息请参考cheeriosuperagentsuperagent专注于处理server/clientHTTP请求,用法如下:request.get(url).end(function(err,res){});这就是简短的回答,你已经学会了如何使用它,不要混淆,这三行代码对我们的例子来说已经足够了。嗯,当然,更多内容请移步superagent官方文档[[翻译]SuperAgent中文使用文档](https://cnodejs.org/topic/537...我们只是初出茅庐[先百度实践]今天的两位主角我们已经介绍过了,先来练习一下,我们用百度constsuperAgent=require('superagent')constcheerio=require('cheerio')constURL='http://www.baidu.com/'//发起GET请求superAgent.get(URL).end((err,res)=>{if(err)console.error(err)//使用cheerio处理返回的htmlconst$=cheerio.load(res.text)//查找并打印出按钮的值#suconsole.log($('#su').val())//Googleit})ok,现在我理解并可以使用这两个模块了,more探索是我们自己的事,我们应该花时间阅读它的文档,深入了解它。接下来就是利用我们刚刚学到的知识来提高你的姿态。开始开发joke-cli初始化项目$mkdirjoke-cli$cdjoke-cli$npminit$npminstallcheeriosuperagentcolors--save//colors输出美化新建一个bin/index.js文件,添加到package.json文件中"bin":{"joke-cli“:”。/bin/index.js"}现在执行npm链接,我们的小项目就初始化成功了,我们可以认真思考一下代码了,首先分析一下囧百科的url,打开囧百科的时候,我们会发现它的url还是很简单的,因为我们只是爬取笑话,所以url如下http://www.qiushibaike.com/text/page/2/4965899,2是页数。开始写index.js#!/usr/bin/envnodeconstsuperAgent=require('superagent')constcheerio=require('cheerio')leturl='http://www.qiushibaike.com/text/page/'letpage=1superAgent.get(url+page).end((err,res)=>{if(err)console.error(err)console.log(res.text)})f12查看尴尬百科的HTML结构,可以先在一个div.article中发送每个笑话,笑话的内容在div.content中。分析完html,现在可以使用了。我们可以很容易地用cheerio....end((err,res)=>{if(err)console.error(err)const$=cheerio.load(res.text)constjokeList=$('.article.contentspan')jokeList.each(function(i,item){console.log($(this).text())//会打印出每个笑话})})···实现命令行交互这里我们需要用到readlinem模块readline(逐行读取)require('readline')模块提供了一个接口,用于从可读流(如process.stdin)中读取数据,一次读取一行。基本用法如下:使用readline.Interface类实现一个简单的命令行界面:constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout,prompt:'Pleaseenter>'});//rl.prompt()方法会在输出流中写入一个新行到由readline.Interface实例配置的提示,为用户提供新的输入位置rl.prompt();rl.on('line',(line)=>{switch(line.trim()){case'hello':console.log('world!');break;default:console.log(`Youtyped:'${line.trim()}'`);break;}rl.prompt();}).on('close',()=>{console.log('再见!');process.exit(0);});详见Node.js中文网重写index.js实现命令行交互功能#!/usr/bin/envnodeconstsuperAgent=require('superagent')constcheerio=require('cheerio')constreadline=require('readline')constcolors=require('colors')//创建readlinde.Interface实现命令行交互constrl=readline.createInterface({input:process.stdin,output:process.stdout,prompt:'?你使用的是joke-cli,回车查看笑话?>>>'})leturl='http://www.qiushibaike.com/text/page/'letpage=1//使用数组存储笑话letjokeStories=[]//加载笑话并将其存储在数组中functionloadJokes(){//当数组中的笑话少于三个时,请求下一页if(jokeStories.length<3){superAgent.get(url+page).end((err,res)=>{if(err)console.error(err)const$=cheerio.load(res.text)constjokeList=$('.article.contentspan')jokeList.each(function(i,item){jokeStories.push($(this).text())//存储在数组中})page++})}}rl.prompt()loadJokes()//当输入流接收到行终止符(\n、\r或\r\n)时触发行事件'line'事件通常在用户按下键或键。//按回车显示一个笑话rl.on('line',(line)=>{if(jokeStories.length>0){console.log('======================')console.log(jokeStories.shift().bgCyan.black)//使用colors模块改变输出颜色loadJokes()}else{console.log('Loading~~~'.green)}rl.prompt()}).on('close',()=>{console.log('Bye!')process.exit(0)})这里我们使用数组来存储笑话,每按一次回车,就会显示一个项目(shift()删除并返回数组的第一个元素),当数组中的项目少于三个时,将请求新的页面。至此,我们的joke-cli就开发完成了。至此我们应该明白superagent、cheerio、readline等模块的使用了。趁热打铁,下面就让我们好好看看这些模块吧。有技术干货和废话,关注回复【888】领取福利,左手代码,右手搬砖,抛砖引玉