资讯专栏INFORMATION COLUMN

Node命令行工具开发【看段子小工具】

kelvinlee / 2422人阅读

摘要:我们的小项目就初始化成功了,就可以认真思考代码了首先分析糗事百科我们打开糗事百科会发现它的还是很简单,由于我们只是爬取段子所以如下,就是页数。

Node命令行工具开发【看段子】
你有没有上班想看笑话却又怕领导发现的经历?现在我们就用几十行代码写一个命令行看笑话段子的小程序,从此无需担心领导的视察。这篇文章和上一篇差不多都是命令行小工具开发,不过本篇更偏向于小爬虫的开发
总览:命令行看段子小程序

我们先来看看我们今天的小目标:

先为它起个命吧:joke-cli

爬取并提取 糗事百科的笑话

输出到命令行按下回车显示一条段子

初识[新手村]

下面我们将介绍今天用到的主要模块

cheerio
cheerio可理解为服务器端的jQuery,基本用法与jQuery一样。有了它,我们在写小爬虫时就可抛开那可爱又可恨的正则表达式了。从此拥抱幸福生活。

用法如下:

let cheerio = require("cheerio")

// 将html文本转化成可用jQuery操作的dom,,然后你就可以把它当成jQuery了
let $ = cheerio.load("

Hello world

") $("h2.title").text("Hello there!") $("h2").addClass("welcome") $.html() //=>

Hello there!

更多请参考cheerio

superagent

superagent专注于处理服务端/客户端的http请求,用法如下:

 request
   .get(url)
   .end(function(err, res){

   });

就是这么简答,你已经学会使用它了,别懵逼,这三行代码,已经完全够我们本次示例的使用了。额,当然了,更多的请移步官方文档

superagent

[[译] SuperAgent中文使用文档](https://cnodejs.org/topic/537...

初出茅庐【先拿百度练练手】

我们已经介绍了今天的两大主角,那就先来练练手,就用百度吧

const superAgent = require("superagent")
const cheerio = require("cheerio")
const URL = "http://www.baidu.com/"

// 发起GET请求
superAgent
  .get(URL) 
  .end((err, res)=>{
      if(err) console.error(err)
    // 用cheerio处理返回的html
      const $ = cheerio.load(res.text)
    // 找到并打印出按钮#su的值
    console.log($("#su").val())  // 百度一下
  })   

ok,现在已经了解并能使用这两个模块,更多的探索在自己,我们应当再用写时间去阅读其文档,对其有深入的了解。接下来就是用刚学的这些知识为你涨姿势了。

开始开发joke-cli 初始化项目
$ mkdir joke-cli
$ cd joke-cli
$ npm init
$ npm install cheerio superagent colors --save //colors 输出美化

新建好bin/index.js文件,并加入package.json文件中

"bin": {
    "joke-cli": "./bin/index.js"
 }

现在执行npm link。我们的小项目就初始化成功了,就可以认真思考代码了

首先分析糗事百科url

我们打开糗事百科会发现它的URL还是很简单,由于我们只是爬取段子所以url如下http://www.qiushibaike.com/text/page/2/4965899,2就是页数。

开始编写index.js
#!/usr/bin/env node

const superAgent = require("superagent")
const cheerio = require("cheerio")

let url = "http://www.qiushibaike.com/text/page/"
let page = 1

superAgent
    .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)
  const jokeList = $(".article .content span")
  jokeList.each(function(i, item){
    console.log($(this).text()) //将打印出每条笑话
  })    
})    
···
实现命令行交互

这里我们需要用到readlinem模块

Readline(逐行读取)
require("readline") 模块提供了一个接口,用于从可读流(如 process.stdin)读取数据,每次读取一行。 基本用法如下:

使用 readline.Interface 类实现一个简单的命令行界面:

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: "请输入> "
});

//rl.prompt() 方法会在 output 流中新的一行写入 readline.Interface 实例配置后的 prompt,用于为用户提供一个可供输入的新的位置
rl.prompt();

rl.on("line", (line) => {
  switch(line.trim()) {
    case "hello":
      console.log("world!");
      break;
    default:
      console.log(`你输入的是:"${line.trim()}"`);
      break;
  }
  rl.prompt();
}).on("close", () => {
  console.log("再见!");
  process.exit(0);
});

更多参考Node.js中文网

改写index.js实现命令行交互功能
#!/usr/bin/env node

const superAgent = require("superagent")
const cheerio = require("cheerio")
const readline = require("readline")
const colors = require("colors")
// 创建readlinde.Interface 实现命令行交互
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: " ?  您正在使用joke-cli,按下回车查看笑话 ? >>>"
})
let url = "http://www.qiushibaike.com/text/page/"
let page = 1

// 使用数组来存放笑话
let jokeStories = []
// 载入笑话并存入数组中
function loadJokes(){
      // 数组中的笑话不足三条时就请求下一页的数据
    if(jokeStories.length<3){
        superAgent
        .get(url+page) 
        .end((err, res)=>{
            if(err) console.error(err)
            const $ = cheerio.load(res.text)
            const jokeList = $(".article .content span")
            jokeList.each(function(i, item){
                jokeStories.push($(this).text()) //存入数组
            })
            page++            
        })
    }
}

rl.prompt()
loadJokes()
// line事件 每当 input 流接收到接收行结束符(
、
 或 
)时触发 "line" 事件。 通常发生在用户按下  键或  键。
// 按下回车键显示一条笑话
rl.on("line", (line) => {
    if(jokeStories.length>0){
        console.log("======================")
        console.log(jokeStories.shift().bgCyan.black) //用colors模块改变输出颜色
        loadJokes()
    }else{
        console.log("正在加载中~~~".green)
    }
    rl.prompt()
}).on("close", () => {
    console.log("Bye!")
    process.exit(0)
})

这里我们用了一个数组存放笑话,每按下回车,就显示一条(shift()删除并返回数组第一个元素),当数组中不足三条时就请求新的一页

总结

到此,我们的joke-cli就开发完成。此时我们应该了解了superagent, cheerio, readline等模块的使用。这会儿应该趁热打铁,快去好好看看这些模块吧

相关链接

原文链接xingxin.me

cheerio

superagent

译)SuperAgent中文使用文档

Node.js中文网

colors.js

大家可以关注我的公众号,一起玩耍。有技术干货也有扯淡乱谈,关注回复[888]领取福利

左手代码右手砖,抛砖引玉

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82080.html

相关文章

  • SegmentFault 社区访谈 | 有明,不仅仅是死亡诗社的程序猿

    摘要:另一方面来说,也不是说程序猿就不可以通过提升自己的实力找到女票。好了,人口调查填写完毕以上为依云酱的原文,,具体的发布时间,大概在下周的今天 showImg(https://segmentfault.com/img/bVQ7ZG?w=900&h=385); 社区专访的第一邀请了公子,回忆传送门,小伙伴似乎对公子颇为喜欢,大概是社区声望榜第一的头衔为他加分了不少,迷了大家的眼,忽略了他圆...

    Taonce 评论0 收藏0
  • 了解可执的NPM包

    摘要:在源码中也可以看到,在执行之前动态的引入了这些解释器模块。因为认为如果你要使用,那么一定会有对应的依赖,这个模块就是与同级的依赖,也就是说可以放心的进行,大致这样的结构的位置在这里执行脚本以及一个相反的栗子 NPM是Node.js的包管理工具,随着Node.js的出现,以及前端开发开始使用gulp、webpack、rollup以及其他各种优秀的编译打包工具(大多数采用Node.js来实...

    MingjunYang 评论0 收藏0
  • node命令工具开发【翻译工具

    摘要:命令行工具开发有许多命令行工具。现在我们就用来开发一个实用的命令行小工具一初探一个最简单的命令行工具首先我们新建一目录,然后执行生成文件新建一目录并在目录下创建一个执行我们可以看到终端输出。。 node命令行工具开发 NodeJs有许多命令行工具。它们全局安装,并提供一个命令供我们使用,完成相应的功能。 现在我们就用node来开发一个实用的命令行小工具 一.初探 一个最简单的命令行工具...

    Yang_River 评论0 收藏0
  • 基于 Node+express 爬虫的数据 API,爬一套自己的api数据(2)

    摘要:目前半岛局势紧张,朝鲜已进行了六次核试验,被广泛认为已经拥有了核弹头。另外朝鲜的导弹技术今年以来快速突破,成功试射了射程可覆盖美国本土的洲际弹道导弹。这个版的内容传到互联网上后,迅速刷屏,引起纷纷议论。 SplderApi2 Node-SplderApi2 第二版 基于Node 的网络爬虫 API接口 包括前端开发日报、kugou音乐、前端top框架排行、妹纸福利、搞笑视频、段子笑话、...

    beanlam 评论0 收藏0
  • 微信程序集成 Jenkins

    摘要:总结本文以微信小程序常规的发布流程为切入点,循序渐进地介绍了如何集成实现微信小程序预览上传功能。 showImg(https://raw.githubusercontent.com/yingye/Blog/master/images/wechat-jenkins.png); 本文首发于 https://github.com/yingye/Blo... ,欢迎各位关注我的Blog,正文以...

    young.li 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<