摘要:我們的小項(xiàng)目就初始化成功了,就可以認(rèn)真思考代碼了首先分析糗事百科我們打開糗事百科會(huì)發(fā)現(xiàn)它的還是很簡單,由于我們只是爬取段子所以如下,就是頁數(shù)。
Node命令行工具開發(fā)【看段子】
你有沒有上班想看笑話卻又怕領(lǐng)導(dǎo)發(fā)現(xiàn)的經(jīng)歷?現(xiàn)在我們就用幾十行代碼寫一個(gè)命令行看笑話段子的小程序,從此無需擔(dān)心領(lǐng)導(dǎo)的視察。這篇文章和上一篇差不多都是命令行小工具開發(fā),不過本篇更偏向于小爬蟲的開發(fā)總覽:命令行看段子小程序
我們先來看看我們今天的小目標(biāo):
先為它起個(gè)命吧:joke-cli
爬取并提取 糗事百科的笑話
輸出到命令行按下回車顯示一條段子
初識(shí)[新手村]下面我們將介紹今天用到的主要模塊
cheeriocheerio可理解為服務(wù)器端的jQuery,基本用法與jQuery一樣。有了它,我們?cè)趯懶∨老x時(shí)就可拋開那可愛又可恨的正則表達(dá)式了。從此擁抱幸福生活。
用法如下:
let cheerio = require("cheerio") // 將html文本轉(zhuǎn)化成可用jQuery操作的dom,,然后你就可以把它當(dāng)成jQuery了 let $ = cheerio.load("Hello world
") $("h2.title").text("Hello there!") $("h2").addClass("welcome") $.html() //=>Hello there!
更多請(qǐng)參考cheerio
superagentsuperagent專注于處理服務(wù)端/客戶端的http請(qǐng)求,用法如下:
request .get(url) .end(function(err, res){ });
就是這么簡答,你已經(jīng)學(xué)會(huì)使用它了,別懵逼,這三行代碼,已經(jīng)完全夠我們本次示例的使用了。額,當(dāng)然了,更多的請(qǐng)移步官方文檔
superagent
[[譯] SuperAgent中文使用文檔](https://cnodejs.org/topic/537...
初出茅廬【先拿百度練練手】我們已經(jīng)介紹了今天的兩大主角,那就先來練練手,就用百度吧
const superAgent = require("superagent") const cheerio = require("cheerio") const URL = "http://www.baidu.com/" // 發(fā)起GET請(qǐng)求 superAgent .get(URL) .end((err, res)=>{ if(err) console.error(err) // 用cheerio處理返回的html const $ = cheerio.load(res.text) // 找到并打印出按鈕#su的值 console.log($("#su").val()) // 百度一下 })
ok,現(xiàn)在已經(jīng)了解并能使用這兩個(gè)模塊,更多的探索在自己,我們應(yīng)當(dāng)再用寫時(shí)間去閱讀其文檔,對(duì)其有深入的了解。接下來就是用剛學(xué)的這些知識(shí)為你漲姿勢(shì)了。
開始開發(fā)joke-cli 初始化項(xiàng)目$ 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" }
現(xiàn)在執(zhí)行npm link。我們的小項(xiàng)目就初始化成功了,就可以認(rèn)真思考代碼了
首先分析糗事百科url我們打開糗事百科會(huì)發(fā)現(xiàn)它的URL還是很簡單,由于我們只是爬取段子所以u(píng)rl如下http://www.qiushibaike.com/text/page/2/4965899,2就是頁數(shù)。
開始編寫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結(jié)構(gòu),可以發(fā)先每條笑話都在一個(gè)div.article中,笑話的內(nèi)容則在div.content中
在分析完html結(jié)夠后,現(xiàn)在可以用我們用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()) //將打印出每條笑話 }) }) ···實(shí)現(xiàn)命令行交互
這里我們需要用到readlinem模塊
Readline(逐行讀取)require("readline") 模塊提供了一個(gè)接口,用于從可讀流(如 process.stdin)讀取數(shù)據(jù),每次讀取一行。 基本用法如下:
使用 readline.Interface 類實(shí)現(xiàn)一個(gè)簡單的命令行界面:
const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: "請(qǐng)輸入> " }); //rl.prompt() 方法會(huì)在 output 流中新的一行寫入 readline.Interface 實(shí)例配置后的 prompt,用于為用戶提供一個(gè)可供輸入的新的位置 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中文網(wǎng)
改寫index.js實(shí)現(xiàn)命令行交互功能#!/usr/bin/env node const superAgent = require("superagent") const cheerio = require("cheerio") const readline = require("readline") const colors = require("colors") // 創(chuàng)建readlinde.Interface 實(shí)現(xiàn)命令行交互 const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: " ? 您正在使用joke-cli,按下回車查看笑話 ? >>>" }) let url = "http://www.qiushibaike.com/text/page/" let page = 1 // 使用數(shù)組來存放笑話 let jokeStories = [] // 載入笑話并存入數(shù)組中 function loadJokes(){ // 數(shù)組中的笑話不足三條時(shí)就請(qǐng)求下一頁的數(shù)據(jù) 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()) //存入數(shù)組 }) page++ }) } } rl.prompt() loadJokes() // line事件 每當(dāng) input 流接收到接收行結(jié)束符( 、 或 )時(shí)觸發(fā) "line" 事件。 通常發(fā)生在用戶按下鍵或 鍵。 // 按下回車鍵顯示一條笑話 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) })
這里我們用了一個(gè)數(shù)組存放笑話,每按下回車,就顯示一條(shift()刪除并返回?cái)?shù)組第一個(gè)元素),當(dāng)數(shù)組中不足三條時(shí)就請(qǐng)求新的一頁
總結(jié)到此,我們的joke-cli就開發(fā)完成。此時(shí)我們應(yīng)該了解了superagent, cheerio, readline等模塊的使用。這會(huì)兒應(yīng)該趁熱打鐵,快去好好看看這些模塊吧
相關(guān)鏈接原文鏈接xingxin.me
cheerio
superagent
譯)SuperAgent中文使用文檔
Node.js中文網(wǎng)
colors.js
大家可以關(guān)注我的公眾號(hào),一起玩耍。有技術(shù)干貨也有扯淡亂談,關(guān)注回復(fù)[888]領(lǐng)取福利
左手代碼右手磚,拋磚引玉
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/82080.html
摘要:另一方面來說,也不是說程序猿就不可以通過提升自己的實(shí)力找到女票。好了,人口調(diào)查填寫完畢以上為依云醬的原文,,具體的發(fā)布時(shí)間,大概在下周的今天 showImg(https://segmentfault.com/img/bVQ7ZG?w=900&h=385); 社區(qū)專訪的第一邀請(qǐng)了公子,回憶傳送門,小伙伴似乎對(duì)公子頗為喜歡,大概是社區(qū)聲望榜第一的頭銜為他加分了不少,迷了大家的眼,忽略了他圓...
摘要:在源碼中也可以看到,在執(zhí)行之前動(dòng)態(tài)的引入了這些解釋器模塊。因?yàn)檎J(rèn)為如果你要使用,那么一定會(huì)有對(duì)應(yīng)的依賴,這個(gè)模塊就是與同級(jí)的依賴,也就是說可以放心的進(jìn)行,大致這樣的結(jié)構(gòu)的位置在這里執(zhí)行腳本以及一個(gè)相反的栗子 NPM是Node.js的包管理工具,隨著Node.js的出現(xiàn),以及前端開發(fā)開始使用gulp、webpack、rollup以及其他各種優(yōu)秀的編譯打包工具(大多數(shù)采用Node.js來實(shí)...
摘要:命令行工具開發(fā)有許多命令行工具?,F(xiàn)在我們就用來開發(fā)一個(gè)實(shí)用的命令行小工具一初探一個(gè)最簡單的命令行工具首先我們新建一目錄,然后執(zhí)行生成文件新建一目錄并在目錄下創(chuàng)建一個(gè)執(zhí)行我們可以看到終端輸出。。 node命令行工具開發(fā) NodeJs有許多命令行工具。它們?nèi)职惭b,并提供一個(gè)命令供我們使用,完成相應(yīng)的功能。 現(xiàn)在我們就用node來開發(fā)一個(gè)實(shí)用的命令行小工具 一.初探 一個(gè)最簡單的命令行工具...
摘要:目前半島局勢(shì)緊張,朝鮮已進(jìn)行了六次核試驗(yàn),被廣泛認(rèn)為已經(jīng)擁有了核彈頭。另外朝鮮的導(dǎo)彈技術(shù)今年以來快速突破,成功試射了射程可覆蓋美國本土的洲際彈道導(dǎo)彈。這個(gè)版的內(nèi)容傳到互聯(lián)網(wǎng)上后,迅速刷屏,引起紛紛議論。 SplderApi2 Node-SplderApi2 第二版 基于Node 的網(wǎng)絡(luò)爬蟲 API接口 包括前端開發(fā)日?qǐng)?bào)、kugou音樂、前端top框架排行、妹紙福利、搞笑視頻、段子笑話、...
摘要:總結(jié)本文以微信小程序常規(guī)的發(fā)布流程為切入點(diǎn),循序漸進(jìn)地介紹了如何集成實(shí)現(xiàn)微信小程序預(yù)覽上傳功能。 showImg(https://raw.githubusercontent.com/yingye/Blog/master/images/wechat-jenkins.png); 本文首發(fā)于 https://github.com/yingye/Blo... ,歡迎各位關(guān)注我的Blog,正文以...
閱讀 942·2021-09-07 09:58
閱讀 1491·2021-09-07 09:58
閱讀 2885·2021-09-04 16:40
閱讀 2506·2019-08-30 15:55
閱讀 2414·2019-08-30 15:54
閱讀 1371·2019-08-30 15:52
閱讀 434·2019-08-30 10:49
閱讀 2607·2019-08-29 13:21