Heim  >  Artikel  >  Web-Frontend  >  Der Code-Sharing des Node.js-Entwicklungsinformations-Crawlers

Der Code-Sharing des Node.js-Entwicklungsinformations-Crawlers

小云云
小云云Original
2018-01-09 09:38:051201Durchsuche

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!

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