what I do
周六的天空依然很藍(lán)羡棵,騎著腳踏車壹若,約上幾個(gè)好友,繞著大明湖畔皂冰,尋找夏天的雨荷店展。
一臺(tái)電腦、一張辦公桌灼擂、一個(gè)板凳壁查,我們依然在敲著鍵盤
說(shuō)說(shuō)今天的任務(wù):node去寫爬蟲,獲取數(shù)據(jù)
思路
獲取公共網(wǎng)站的頁(yè)面數(shù)據(jù)
1剔应、發(fā)起http請(qǐng)求
2睡腿、使用cheerio模塊,通過對(duì)DOM進(jìn)行分析峻贮,獲取json數(shù)據(jù)
code
const http = require('http');
const cheerio = require('cheerio'); //模仿jq的模塊
const express = require('express');
const url = '百度糯米'
http.get(url,(res) => {
var chunks = [];
var size = 0;
res.on('data',(ev) => {
/*返回的二進(jìn)制 暫存到數(shù)組中*/
chunks.push(ev);
size += ev.length;
})
res.on('end',() => {
/*保存的二進(jìn)制 保存到buffer流中 最后轉(zhuǎn)為二進(jìn)制輸出*/
var data = Buffer.concat(chunks, size);
var html = data.toString();
/*ending html 在這里已經(jīng)獲取*/
var $ = cheerio.load(html);
var arr = [];
/*遍歷所有列表*/
$('.j-card').each(function () {
var obj = {},$this = $(this);
obj.url = $this.find('.borderbox img').attr('data-original');
obj.title = $this.find('.title').text();
obj.price = $this.find('.price').text();
arr.push(obj);
})
//生成arr返回給前端
reponse.json({
arr:arr
});
})
}).on('error',(e)=>{
console.log(e);
})
知識(shí)點(diǎn)延伸
1 席怪、const 定義常量、var 定義變量
2 纤控、在計(jì)算機(jī)內(nèi)部 字符串 占兩個(gè)字節(jié) 挂捻, 數(shù)字占一個(gè)字節(jié) ,但是js對(duì)于字符串的處理相當(dāng)友好 幫我們解決了這個(gè)問題
buffer是什么
- buffer又被成為臨時(shí)貯存區(qū)船万,暫時(shí)存放輸入輸出數(shù)據(jù)的一段內(nèi)存
- js語(yǔ)言只有字符串?dāng)?shù)據(jù)類型刻撒,不存在二進(jìn)制數(shù)據(jù)類型骨田,故node提供了與string對(duì)等的構(gòu)造函數(shù)buffer,來(lái)對(duì)二進(jìn)制進(jìn)行操作
- js對(duì)字符串處理十分友好声怔,node中需要處理網(wǎng)絡(luò)協(xié)議态贤、操作數(shù)據(jù)庫(kù)、處理圖片醋火、文件上傳悠汽,還需要處理大量二進(jìn)制數(shù)據(jù),自帶字符串遠(yuǎn)遠(yuǎn)不能滿足這些要求芥驳,因此buffer應(yīng)運(yùn)而生
- buffer是一個(gè)典型的c++ 與 js結(jié)合的模塊柿冲,性能部分用c++實(shí)現(xiàn),非性能部分用js實(shí)現(xiàn)
- node 在啟動(dòng)的時(shí)候 buffer已經(jīng)被加入到內(nèi)存中了兆旬,并存近全局對(duì)象假抄,因此無(wú)需require
- buffer對(duì)象:類似于數(shù)組,元素時(shí)16進(jìn)制的兩位數(shù)
- buffer對(duì)象的內(nèi)存分配并不是在V8的堆內(nèi)存中丽猬,而是在node的c++層面申請(qǐng)的內(nèi)存
- buffer可以與字符串相互轉(zhuǎn)換 utf-8 base64 ASCII等 不能處理GBK 等歷史遺留編碼