Heim  >  Artikel  >  Web-Frontend  >  Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt

Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt

青灯夜游
青灯夜游nach vorne
2022-05-02 10:00:173665Durchsuche

Wie crawlt der Knoten Daten? Der folgende Artikel wird Ihnen ein nodecrawler-Beispiel zeigen und darüber sprechen, wie Sie mit Node Romankapitel crawlen können. Ich hoffe, dass es für alle hilfreich ist!

Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt

Ich werde electron verwenden, um ein Roman-Lesetool zum Üben zu erstellen. Das erste, was gelöst werden muss, ist das Datenproblem, also der Text des Romans. electron制作一个小说阅读工具练练手,那么首先要解决的就是数据问题,也就是小说的文本。

这里准备使用nodejs对小说网站进行爬虫爬取,尝试爬下一本小说,数据就不存放数据库了,先使用txt作为文本存储

node中对于网站的请求,本身就存在httphttps库,内部含有request请求方法。

实例:

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

但是也就到此为止了,只是存取了一个html的文本数据,并不能够对内部元素进行提取之类的工作(也可以正则拿,但是太过复杂)。

我将访问到的数据通过fs.writeFile方法存储起来了,这只是整个网页的html

Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt

但是我想要的还有各个章节中的内容,这样一来就需要获取章节的超链接,组成超链接链表进去爬取

Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt

cheerio库

所以,这里就要介绍一个js的库了,cheerio

官方文档:https://cheerio.js.org/

中文文档:https://github.com/cheeriojs/cheerio/wiki/Chinese-README

在文档中,可以使用示例进行调试

Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt


使用cheerio解析HTML

cheerio解析html时,获取dom节点的方式与jquery

Hier werden wir

nodejs

verwenden, um die Roman-Website zu crawlen. Versuchen Sie, den nächsten Roman zu crawlen. Die Daten werden nicht in der Datenbank gespeichert. Verwenden Sie zuerst txt als Textspeicher

in node Für Website-Anfragen in gibt es die Bibliotheken http und https, die die Anforderungsmethode request enthalten.

Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawltBeispiel:

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')
})

Aber das ist es. Es greift nur auf die Textdaten eines html zu und kann die internen Elemente nicht extrahieren (Sie können auch reguläre Methoden verwenden, aber es ist zu kompliziert).

Ich habe die abgerufenen Daten über die Methode fs.writeFile gespeichert, bei der es sich lediglich um den HTML-Code der gesamten Webseite handeltBeispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt

Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt

Aber ich möchte auch den Inhalt in jedem Kapitel, also brauche ich die Kapitel-Hyperlinks, Erstellen Sie eine mit Hyperlinks verknüpfte Liste zum Crawlen

2. png

cheerio-Bibliothek

Hier ist also eine js-Bibliothek, cheerio

Offizielle Dokumentation: https://cheerio.js.org/

Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawltChinesische Dokumentation: https://github.com/cheeriojs/cheerio/wiki/Chinese-README


In der Dokumentation können Sie mit Beispielen debuggen

Verwenden Sie Cheerio, um HTML zu analysieren

Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawltWenn Cheerio HTML analysiert, ist die Methode zum Abrufen von Dom-Knoten dieselbe wie bei jquery-Ähnlichkeit.

Suchen Sie die gewünschten DOM-Knotendaten basierend auf dem HTML der Buch-Homepage, die Sie zuvor erhalten haben.

// 爬取某一章节的内容方法
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)

Drucken Sie die Informationen aus.

Sie können diese Informationen auch gleichzeitig speichern Anzahl der Kapitel und Kapitel Da die Links nun verfügbar sind, können Sie den Inhalt des Kapitels abrufen. 🎜🎜🎜Da für das Batch-Crawling am Ende ein IP-Proxy erforderlich ist, haben wir es hier noch nicht vorbereitet. Wir werden vorerst eine Methode schreiben, um den Inhalt eines bestimmten Kapitels des Romans abzurufen. 🎜🎜🎜Crawlen des Inhalts Ein bestimmtes Kapitel ist eigentlich relativ einfach: 🎜
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("启动了。。。");
})
🎜🎜🎜 🎜🎜Auf diese Weise können Sie eine Aufrufschnittstelle basierend auf der obigen Methode erstellen, verschiedene Kapitelparameter übergeben und die Daten des aktuellen Kapitels erhalten🎜rrreee🎜Effekt :🎜🎜🎜🎜🎜Jetzt ist eine einfache Kapitelsuchoberfläche fertig, und Sie können auch einige Parameter festlegen, die nicht beurteilt werden können. 🎜🎜Für verschiedene Datenschnittstellen sind auch die Crawler-Verarbeitungsmethoden unterschiedlich. In den gecrawlten Links wird der Inhalt jedoch nicht dynamisch vom Frontend gerendert, sodass Sie den statischen HTML-Code direkt crawlen können. Wenn es sich bei den Daten um eine über Ajax oder ähnliches erhaltene JSON-Zeichenfolge handelt, müssen die Daten über die Netzwerkschnittstelle angefordert werden. 🎜🎜Weitere Informationen zu Knoten finden Sie unter: 🎜nodejs-Tutorial🎜! 🎜

Das obige ist der detaillierte Inhalt vonBeispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen