Heim > Artikel > Web-Frontend > Der Code-Sharing des Node.js-Entwicklungsinformations-Crawlers
In diesem Artikel wird hauptsächlich der Prozess der Entwicklung eines Informations-Crawlers mit Node.js vorgestellt. Der Crawler-Prozess kann als Herunterladen des HTML-Codes der Zielwebsite auf die lokale Website und anschließendes Extrahieren der Daten zusammengefasst werden. Weitere Informationen finden Sie in diesem Artikel. Ich hoffe, er kann Ihnen helfen.
Vor Kurzem benötigt das Projekt einige Informationen. Da das Projekt in Node.js geschrieben ist, ist es selbstverständlich, Node.js zum Schreiben des Crawlers zu verwenden.
Projektadresse: github.com/mrtanweijie … Das Projekt hat den Informationsinhalt von Readhub, Open Source China, Developer Toutiao und 36Kr gecrawlt. Es hat vorerst nicht mehrere Seiten verarbeitet, da der Crawler jetzt jeden Tag ausgeführt werden kann erhält die neueste Version und wird später verbessert
Der Crawler-Prozess kann als Herunterladen des HTML-Codes der Zielwebsite auf die lokale Website und anschließendes Extrahieren der Daten zusammengefasst werden.
1. Download-Seite
Node.js verfügt über viele HTTP-Anforderungsbibliotheken. Hier wird die Anforderung verwendet. Der Hauptcode lautet wie folgt:
requestDownloadHTML () { const options = { url: this.url, headers: { 'User-Agent': this.randomUserAgent() } } return new Promise((resolve, reject) => { request(options, (err, response, body) => { if (!err && response.statusCode === 200) { return resolve(body) } else { return reject(err) } }) }) }
Verwendung Versprechen Sie die Verpackung, damit async/await später verwendet werden kann. Da viele Websites auf dem Client gerendert werden, enthalten die heruntergeladenen Seiten möglicherweise nicht unbedingt den gewünschten HTML-Inhalt. Wir können den Puppenspieler von Google verwenden, um vom Client gerenderte Website-Seiten herunterzuladen. Wie wir alle wissen, schlägt die Installation von Puppeteer möglicherweise fehl, da der Chrome-Kernel heruntergeladen werden muss :)
puppeteerDownloadHTML () { return new Promise(async (resolve, reject) => { try { const browser = await puppeteer.launch({ headless: true }) const page = await browser.newPage() await page.goto(this.url) const bodyHandle = await page.$('body') const bodyHTML = await page.evaluate(body => body.innerHTML, bodyHandle) return resolve(bodyHTML) } catch (err) { console.log(err) return reject(err) } }) }
Natürlich wurde die Seite gerendert Vom Client aus ist es am besten, die Schnittstellenanforderungsmethode direkt zu verwenden, sodass keine anschließende HTML-Analyse erforderlich ist. Sie wird einfach gekapselt und kann dann wie folgt verwendet werden: #Funny:)
await new Downloader('http://36kr.com/newsflashes', DOWNLOADER.puppeteer).downloadHTML()
2. HTML-Inhaltsextraktion
HTML-Inhaltsextraktion erfolgt natürlich über das Artefakt cheerio, stellt die gleiche Schnittstelle wie jQuery zur Verfügung und ist sehr einfach zu verwenden. Öffnen Sie die Seite F12 im Browser, um die extrahierten Seitenelementknoten anzuzeigen, und extrahieren Sie dann den Inhalt entsprechend Ihren Anforderungen
readHubExtract () { let nodeList = this.$('#itemList').find('.enableVisited') nodeList.each((i, e) => { let a = this.$(e).find('a') this.extractData.push( this.extractDataFactory( a.attr('href'), a.text(), '', SOURCECODE.Readhub ) ) }) return this.extractData }
3. Geplante Aufgaben
cron 每天跑一跑 function job () { let cronJob = new cron.CronJob({ cronTime: cronConfig.cronTime, onTick: () => { spider() }, start: false }) cronJob.start() }
4 . Datenpersistenz
Theoretisch sollte die Datenpersistenz nicht in den Geltungsbereich des Crawlers fallen. Verwenden Sie Mungo, um ein Modell zu erstellen
import mongoose from 'mongoose' const Schema = mongoose.Schema const NewsSchema = new Schema( { title: { type: 'String', required: true }, url: { type: 'String', required: true }, summary: String, recommend: { type: Boolean, default: false }, source: { type: Number, required: true, default: 0 }, status: { type: Number, required: true, default: 0 }, createdTime: { type: Date, default: Date.now } }, { collection: 'news' } ) export default mongoose.model('news', NewsSchema)
Grundlegende Vorgänge
import { OBJ_STATUS } from '../../Constants' class BaseService { constructor (ObjModel) { this.ObjModel = ObjModel } saveObject (objData) { return new Promise((resolve, reject) => { this.ObjModel(objData).save((err, result) => { if (err) { return reject(err) } return resolve(result) }) }) } } export default BaseService
Informationen
import BaseService from './BaseService' import News from '../models/News' class NewsService extends BaseService {} export default new NewsService(News)
Fröhliches Speichern von Daten
await newsService.batchSave(newsListTem)
Für weitere Informationen klonen Sie einfach das Projekt auf Github, um es anzuzeigen.
Verwandte Empfehlungen:
NodeJS Encyclopedia Crawler Beispiel-Tutorial
Verwandte Probleme bei der Lösung von Crawler-Problemen
NodeJS-Implementierung des Beispielcodes für die Webcrawler-Funktion
Das obige ist der detaillierte Inhalt vonDer Code-Sharing des Node.js-Entwicklungsinformations-Crawlers. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!