Rumah  >  Artikel  >  hujung hadapan web  >  Contoh data rangkak nod: Mari kita bincangkan tentang cara merangkak bab novel

Contoh data rangkak nod: Mari kita bincangkan tentang cara merangkak bab novel

青灯夜游
青灯夜游ke hadapan
2022-05-02 10:00:173756semak imbas

Bagaimanakah data merangkak nod? Artikel berikut akan berkongsi dengan anda contoh perangkak nod dan bercakap tentang cara menggunakan nod untuk merangkak bab novel saya harap ia akan membantu semua orang.

Contoh data rangkak nod: Mari kita bincangkan tentang cara merangkak bab novel

Jika anda akan menggunakan electron untuk membuat alat bacaan novel untuk diamalkan, perkara pertama yang perlu diselesaikan ialah masalah data, iaitu teks novel.

Di sini kita akan menggunakan nodejs untuk merangkak laman web novel, cuba merangkak novel seterusnya, data tidak akan disimpan dalam pangkalan data, mula-mula gunakan txt sebagai storan teks

Untuk permintaan tapak web dalam node, sudah ada perpustakaan http dan https, yang mengandungi kaedah permintaan request.

Contoh:

request = https.request(TestUrl, { encoding:'utf-8' }, (res)=>{
    let chunks = ''
    res.on('data', (chunk)=>{
        chunks += chunk
    })
    res.on('end',function(){
        console.log('请求结束');
    })
})

Tetapi itu sahaja Ia hanya mengakses data teks html dan tidak boleh mengekstrak elemen dalaman ( Anda juga boleh mendapatkannya dengan kerap, tetapi ia terlalu rumit) .

Saya menyimpan data yang diakses melalui kaedah fs.writeFile, iaitu hanya html keseluruhan halaman web

Contoh data rangkak nod: Mari kita bincangkan tentang cara merangkak bab novel

Tetapi ada perkara lain yang saya mahu Kandungan dalam bab, dengan cara ini, anda perlu mendapatkan hiperpautan bab, membentuk senarai pautan pautan dan merangkaknya

Contoh data rangkak nod: Mari kita bincangkan tentang cara merangkak bab novel

perpustakaan cheerio

Jadi, di sini kami akan memperkenalkan perpustakaan js, cheerio

Dokumen rasmi: https://cheerio.js.org/

Dokumen Cina : https: //github.com/cheeriojs/cheerio/wiki/Chinese-README

Dalam dokumentasi, anda boleh menggunakan contoh untuk nyahpepijat

Contoh data rangkak nod: Mari kita bincangkan tentang cara merangkak bab novel


Gunakan cheerio untuk menghuraikan HTML

Apabila cheerio menghuraikan html, kaedah mendapatkan nod dom adalah serupa dengan jquery.

Cari data nod DOM yang anda inginkan berdasarkan html halaman utama buku yang diperoleh sebelum ini

const fs = require('fs')
const cheerio = require('cheerio');

// 引入读取方法
const { getFile, writeFun } = require('./requestNovel')

let hasIndexPromise = getFile('./hasGetfile/index.html');

let bookArray = [];

hasIndexPromise.then((res)=>{
    let htmlstr = res;
    let $ = cheerio.load(htmlstr);

    $(".listmain dl dd a").map((index, item)=>{
        let name = $(item).text(), href = 'https://www.shuquge.com/txt/147032/' + $(item).attr('href')
        if (index > 11){
            bookArray.push({ name, href })
        }
        
    })
    // console.log(bookArray)
    writeFun('./hasGetfile/hrefList.txt', JSON.stringify(bookArray), 'w')
})

Cetak maklumat

Contoh data rangkak nod: Mari kita bincangkan tentang cara merangkak bab novel

Maklumat ini juga boleh disimpan pada masa yang sama

Contoh data rangkak nod: Mari kita bincangkan tentang cara merangkak bab novel


Sekarang nombor bab dan pautan bab tersedia, anda boleh mendapatkan kandungan bab.

Oleh kerana merangkak batch akhirnya memerlukan proksi IP, kami belum bersedia buat sementara waktu, kami akan menulis kaedah untuk mendapatkan kandungan bab tertentu dalam novel

Merangkak bab tertentu Kandungan sebenarnya agak mudah:

// 爬取某一章节的内容方法
function getOneChapter(n) {
    return new Promise((resolve, reject)=>{
        if (n >= bookArray.length) {
            reject('未能找到')
        }
        let name = bookArray[n].name;
        request = https.request(bookArray[n].href, { encoding:'gbk' }, (res)=>{
            let html = ''
            res.on('data', chunk=>{
                html += chunk;
            })
            res.on('end', ()=>{           
                let $ = cheerio.load(html);
                let content = $("#content").text();
                if (content) {
                    // 写成txt
                    writeFun(`./hasGetfile/${name}.txt`, content, 'w')
                    resolve(content);
                } else {
                    reject('未能找到')
                }
            })
        })
        request.end();
    })
}

getOneChapter(10)

Contoh data rangkak nod: Mari kita bincangkan tentang cara merangkak bab novel


Dengan cara ini, anda boleh mencipta antara muka panggilan berdasarkan kaedah di atas dan lulus dalam parameter bab yang berbeza Dapatkan data bab semasa

const express = require('express'); 
const IO = express();
const { getAllChapter, getOneChapter } = require('./readIndex')
// 获取章节超链接链表
getAllChapter();

IO.use('/book',function(req, res) {
    // 参数
    let query = req.query;
    if (query.n) {
        // 获取某一章节数据
        let promise = getOneChapter(parseInt(query.n - 1));
        promise.then((d)=>{
            res.json({ d: d })
        }, (d)=>{
            res.json({ d: d })
        })
    } else {
        res.json({ d: 404 })
    }
    
})

//服务器本地主机的数字
IO.listen('7001',function(){
    console.log("启动了。。。");
})

Kesan:

Contoh data rangkak nod: Mari kita bincangkan tentang cara merangkak bab novel

Kini, antara muka carian bab yang mudah. sudah sedia, dan beberapa parameter juga boleh dibuat Di luar pertimbangan.

Untuk antara muka data yang berbeza, kaedah pemprosesan perangkak juga berbeza Walau bagaimanapun, dalam pautan yang dirangkak kali ini, paparan kandungan tidak dipaparkan secara dinamik oleh bahagian hadapan, jadi anda boleh merangkak terus html statik. Boleh. Jika data adalah rentetan json yang diperolehi melalui Ajax atau seumpamanya, maka data mesti diminta melalui antara muka rangkaian.

Untuk lebih banyak pengetahuan berkaitan nod, sila lawati: tutorial nodejs!

Atas ialah kandungan terperinci Contoh data rangkak nod: Mari kita bincangkan tentang cara merangkak bab novel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam