Maison  >  Article  >  interface Web  >  Explication détaillée des étapes d'utilisation du robot d'exploration nodeJs

Explication détaillée des étapes d'utilisation du robot d'exploration nodeJs

php中世界最好的语言
php中世界最好的语言original
2018-05-21 15:30:121545parcourir

Cette fois, je vais vous apporter une explication détaillée des étapes d'utilisation du robot nodeJs. Quelles sont les précautions lors de l'utilisation du robot nodeJs. Ce qui suit est un cas pratique, jetons un coup d'œil.

Contexte

Récemment, j'ai l'intention de revoir le contenu lié à nodeJs que j'ai vu auparavant et d'écrire quelques robots pour tuer l'ennui, et j'en ai découvert pendant le processus d'exploration. Enregistrez-les pour référence future.

Dépendance

utilise la bibliothèque cheerio qui est populaire sur Internet pour traiter le contenu exploré, le superagent est utilisé pour traiter les demandes et log4js est utilisé pour enregistrer les journaux.

Configuration du journal

Sans plus attendre, passons directement au code :

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;

Ce qui précède exporte directement un objet logger et exporte directement dans le fichier professionnel. Appelez simplement des fonctions telles que logger.info() pour ajouter des informations de journal, et les journaux seront générés quotidiennement. Il existe de nombreuses informations pertinentes sur Internet.

Explorez le contenu et traitez-le

 superagent.get(cityItemUrl).end((err, res) => {
  if (err) {
   return console.error(err);
  }
  const $ = cheerio.load(res.text);
  // 解析当前页面,获取当前页面的城市链接地址
  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(`当前解析到的目的地是: ${sceneName}, 对应的地址为: ${sceneURL}`);
   getDesInfos(sceneURL, sceneName); // 获取城市详细信息
   ep.after('getDirInfoComplete', cityInfoEle.length, (dirInfos) => {
    const content = JSON.parse(fs.readFileSync(path.join(dirname, './imgs.json')));
    dirInfos.forEach((element) => {
     logger.info(`本条数据为:${JSON.stringify(element)}`);
     Object.assign(content, element);
    });
    fs.writeFileSync(path.join(dirname, './imgs.json'), JSON.stringify(content));
   });
  });
 });

Utilisez superagent pour demander la page Une fois la demande réussie, utilisez cheerio pour charger le contenu de la page, puis utilisez des règles de correspondance similaires à Jquery pour trouver les ressources de destination.

Plusieurs ressources sont chargées, utilisez eventproxy pour proxyer les événements, traitez une ressource et punissez un événement, et traitez les données une fois que tous les événements sont déclenchés.

Ce qui précède est le robot d'exploration le plus basique. Voici ensuite quelques domaines qui peuvent causer des problèmes ou nécessiter une attention particulière. . .

Lire et écrire des fichiers locaux

Créer un dossier

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

Lire et écrire des fichiers

   const content = JSON.parse(fs.readFileSync(path.join(dirname, './dir.json')));
   dirInfos.forEach((element) => {
    logger.info(`本条数据为:${JSON.stringify(element)}`);
    Object.assign(content, element);
   });
   fs.writeFileSync(path.join(dirname, './dir.json'), JSON.stringify(content));

Ressources de téléchargement par lots

Les ressources téléchargées peuvent inclure des images, de l'audio, etc.

Utilisez Bagpipe pour gérer la concurrence asynchrone. Reportez-vous à

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}`);
  });

pour télécharger des ressources et utiliser le flux pour terminer l'écriture du fichier.

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);
   });
  }
 });
}

Encodage

Parfois, le contenu Web traité directement à l'aide de cheerio.load s'avère être du texte codé après avoir été écrit dans le fichier. Vous pouvez transmettre

const $ = cheerio.load(buf, { decodeEntities: false });
pour désactiver l'encodage,

ps : la bibliothèque d'encodage et iconv-lite n'ont pas réussi à convertir les caractères codés en utf-8 en chinois. Il se peut que vous ne soyez pas familier avec l'API. faites-y attention plus tard.

Enfin, attachez une expression régulière qui correspond à toutes les balises dom

const reg = /<.*?>/g;
Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention à. d'autres articles connexes sur le site PHP chinois !

Lecture recommandée :

Explication détaillée de la façon d'utiliser le sélecteur de nom de classe jQuery (.class)

js encapsulé ajax fonction fonction Explication détaillée des étapes de mise en œuvre

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn