Maison > interface Web > js tutoriel > le corps du texte

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

php中世界最好的语言
Libérer: 2018-05-21 15:30:12
original
1536 Les gens l'ont consulté

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;
Copier après la connexion

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));
   });
  });
 });
Copier après la connexion

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;
}
Copier après la connexion

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));
Copier après la connexion

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}`);
  });
Copier après la connexion

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);
   });
  }
 });
}
Copier après la connexion

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 });
Copier après la connexion
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;
Copier après la connexion
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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal