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.
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
Tetapi ada perkara lain yang saya mahu Kandungan dalam bab, dengan cara ini, anda perlu mendapatkan hiperpautan bab, membentuk senarai pautan pautan dan merangkaknya
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
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
Maklumat ini juga boleh disimpan pada masa yang sama
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)
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:
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!