框架 Express
express 是 Node.js 應(yīng)用最廣泛的 web 框架端礼,express 的官網(wǎng)是 http://expressjs.com/ 。
在文件目錄下安裝express
新建文件和package.json文件默蚌。
mkdir demo && cd demo
npm init
npm install express
簡單實現(xiàn)'hello world'
在demo目錄下新建一個js文件
touch app.js
寫入內(nèi)容:
// 這句的意思就是引入 `express` 模塊拾徙,并將它賦予 `express` 這個變量等待使用误续。
const express = require('express');
// 調(diào)用 express 實例即供,它是一個函數(shù)定拟,不帶參數(shù)調(diào)用時,會返回一個 express 實例逗嫡,將這個變量賦予 app 變量青自。
const app = express();
// app 本身有很多方法,其中包括最常用的 get驱证、post性穿、put/patch、delete雷滚,在這里我們調(diào)用其中的 get 方法,為我們的 `/` 路徑指定一個 handler 函數(shù)吗坚。
// 這個 handler 函數(shù)會接收 req 和 res 兩個對象祈远,他們分別是請求的 request 和 response。
// request 中包含了瀏覽器傳來的各種信息商源,比如 query 啊车份,body 啊,headers 啊之類的扫沼,都可以通過 req 對象訪問到。
// res 對象庄吼,我們一般不從里面取信息,而是通過它來定制我們向瀏覽器輸出的信息总寻,比如 header 信息器罐,比如想要向瀏覽器輸出的內(nèi)容。這里我們調(diào)用了它的 #send 方法渐行,向瀏覽器輸出一個字符串轰坊。
app.get('/', (req, res) => {
res.send('Hello World');
});
// 定義好我們 app 的行為之后铸董,讓它監(jiān)聽本地的 3000 端口。這里的第二個函數(shù)是個回調(diào)函數(shù)肴沫,會在 listen 動作成功后執(zhí)行粟害,我們這里執(zhí)行了一個命令行輸出操作,告訴我們監(jiān)聽動作已完成颤芬。
app.listen(3000, () => {
console.log('app is listening at port 3000');
});
執(zhí)行
node app.js
這時候我們的 app 就跑起來了悲幅,終端中會輸出 app is listening at port 3000。這時我們打開瀏覽器驻襟,訪問 http://localhost:3000/夺艰,會出現(xiàn) Hello World。
使用 superagent 與 cheerio 完成簡單爬蟲
superagent(http://visionmedia.github.io/superagent/ ) 是個 http 方面的庫沉衣,可以發(fā)起 get 或 post 請求郁副。
cheerio(https://github.com/cheeriojs/cheerio ) 大家可以理解成一個 Node.js 版的 jquery,用來從網(wǎng)頁中以 css selector 取數(shù)據(jù)豌习,使用方式跟 jquery 一樣一樣的存谎。
我們試著用superagent 與 cheerio簡單爬取v2ex上的內(nèi)容,
用下面代碼替換app.js里的內(nèi)容
const express = require('express');
// 調(diào)用 express 實例肥隆,它是一個函數(shù)既荚,不帶參數(shù)調(diào)用時,會返回一個 express 實例栋艳,將這個變量賦予 app 變量恰聘。
const superagent = require('superagent');
const cheerio = require('cheerio');
const app = express();
app.get('/', (req, res, next) => {
console.log(req)
superagent.get('https://www.v2ex.com/')
.end((err, sres) => {
// 常規(guī)的錯誤處理
if (err) {
return next(err);
}
// sres.text 里面存儲著網(wǎng)頁的 html 內(nèi)容,將它傳給 cheerio.load 之后
// 就可以得到一個實現(xiàn)了 jquery 接口的變量吸占,我們習(xí)慣性地將它命名為 `$`
// 剩下就都是 jquery 的內(nèi)容了
let $ = cheerio.load(sres.text);
let items = [];
$('.item_title a').each((idx, element) => {
let $element = $(element);
items.push({
title: $element.text(),
href: $element.attr('href')
});
});
res.send(items);
});
});
app.listen(3000, function () {
console.log('app is listening at port 3000');
});
運行后打開3000端口晴叨,一個簡單的爬蟲就完成了。
端口
端口的作用:通過端口來區(qū)分出同一電腦內(nèi)不同應(yīng)用或者進(jìn)程矾屯,從而實現(xiàn)一條物理網(wǎng)線(通過分組交換技術(shù)-比如internet)同時鏈接多個程序
Port_(computer_networking)
端口號是一個 16位的 uint, 所以其范圍為 1 to 65535 (對TCP來說, port 0 被保留兼蕊,不能被使用. 對于UDP來說, source端的端口號是可選的, 為0時表示無端口件蚕。
app.listen(3000)孙技,進(jìn)程就被打標(biāo),電腦接收到的3000端口的網(wǎng)絡(luò)消息就會被發(fā)送給我們啟動的這個進(jìn)程排作。
URL
RFC1738 定義的url格式籠統(tǒng)版本<scheme>:<scheme-specific-part>
牵啦,scheme有我們很熟悉的http、https纽绍、ftp蕾久,以及著名的 ed2k,thunder。
通常我們熟悉的url定義成這個樣子<scheme>://<user>:<password>@<host>:<port>/<url-path>
僧著。
用過ftp的估計能體會這么長的履因,網(wǎng)頁上很少帶auth信息,所以就精簡成這樣: <scheme>://<host>:<port>/<url-path>
盹愚。
在上面的例子中, scheme=http, host=localhost, port=3000, url-path=/
, 再聯(lián)想對照一下瀏覽器端window.location對象。 著名的localhost皆怕,你可以在電腦的hosts文件上找到。