Comment les nœuds explorent-ils les données ? L'article suivant partagera avec vous un exemple de nodecrawler et expliquera comment utiliser node pour explorer des chapitres de romans. J'espère que cela sera utile à tout le monde !
Je vais utiliser electron
pour créer un nouvel outil de lecture pour m'entraîner. La première chose à résoudre est le problème des données, c'est-à-dire le texte du roman. 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
pour explorer le site Web du roman, essayer d'explorer le prochain roman, les données ne seront pas stockées dans la base de données, utilisez d'abordtxt
comme stockage de textedans node Pour les requêtes de sites Web dans
, il existe des bibliothèques http
et https
, qui contiennent la méthode de requête request
. Exemple :
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') })
Mais c'est tout. Il accède uniquement aux données texte d'un html
, et ne peut pas extraire les éléments internes (vous pouvez aussi utiliser des méthodes régulières, mais c'est trop compliqué).
J'ai stocké les données consultées via la méthode fs.writeFile
, qui n'est que le code HTML de la page Web entière
Mais ce que je veux, c'est aussi le contenu de chaque chapitre, donc j'ai besoin d'obtenir les hyperliens du chapitre, former une liste de liens hypertexte à explorer
Documentation officielle : https://cheerio.js.org/bibliothèque Cheerio
Voici donc une bibliothèque js,cheerio
Documentation chinoise : https://github.com/cheeriojs/cheerio/wiki/Chinese-README
Dans la documentation, vous pouvez Déboguer avec des exemples
< img src="https://img.php.cn/upload/image/790/128/668/165123677692831Exemple de données dexploration de nœuds : parlons de la façon dexplorer de nouveaux chapitres" title="165123677692831Exemple de données dexploration de nœuds : parlons de la façon dexplorer de nouveaux chapitres" alt="Exemple de données dexploration de nœuds : parlons de la façon dexplorer de nouveaux chapitres"/ >
jquery
. Trouvez les données du nœud DOM souhaitées en fonction du code HTML de la page d'accueil du livre que vous avez obtenu auparavant
// 爬取某一章节的内容方法 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)
Imprimez les informations
Vous pouvez également stocker ces informations en même temps🎜🎜🎜🎜🎜🎜Maintenant, le nombre de chapitres et de chapitres Maintenant que les liens sont disponibles, vous pouvez obtenir le contenu du chapitre. 🎜🎜🎜Parce que l'exploration par lots nécessite finalement un proxy IP, nous ne l'avons pas encore préparé ici. Pour le moment, nous allons écrire une méthode pour obtenir le contenu d'un certain chapitre du roman🎜🎜🎜Explorer le contenu. d'un certain chapitre est en fait relativement simple : 🎜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("启动了。。。"); })
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!