用express寫一個簡單的爬蟲

框架 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文件上找到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末憋活,一起剝皮案震驚了整個濱河市虱黄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辜梳,老刑警劉巖泳叠,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宗挥,居然都是意外死亡种蝶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來会傲,“玉大人拙泽,你說我怎么就攤上這事∑靡桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵退渗,是天一觀的道長。 經(jīng)常有香客問我会油,道長,這世上最難降的妖魔是什么都许? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任嫂冻,我火速辦了婚禮,結(jié)果婚禮上睛低,老公的妹妹穿的比我還像新娘飘弧。我一直安慰自己掰烟,他們只是感情好急波,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布澄暮。 她就那樣靜靜地躺著阱扬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪麻惶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天卡啰,我揣著相機與錄音警没,去河邊找鬼。 笑死杀迹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浅碾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼摧茴,長吁一口氣:“原來是場噩夢啊……” “哼埂陆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起购裙,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鹃栽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后民鼓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡夯到,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年耍贾,在試婚紗的時候發(fā)現(xiàn)自己被綠了路幸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡晃听,死狀恐怖杂伟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤观话,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站灵迫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挣跋。R本人自食惡果不足惜狞换,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望修噪。 院中可真熱鬧,春花似錦樊销、人聲如沸脏款。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至周循,卻和暖如春万俗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嚎研。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工临扮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人教翩。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓饱亿,卻偏偏與公主長得像闰靴,于是被迫代替她去往敵國和親钻注。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容