Maison > interface Web > js tutoriel > Comment implémenter un robot d'exploration d'informations à l'aide de Node.js (tutoriel détaillé)

Comment implémenter un robot d'exploration d'informations à l'aide de Node.js (tutoriel détaillé)

亚连
Libérer: 2018-06-13 14:15:08
original
1865 Les gens l'ont consulté

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

Le projet récent a besoin de quelques informations, car le projet est écrit en Node.js, il est donc naturel d'utiliser Node.js pour écrire le robot

Projet Adresse:github.com/mrtanweijie…, le projet explore le contenu informatif de Readhub, Open Source China, Developer Headlines et 36Kr Plusieurs pages ne sont pas traitées pour le moment, car le robot s'exécute une fois par jour, et maintenant il le fait. est obtenu à chaque fois Le dernier peut répondre aux besoins et peut être amélioré plus tard

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. 🎜>

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)
  }
  })
 })
 }
Copier après la connexion
Utilisez Promise pour l'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 plusieurs fois :)

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)
  }
 })
 }
Copier après la connexion
Bien sûr, il est préférable d'utiliser le noyau Chrome. page rendue directement par le client. La manière de demander l'interface, pour que l'analyse HTML ultérieure ne soit pas nécessaire, faites simplement une simple encapsulation, et vous pouvez ensuite l'utiliser comme ceci : #Drôle :)

await new Downloader('http://36kr.com/newsflashes', DOWNLOADER.puppeteer).downloadHTML()
Copier après la connexion

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 en fonction des 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
 }
Copier après la connexion

3. Tâches planifiées

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

4. Persistance des données

Théoriquement, la persistance des données ne devrait pas être du ressort des robots d'exploration. Utilisez mangouste 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)
Copier après la connexion
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
Copier après la connexion
Informations

import BaseService from './BaseService'
import News from '../models/News'
class NewsService extends BaseService {}
export default new NewsService(News)
Copier après la connexion
Enregistrez joyeusement les données

await newsService.batchSave(newsListTem)
Copier après la connexion
Pour plus de contenu, clonez simplement le projet sur Github pour le voir.

Résumé

Ce qui précède est ce que j'ai compilé pour vous. J'espère qu'il vous sera utile à l'avenir.

Articles connexes :

Comment créer un graphe dirigé par force d3 à l'aide de React (tutoriel détaillé)

Comment implémenter la messagerie instantanée utilisation de nodejs

À propos des problèmes d'axios liés à Vue.use

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal