Une pratique du robot d'exploration node.js

Pratique du robot d'exploration Node.js

Le système complet de Kitten a besoin d'informations sur les données sur la maladie, il décide donc d'explorer les données pertinentes d'un certain site Web médical.

Lorsque Kitty a utilisé python pour apprendre l'exploration, cette fois j'ai décidé d'essayer node.js.

Tout d'abord, parlons des bibliothèques nécessaires pour créer un robot simple avec node

  • request: utilisé pour la requête http
  • iconv-lite: utilisé pour convertir le codage des caractères
  • cheerio: utilisé pour analyser le HTML,
  • node-xlsx: générer des fichiers Excel à partir de données

Un simple robot d'exploration explore en fait des pages Web, analyse des données et stocke des données.

Kitten utilise la requête pour obtenir des pages Web, bien sûr, il peut également choisir d'autres méthodes, telles que le module http fourni avec node. Étant donné que le codage des caractères de la page Web explorée par les chatons est «gb2312», il est converti en utf8 à l'aide de iconv-lite. Et il convient de noter qu'il existe un codage par défaut lorsque la demande ne passe pas le champ de codage, de sorte que les {encoding: null}paramètres d' entrée doivent être supprimés du format par défaut iconv-lite pour prendre effet.

const request = require('request');
const iconv = require('iconv-lite');

// 获得html
const requestPromise = (url)=>{
    
    
    return new Promise((resolve,reject)=>{
    
    
        request(url,{
    
    encoding: null}, (error, response, body)=>{
    
    
            if(response.statusCode === 200) {
    
    
                 //  编码格式转换 ,{encoding: null}解除默认格式
                const bufs = iconv.decode(body, 'gb2312')
                const html = bufs.toString('utf8')
                resolve(html)
            }else {
    
    
                reject()
            }
        })
    })
    
}

Après avoir obtenu le code HTML, utilisez le cheerio.loadcode HTML d'analyse. cheerio.loadLes utilisateurs peuvent obtenir les éléments qu'ils souhaitent via jquery, comme $('.class').text()obtenir du texte.

Après avoir organisé les données acquises, utilisez node-xlsx pour xlsx.buildcréer un tampon, et enfin utilisez le système de fichiers fs de node pour écrire le fichier.

const cheerio = require('cheerio');
var fs = require('fs');
var xlsx = require('node-xlsx');
// 解析数据
const getData = async(url) =>{
    
    
    const html = await requestPromise(url)
    const $ = cheerio.load(html) // 解析html
    // 疾病名称
    var disease = $('body > div.wrap.mt10.clearfix.graydeep > div.main-sub.fl > div.jib-janj.bor.clearfix > div.jib-articl.fr.f14 > div.jib-articl-con.jib-lh-articl > strong').text()
    
    // 存进excel
    var buffer = xlsx.build([
        {
    
    
            name:'sheet1',
            data:[[disease]]
        }        
    ]);
    fs.writeFileSync('diseaseData.xlsx',buffer);
}

Ce qui suit est le code de démonstration complet, dans lequel une partie du traitement des données est omise, seul un champ de maladie est réservé et l'URL spécifique est masquée.

const request = require('request');
const iconv = require('iconv-lite');
const cheerio = require('cheerio');
var fs = require('fs');
var xlsx = require('node-xlsx');
// 获得html
const requestPromise = (url)=>{
    
    
    return new Promise((resolve,reject)=>{
    
    
        request(url,{
    
    encoding: null}, (error, response, body)=>{
    
    
            if(response.statusCode === 200) {
    
    
                 //  编码格式转换 ,{encoding: null}解除默认格式
                const bufs = iconv.decode(body, 'gb2312')
                const html = bufs.toString('utf8')
                resolve(html)
            }else {
    
    
                reject()
            }
        })
    })
    
}
// 解析数据
const getData = async(url) =>{
    
    
    const html = await requestPromise(url)
    const $ = cheerio.load(html) // 解析html
    // 疾病名称
    var disease = $('body > div.wrap.mt10.clearfix.graydeep > div.main-sub.fl > div.jib-janj.bor.clearfix > div.jib-articl.fr.f14 > div.jib-articl-con.jib-lh-articl > strong').text()
    
    // 存进excel
    var buffer = xlsx.build([
        {
    
    
            name:'sheet1',
            data:[[disease]]
        }        
    ]);
    // fs.appendFileSync('diseaseData.xlsx',buffer);
    fs.writeFileSync('diseaseData.xlsx',buffer);
}


// 循环存入url,并进行数据请求
var urls = []
for (let i = 50; i<53;i++) {
    
    
    const url = `http://xxx/${
      
      i}.htm`
    urls.push(url)
}
// 等待一个请求处理结束后再进行第二次请求
urls.reduce((rs,url)=>{
    
    
    return rs.then(res => {
    
    
        return new Promise(async (resolve)=>{
    
    
            await getData(url)
            resolve()
        })
    })
},Promise.resolve())

Deux remarques:

  • Pourquoi utiliser réduire et promettre au lieu de directement dans la boucle for getData(url)?

    En tant qu'accumulateur, la méthode de réduction peut transmettre le dernier résultat du calcul du tableau à l'élément suivant. Le second paramètre accepte Promise.resolve()la valeur initiale. Dans la fonction de rappel, uniquement lorsqu'une demande et un traitement de données sont terminés et que resol () passe à le traitement de l'élément suivant, afin que les URL du tableau puissent être demandées une par une pour éviter de mettre beaucoup de pression sur le serveur.

  • L'utilisation fs.writeFileSyncécrasera le fichier existant, et le fichier supplémentaire devrait être utilisé appendFileSync, mais dans ce cas, nous avons un problème

    Au début, je voulais utiliser appendFileSyncpour ajouter des données pour exceller, mais le fichier généré montrait toujours une corruption, ce qui semble être une erreur d'écriture. La cause du problème n'a pas été trouvée. Parce que ce n'est pas la tâche principale du chaton cette fois, il a décidé de laisser d'abord un trou. Plus tard, en raison de la pression du temps, j'ai choisi de stocker la bonne quantité de données dans un tableau, puis de l'utiliser pour writeFileSyncgénérer plusieurs excels, et enfin de fusionner plusieurs tables dans le logiciel Excel à la fois.

    Au total, plus de 10 000 éléments de données ont été collectés cette fois et finalement une photo a été publiée.

Je suppose que tu aimes

Origine blog.csdn.net/qq_44041514/article/details/114386300
conseillé
Classement