最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nodeJs爬蟲的技術(shù)點(diǎn)總結(jié)

 更新時(shí)間:2018年05月13日 14:11:50   作者:紫日殘?jiān)? 
本篇文章給大家總結(jié)了關(guān)于nodeJs爬蟲的技術(shù)點(diǎn)的相關(guān)知識,對爬蟲有興趣的朋友可以跟著學(xué)習(xí)參考下。

背景

最近打算把之前看過的nodeJs相關(guān)的內(nèi)容在復(fù)習(xí)下,順便寫幾個(gè)爬蟲來打發(fā)無聊,在爬的過程中發(fā)現(xiàn)一些問題,記錄下以便備忘。

依賴

用到的是在網(wǎng)上爛大街的cheerio庫來處理爬取的內(nèi)容,使用superagent處理請求,log4js來記錄日志。

日志配置

話不多說,直接上代碼:

const log4js = require('log4js');

log4js.configure({
 appenders: {
  cheese: {
   type: 'dateFile',
   filename: 'cheese.log',
   pattern: '-yyyy-MM-dd.log',
   // 包含模型
   alwaysIncludePattern: true,

   maxLogSize: 1024,
   backups: 3 }
 },
 categories: { default: { appenders: ['cheese'], level: 'info' } }
});

const logger = log4js.getLogger('cheese');
logger.level = 'INFO';

module.exports = logger;

以上直接導(dǎo)出一個(gè)logger對象,在業(yè)務(wù)文件里直接調(diào)用logger.info()等函數(shù)添加日志信息就可以,會按天生成日志。相關(guān)信息網(wǎng)絡(luò)上一堆。

爬取內(nèi)容并處理

 superagent.get(cityItemUrl).end((err, res) => {
  if (err) {
   return console.error(err);
  }

  const $ = cheerio.load(res.text);
  // 解析當(dāng)前頁面,獲取當(dāng)前頁面的城市鏈接地址
  const cityInfoEle = $('.newslist1 li a');
  cityInfoEle.each((idx, element) => {
   const $element = $(element);
   const sceneURL = $element.attr('href'); // 頁面地址
   const sceneName = $element.attr('title'); // 城市名稱
   if (!sceneName) {
    return;
   }
   logger.info(`當(dāng)前解析到的目的地是: ${sceneName}, 對應(yīng)的地址為: ${sceneURL}`);

   getDesInfos(sceneURL, sceneName); // 獲取城市詳細(xì)信息

   ep.after('getDirInfoComplete', cityInfoEle.length, (dirInfos) => {
    const content = JSON.parse(fs.readFileSync(path.join(__dirname, './imgs.json')));

    dirInfos.forEach((element) => {
     logger.info(`本條數(shù)據(jù)為:${JSON.stringify(element)}`);
     Object.assign(content, element);
    });

    fs.writeFileSync(path.join(__dirname, './imgs.json'), JSON.stringify(content));
   });
  });
 });

使用superagent請求頁面,請求成功后使用cheerio 來加載頁面內(nèi)容,然后使用類似Jquery的匹配規(guī)則來查找目的資源。

多個(gè)資源加載完成,使用eventproxy來代理事件,處理一次資源處罰一次事件,所有事件觸發(fā)完成后處理數(shù)據(jù)。

以上就是最基本的爬蟲了,接下來就是一些可能會出問題或者需要特別注意的地方了。。。

讀寫本地文件

創(chuàng)建文件夾

function mkdirSync(dirname) {
 if (fs.existsSync(dirname)) {
  return true;
 }
 if (mkdirSync(path.dirname(dirname))) {
  fs.mkdirSync(dirname);
  return true;
 }

 return false;
}

讀寫文件

   const content = JSON.parse(fs.readFileSync(path.join(__dirname, './dir.json')));

   dirInfos.forEach((element) => {
    logger.info(`本條數(shù)據(jù)為:${JSON.stringify(element)}`);
    Object.assign(content, element);
   });

   fs.writeFileSync(path.join(__dirname, './dir.json'), JSON.stringify(content));

批量下載資源

下載資源可能包括圖片、音頻等等。

使用Bagpipe處理異步并發(fā) 參考

const Bagpipe = require('bagpipe');

const bagpipe = new Bagpipe(10);

  bagpipe.push(downloadImage, url, dstpath, (err, data) => {
   if (err) {
    console.log(err);
    return;
   }
   console.log(`[${dstpath}]: ${data}`);
  });

下載資源,使用stream來完成文件寫入。

function downloadImage(src, dest, callback) {
 request.head(src, (err, res, body) => {
  if (src && src.indexOf('http') > -1 || src.indexOf('https') > -1) {
   request(src).pipe(fs.createWriteStream(dest)).on('close', () => {
    callback(null, dest);
   });
  }
 });
}

編碼

有時(shí)候直接使用 cheerio.load處理的網(wǎng)頁內(nèi)容,寫入文件后發(fā)現(xiàn)是編碼后的文字,可以通過

const $ = cheerio.load(buf, { decodeEntities: false });

來禁止編碼,

ps: encoding庫和iconv-lite未能實(shí)現(xiàn)將utf-8編碼的字符轉(zhuǎn)換為中文,可能是還對API不熟悉,稍后可以關(guān)注下。

最后,附上一個(gè)匹配所有dom標(biāo)簽的正則

const reg = /<.*?>/g;

相關(guān)文章

  • 詳解基于Vue+Koa的pm2配置

    詳解基于Vue+Koa的pm2配置

    這篇文章主要介紹了詳解基于Vue+Koa的pm2配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • Express.js 全局錯(cuò)誤處理實(shí)現(xiàn)

    Express.js 全局錯(cuò)誤處理實(shí)現(xiàn)

    本文主要介紹了Express.js 全局錯(cuò)誤處理實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 使用pkg打包nodejs項(xiàng)目并解決本地文件讀取的問題

    使用pkg打包nodejs項(xiàng)目并解決本地文件讀取的問題

    這篇文章主要介紹了使用pkg打包nodejs項(xiàng)目并解決本地文件讀取的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • node.js中process進(jìn)程的概念和child_process子進(jìn)程模塊的使用方法示例

    node.js中process進(jìn)程的概念和child_process子進(jìn)程模塊的使用方法示例

    這篇文章主要介紹了node.js中process進(jìn)程的概念和child_process子進(jìn)程模塊的使用方法,結(jié)合實(shí)例形式分析了node.js中process進(jìn)程和child_process子進(jìn)程模塊相關(guān)概念、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • 基于nodejs res.end和res.send的區(qū)別

    基于nodejs res.end和res.send的區(qū)別

    今天小編就為大家分享一篇基于nodejs res.end和res.send的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • node.js中的Socket.IO使用實(shí)例

    node.js中的Socket.IO使用實(shí)例

    這篇文章主要介紹了node.js中的Socket.IO使用實(shí)例,本文講解了Socket.IO的安裝、結(jié)合express來構(gòu)建服務(wù)器、基本使用方法及一個(gè)網(wǎng)絡(luò)聊天室的完整案例,需要的朋友可以參考下
    2014-11-11
  • node.js中的fs.appendFile方法使用說明

    node.js中的fs.appendFile方法使用說明

    這篇文章主要介紹了node.js中的fs.appendFile方法使用說明,本文介紹了fs.appendFile方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 關(guān)于node使用multer進(jìn)行文件的上傳與下載

    關(guān)于node使用multer進(jìn)行文件的上傳與下載

    這篇文章主要介紹了關(guān)于node使用multer進(jìn)行文件的上傳與下載,Multer是一個(gè)Node.js中間件,用于處理表單數(shù)據(jù)中的multipart/form-data類型,需要的朋友可以參考下
    2023-04-04
  • NodeJS中的命令行程序、工程目錄、NPM

    NodeJS中的命令行程序、工程目錄、NPM

    使用NodeJS編寫的東西,要么是一個(gè)包,要么是一個(gè)命令行程序,而前者最終也會用于開發(fā)后者,一般我們會同時(shí)提供命令行模式和API模式兩種使用方式,并且我們會借助三方包來編寫代碼,NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題
    2023-11-11
  • windows系統(tǒng)中如何更新npm及node.js到最新版本

    windows系統(tǒng)中如何更新npm及node.js到最新版本

    這篇文章主要介紹了windows系統(tǒng)中如何更新npm及node.js到最新版本的相關(guān)資料,文中介紹了兩種方法,還提到了一些常見問題的解決方法,如權(quán)限錯(cuò)誤和使用nvm-windows管理Node.js版本,需要的朋友可以參考下
    2025-05-05

最新評論

兰西县| 梨树县| 平顺县| 乐平市| 秭归县| 三原县| 吴堡县| 蓝田县| 钟山县| 襄樊市| 广饶县| 宁津县| 中牟县| 四子王旗| 建昌县| 漾濞| 定日县| 大英县| 将乐县| 霍州市| 雅安市| 泉州市| 惠水县| 泰顺县| 剑川县| 安庆市| 富平县| 通州市| 昂仁县| 乐昌市| 库尔勒市| 崇州市| 南宫市| 临桂县| 民和| 石狮市| 施甸县| 出国| 敖汉旗| 安福县| 张掖市|