Heim > Artikel > Web-Frontend > So verwenden Sie den NodeJs-Crawler
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!