Maison >interface Web >js tutoriel >Partage de code de processus de robot d'exploration d'informations de développement Node.js

Partage de code de processus de robot d'exploration d'informations de développement Node.js

小云云
小云云original
2018-01-09 09:38:051253parcourir

Cet article présente principalement le processus de développement d'un robot d'exploration d'informations à l'aide de Node.js. Le processus du robot d'exploration peut être résumé comme le téléchargement du code HTML du site Web cible vers le site local, puis l'extraction des données. Veuillez vous référer à cet article pour plus de détails, j'espère qu'il pourra vous aider.

Récemment, le projet a besoin de quelques informations. Parce que le projet est écrit en Node.js, il est naturel d'utiliser Node.js pour écrire le robot

Adresse du projet : github.com/mrtanweijie. … , le projet a exploré le contenu informatif de Readhub, Open Source China, Developer Toutiao et 36Kr. Nous n'avons pas traité plusieurs pages pour le moment, car le robot s'exécutera une fois par jour. répondre aux besoins. , et sera amélioré ultérieurement

Le processus du robot d'exploration peut être résumé comme le téléchargement du code HTML du site Web cible vers le site local, puis l'extraction des données.

1. Page de téléchargement

Node.js possède de nombreuses bibliothèques de requêtes http, la requête est utilisée ici, le code principal est le suivant :

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

Utiliser Promesse d'empaquetage, afin que async/await puisse être utilisé plus tard. Étant donné que de nombreux sites Web sont rendus sur le client, les pages téléchargées ne contiennent pas nécessairement le contenu HTML souhaité. Nous pouvons utiliser le marionnettiste de Google pour télécharger les pages de sites Web rendues par le client. Comme nous le savons tous, lors de l'utilisation de npm i, puppeteer peut ne pas réussir à s'installer car il doit télécharger le noyau Chrome. Essayez simplement quelques fois de plus :)

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

Bien sûr, la page est rendue. par le client est le meilleur. Il s'agit d'utiliser directement la méthode de requête d'interface, de sorte que l'analyse HTML ultérieure ne soit pas nécessaire, et elle est simplement encapsulée, et elle peut ensuite être utilisée comme ceci : #Drôle :)

await new Downloader('http://36kr.com/newsflashes', DOWNLOADER.puppeteer).downloadHTML()

2. Extraction de contenu HTML

L'extraction de contenu HTML utilise bien sûr l'artefact cheerio qui expose la même interface que jQuery et est très simple à utiliser. Ouvrez la page F12 dans le navigateur pour afficher les nœuds des éléments de page extraits, puis extrayez le contenu selon vos besoins

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. Tâches planifiées

cron 每天跑一跑 
function job () {
 let cronJob = new cron.CronJob({
 cronTime: cronConfig.cronTime,
 onTick: () => {
  spider()
 },
 start: false
 })
 cronJob.start()
}

4 . Persistance des données

En théorie, la persistance des données ne devrait pas relever des préoccupations du robot d'exploration. Utilisez Mongoose pour créer un modèle

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)

Opérations de base

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

Informations

import BaseService from './BaseService'
import News from '../models/News'
class NewsService extends BaseService {}
export default new NewsService(News)

Enregistrez joyeusement les données

await newsService.batchSave(newsListTem)

Pour plus d'informations, clonez simplement le projet sur Github pour le voir.

Recommandations associées :

Tutoriel d'exemple de robot d'exploration de l'encyclopédie NodeJS

Problèmes liés à la résolution des problèmes de robot d'exploration

Implémentation nodeJS d'un exemple de code de fonction de robot d'exploration Web

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn