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!
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
中对于网站的请求,本身就存在http
和https
库,内部含有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
但是我想要的还有各个章节中的内容,这样一来就需要获取章节的超链接,组成超链接链表进去爬取
所以,这里就要介绍一个js的库了,cheerio
官方文档:https://cheerio.js.org/
中文文档:https://github.com/cheeriojs/cheerio/wiki/Chinese-README
在文档中,可以使用示例进行调试
cheerio解析html时,获取dom节点的方式与jquery
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 zuersttxt
als Textspeicherin node Für Website-Anfragen in
gibt es die Bibliotheken http
und https
, die die Anforderungsmethode request
enthalten. Beispiel:
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 handelt
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
Offizielle Dokumentation: https://cheerio.js.org/cheerio-Bibliothek
Hier ist also eine js-Bibliothek,cheerio
Chinesische Dokumentation: https://github.com/cheeriojs/cheerio/wiki/Chinese-README
In der Dokumentation können Sie mit Beispielen debuggen
< img src="https://img.php.cn/upload/image/790/128/668/165123677692831Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt" title="165123677692831Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt" alt="Beispiel für Knoten-Crawling-Daten: Lassen Sie uns darüber sprechen, wie man Romankapitel crawlt"/ >
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("启动了。。。"); })
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!