ノードはどのようにデータをクロールしますか?次の記事では、node クローラーの例を紹介し、node を使用して小説の章をクロールする方法について説明します。
electron
を使用して、練習用の新しい読書ツールを作成します。最初に解決するのはデータの問題です。小説の本文。
ここでは、nodejs を使用して小説 Web サイトをクロールします。次の小説をクロールしてみます。データはデータベースに保存されません。最初に txt## を使用します。 # テキスト ストレージとして使用します
node の Web サイト リクエストの場合、
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 メソッドを通じて保存しました。これは Web ページ全体の単なる HTML です。
ドキュメントでは、デバッグ用の例を使用できます
##cheerio を使用して HTML を解析するcheerio が HTML を解析する場合、dom ノードを取得する方法は
jquery## と似ています。 #。
以前に取得した書籍のホームページの HTML に基づいて必要な dom ノード データを見つけます
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') })
#章の数と章へのリンクが表示されたので、章の内容を取得できます。
バッチクローリングは最終的にIPプロキシが必要なのでまだ準備ができていませんが、とりあえず小説のとある章の内容を取得するメソッドを書きます特定の章をクロールする 内容は実際には比較的単純です:
// 爬取某一章节的内容方法 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)
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("启动了。。。"); })
これで、シンプルなチャプタ検索インターフェイスが準備できました。パラメータの判定も可能です。
データインターフェースが異なれば、クローラーの処理方法も異なりますが、今回クロールしたリンクでは、コンテンツの表示がフロントエンドによって動的にレンダリングされないため、静的なHTMLを直接クロールできます。 。 できる。データが Ajax またはその他のメソッドを通じて取得された json 文字列である場合、データはネットワーク インターフェイスを通じてリクエストする必要があります。
ノード関連の知識の詳細については、を参照してください。
以上がノードクローリングデータの例: 小説の章をクロールする方法について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。