Heim > Web-Frontend > js-Tutorial > Hauptteil

So verwenden Sie den NodeJs-Crawler

php中世界最好的语言
Freigeben: 2018-05-30 09:56:16
Original
1819 Leute haben es durchsucht

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;
Nach dem Login kopieren

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));
   });
  });
 });
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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));
Nach dem Login kopieren

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}`);
  });
Nach dem Login kopieren

, 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);
   });
  }
 });
}
Nach dem Login kopieren

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 });
Nach dem Login kopieren
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;
Nach dem Login kopieren
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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage