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 });
const reg = /<.*?>/g;
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!