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) } }) }) }
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) } }) }
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 en fonction des besoinsreadHubExtract () { 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
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)
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
import BaseService from './BaseService' import News from '../models/News' class NewsService extends BaseService {} export default new NewsService(News)
await newsService.batchSave(newsListTem)
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!