Node.js實戰(zhàn)cheerio網(wǎng)頁抓取器

網(wǎng)絡(luò)抓取要識別Web頁面穴亏,并將其轉(zhuǎn)換成結(jié)構(gòu)化數(shù)據(jù)蜂挪。比如說,你要負(fù)責(zé)升級出版社那古老的靜態(tài)網(wǎng)站嗓化,需要把之前的頁面下載下來棠涮,經(jīng)過分析后提取所有圖書的書名、介紹刺覆、作者和售價严肪。你肯定不想自己手工完成這項任務(wù),所以決定寫個Node程序來做這件事谦屑。這種程序就是網(wǎng)絡(luò)抓取器驳糯。
                           —— 《Node.js實戰(zhàn)》 (第2版) P267

Node.js實戰(zhàn) 封面

找個出版社的靜態(tài)網(wǎng)頁,圖靈社區(qū)不就是個正好的對象嗎??氢橙,那就以Node.js實戰(zhàn)(第2版)這本書為例吧酝枢!


1、提取圖書書名

詳情頁中圖書名稱HTML代碼

<h2>
         Node.js實戰(zhàn)(第2版)
</h2>

提取片段的cheerio代碼如下

const html = `
    <h2>
             Node.js實戰(zhàn)(第2版)
    </h2>
`;

const cheerio = require('cheerio');
const $ = cheerio.load(html);
console.log($('.book-title h2').text().trim());

2悍手、提取簡介

<div class="book-intro readmore">
                                    本書是Node.js的實戰(zhàn)教程帘睦,涵蓋了為開發(fā)產(chǎn)品級Node應(yīng)用程序所需要的一切特性、技巧以及相關(guān)理念谓苟。 從搭建Node開發(fā)環(huán)境官脓,到一些簡單的演示程序,到開發(fā)復(fù)雜應(yīng)用程序所必不可少的異步編程涝焙。第2版介紹了全棧開發(fā)者所需的全部技術(shù),包括前端構(gòu)建系統(tǒng)孕暇、選擇Web框架仑撞、在Node中與數(shù)據(jù)庫的交互、編寫測試和部署Web程序妖滔,等等隧哮。 
                                </div>

提取代碼如下

$('.book-intro').text().trim();

3、提取作者

上面兩個比較簡單座舍,只是熱熱身沮翔,作者的提取就稍微有些麻煩了。

HTML代碼

<div class="book-author">
                                <span>
[英] 亞歷克斯?楊 等                                    (作者)
                                </span>
                                <span>
<a href="/space/87796">吳海星</a>                                    (譯者)
                                </span>
                            </div>

可以看到有一個作者曲秉,有一個譯者采蚀,怎么把他們分別提取出來呢。我們先看看下面的代碼

console.log($('.book-author').children().length);

運行的結(jié)果是2承二,說明在book-author這個節(jié)點下面有兩個子節(jié)點榆鼠,這與我們看到的HTML代碼相符。

用一個each函數(shù)遍歷亥鸠,并把它們分別打印出來:

$('.book-author').children().each((i, e)=>{
  console.log($(e).text().trim());
});

再做些進(jìn)一步的處理

$('.book-author').children().each((i, e)=>{
  
  let 名字 = $(e).text().trim();
  if (名字.indexOf('(作者)')  != -1) {
    console.log('作者:', 名字.replace(/\(作者\)/, '').trim());
  }

  if (名字.indexOf('(譯者)')  != -1) {
    console.log('譯者:', 名字.replace(/\(譯者\)/, '').trim());
  }
});

完整代碼

const superagent = require('superagent');
const cheerio = require('cheerio');

const url = 'http://www.ituring.com.cn/book/1993';

superagent.get(url).end( function(err, res) {
    // 拋錯攔截
    if (err) {
        return
        throw Error(err)
    }

    const book = {};

    let $ = cheerio.load(res.text,{
        decodeEntities: false
    });

    book.title = $('.book-title h2').text().trim();

    book.intro = $('.book-intro').text().trim();

    book.status = 出版狀態(tài) = $('li:contains("出版狀態(tài)")').text().replace(/出版狀態(tài)/, '');

    $('.book-author').children().each((i, e)=>{
  
        let 名字 = $(e).text().trim();
        if (名字.indexOf('(作者)')  != -1) {
          book.auther = 名字.replace(/\(作者\)/, '').trim();
        }
      
        if (名字.indexOf('(譯者)')  != -1) {
          book.translator = 名字.replace(/\(譯者\)/, '').trim();
        }
    });

    let 定價 = $('li:contains("定  價")').text().replace(/定  價/, '');

    if (定價) {
        book.price = 定價;

        let 有電子書 = false;
        
        let 找電子書 = $('dt').filter( function() {
            let 有嗎 = $(this).text().trim() === '電子書';
            if (有嗎 === true) {
                有電子書 = true;
                return true;
            }
        });

        if (有電子書) {
            book.ePrice = 找電子書.next().children('.price').text().trim();
        }
    }

    book.tags = [];

    $('.post-tag').each((i, e)=>{
        book.tags.push($(e).text());
    });

    console.log(book);
});
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妆够,一起剝皮案震驚了整個濱河市识啦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌神妹,老刑警劉巖颓哮,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸵荠,居然都是意外死亡冕茅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門腰鬼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嵌赠,“玉大人,你說我怎么就攤上這事熄赡〗Γ” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵彼硫,是天一觀的道長炊豪。 經(jīng)常有香客問我,道長拧篮,這世上最難降的妖魔是什么词渤? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮串绩,結(jié)果婚禮上缺虐,老公的妹妹穿的比我還像新娘。我一直安慰自己礁凡,他們只是感情好高氮,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顷牌,像睡著了一般剪芍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窟蓝,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天罪裹,我揣著相機與錄音,去河邊找鬼运挫。 笑死状共,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滑臊。 我是一名探鬼主播口芍,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雇卷!你這毒婦竟也來了鬓椭?” 一聲冷哼從身側(cè)響起颠猴,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎小染,沒想到半個月后翘瓮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡裤翩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年资盅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踊赠。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呵扛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出筐带,到底是詐尸還是另有隱情今穿,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布伦籍,位于F島的核電站蓝晒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏帖鸦。R本人自食惡果不足惜芝薇,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望作儿。 院中可真熱鬧洛二,春花似錦、人聲如沸攻锰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽口注。三九已至,卻和暖如春君珠,著一層夾襖步出監(jiān)牢的瞬間寝志,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工策添, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留材部,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓唯竹,卻偏偏與公主長得像乐导,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浸颓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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

  • Node.js第一天 1. 初識Node.js 1.1 Node.js是什么 Node.js? is a Java...
    再見天才閱讀 4,733評論 1 24
  • 弟兄們物臂,我還有話說:我們靠著主耶穌求你們旺拉,勸你們,你們既然受了我們的教訓(xùn)棵磷,知道該怎樣行可以討神的喜悅蛾狗,就要照你們現(xiàn)...
    澳新好物種草閱讀 1,798評論 0 0
  • 昨晚親爸喝醉酒給于朵打電話。 談了很多事情仪媒,直到夜里十點沉桌。后來姐和妹也加入進(jìn)來。 他很開心算吩,看樣子是吧留凭。他眼神很溫...
    笠早閱讀 299評論 0 1
  • 妹妹應(yīng)聘某銀行大堂經(jīng)理失敗蔼夜,回來和我說面試的事。 第一關(guān)面試應(yīng)該是看顏值吧艘狭,畢竟銀行這種窗口單位挎扰,顏值放在首位也不...
    戀楓林閱讀 1,711評論 0 4
  • 云在他鄉(xiāng)常做客 月留一半照故鄉(xiāng) 思親辛苦心憔悴 深夜無眠空自傷
    白鶴來翔閱讀 59評論 0 0