Heim  >  Artikel  >  Web-Frontend  >  So verwenden Sie den NodeJs-Crawler

So verwenden Sie den NodeJs-Crawler

php中世界最好的语言
php中世界最好的语言Original
2018-05-30 09:56:161796Durchsuche

Dieses Mal zeige ich Ihnen, wie Sie den NodeJs-Crawler verwenden. Was sind die Vorsichtsmaßnahmen bei der Verwendung des NodeJs-Crawlers?

Hintergrund

Vor kurzem habe ich vor, die NodeJs-bezogenen Inhalte, die ich zuvor gesehen habe, zu überprüfen und ein paar Crawler zu schreiben, um Langeweile zu vertreiben, und ich habe einige währenddessen entdeckt Fragen zum Crawling-Prozess, notieren Sie sie zum späteren Nachschlagen.

Abhängigkeit

verwendet die im Internet beliebte Cheerio-Bibliothek zur Verarbeitung von gecrawlten Inhalten, Superagent wird zur Verarbeitung von Anfragen verwendet und log4js wird zum Aufzeichnen von Protokollen verwendet.

Protokollkonfiguration

Es gibt nicht viel zu sagen, gehen wir direkt zum 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;

Das Obige exportiert direkt ein Logger-Objekt und ruft den Logger auf direkt in der Geschäftsdatei Verwenden Sie einfach .info() und andere Funktionen, um Protokollinformationen hinzuzufügen, und Protokolle werden täglich generiert. Es gibt viele relevante Informationen im Internet.

Crawlen Sie den Inhalt und verarbeiten Sie ihn

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

Verwenden Sie Superagent, um die Seite anzufordern. Nachdem die Anfrage erfolgreich war, laden Sie den Seiteninhalt mit Cheerio und verwenden Sie dann Matching Regeln ähnlich wie Jquery, um die Zielressource zu finden.

Mehrere Ressourcen werden geladen, Eventproxy wird verwendet, um Ereignisse zu vertreten, eine Ressource zu verarbeiten und ein Ereignis zu bestrafen und die Daten zu verarbeiten, nachdem alle Ereignisse ausgelöst wurden.

Das Obige ist der grundlegendste Crawler. Als nächstes sind einige Bereiche aufgeführt, die Probleme verursachen können oder besondere Aufmerksamkeit erfordern. . .

Lokale Dateien lesen und schreiben

Ordner erstellen

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

Dateien lesen und schreiben

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

Batch-Download-Ressourcen

Heruntergeladene Ressourcen können Bilder, Audio usw. enthalten.

Verwenden Sie Bagpipe, um die asynchrone Parallelität zu handhaben. Weitere Informationen finden Sie unter

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

, um Ressourcen herunterzuladen und den Stream zum Abschließen des Dateischreibens zu verwenden.

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

Kodierung

Manchmal stellt sich heraus, dass der direkt mit cheerio.load verarbeitete Webinhalt nach dem Schreiben in die Datei codierter Text ist. Sie können

const $ = cheerio.load(buf, { decodeEntities: false });
um die Kodierung zu deaktivieren,

ps: Die Kodierungsbibliothek und iconv-lite konnten utf-8-kodierte Zeichen nicht in Chinesisch konvertieren. Möglicherweise sind Sie mit der API nicht vertraut später.

Fügen Sie abschließend einen regulären Ausdruck hinzu, der mit allen Dom-Tags übereinstimmt.

const reg = /<.*?>/g;
Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln Artikel auf der chinesischen PHP-Website!

Empfohlene Lektüre:

Wie man mit js Ajax-Funktionen und -Nutzung kapselt

Detaillierte Erläuterung der Verwendung von Common integrierte Funktionen in JS

Das obige ist der detaillierte Inhalt vonSo verwenden Sie den NodeJs-Crawler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn