ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js を使用して情報クローラーを実装する方法 (詳細なチュートリアル)
この記事では、Node.js を使用して情報クローラーを開発するプロセスを主に紹介します。クローラーのプロセスは、ターゲット Web サイトの HTML をローカルにダウンロードし、データを抽出することとして要約できます。具体的な内容についてはこちらの記事を参照してください
最近のプロジェクトはNode.jsで書かれているため、いくつかの情報が必要です
プロジェクトアドレス: github.com/ mrtanweijie… 、このプロジェクトは、Readhub、Open Source China、Developer Toutiao、および 36Kr の情報コンテンツをクロールします。クローラーは 1 日に 1 回実行されるため、現時点では複数のページを処理しません。クローラーのプロセスは、ターゲット Web サイトの HTML をローカルにダウンロードしてからデータを抽出することとして要約できます。
1. ダウンロードページNode.jsには多くのhttpリクエストライブラリがあり、ここではリクエストが使用されており、メインコードは次のとおりです:
requestDownloadHTML () { const options = { url: this.url, headers: { 'User-Agent': this.randomUserAgent() } } return new Promise((resolve, reject) => { request(options, (err, response, body) => { if (!err && response.statusCode === 200) { return resolve(body) } else { return reject(err) } }) }) }
パッケージ化にはPromiseを使用し、async/awaitが使用できるようにします後で。多くの Web サイトはクライアントでレンダリングされるため、ダウンロードされたページには必ずしも必要な HTML コンテンツが含まれるとは限りません。Google のパペッティアを使用して、クライアントでレンダリングされた Web サイトのページをダウンロードできます。ご存知のとおり、npm i を使用すると、Chrome カーネルをダウンロードする必要があるため、puppeteer のインストールに失敗する可能性があります。もう少し試してみてください:)
puppeteerDownloadHTML () { return new Promise(async (resolve, reject) => { try { const browser = await puppeteer.launch({ headless: true }) const page = await browser.newPage() await page.goto(this.url) const bodyHandle = await page.$('body') const bodyHTML = await page.evaluate(body => body.innerHTML, bodyHandle) return resolve(bodyHTML) } catch (err) { console.log(err) return reject(err) } }) }
もちろん、クライアントのインターフェイス リクエスト メソッドを直接使用するのが最善です。 -レンダリングされたページなので、その後の HTML 解析は必要ありません。単純なカプセル化を行うだけで、次のように使用できます。 #Funny:)
await new Downloader('http://36kr.com/newsflashes', DOWNLOADER.puppeteer).downloadHTML()
2. HTML コンテンツの抽出もちろん、アーティファクト Cheerio は HTML コンテンツを抽出するために使用され、cheerio は jQuery と同じインターフェイスを公開しており、非常に簡単に使用できます。ブラウザでページ F12 を開き、抽出されたページ要素ノードを表示し、必要に応じてコンテンツを抽出します
readHubExtract () { let nodeList = this.$('#itemList').find('.enableVisited') nodeList.each((i, e) => { let a = this.$(e).find('a') this.extractData.push( this.extractDataFactory( a.attr('href'), a.text(), '', SOURCECODE.Readhub ) ) }) return this.extractData }
3. スケジュールされたタスク cron 每天跑一跑
function job () {
let cronJob = new cron.CronJob({
cronTime: cronConfig.cronTime,
onTick: () => {
spider()
},
start: false
})
cronJob.start()
}
4. データの永続性 理論データ永続性 クローラーの問題の範囲内ではないはずです。 mongoose を使用してモデルを作成します
import mongoose from 'mongoose' const Schema = mongoose.Schema const NewsSchema = new Schema( { title: { type: 'String', required: true }, url: { type: 'String', required: true }, summary: String, recommend: { type: Boolean, default: false }, source: { type: Number, required: true, default: 0 }, status: { type: Number, required: true, default: 0 }, createdTime: { type: Date, default: Date.now } }, { collection: 'news' } ) export default mongoose.model('news', NewsSchema)
基本操作
import { OBJ_STATUS } from '../../Constants' class BaseService { constructor (ObjModel) { this.ObjModel = ObjModel } saveObject (objData) { return new Promise((resolve, reject) => { this.ObjModel(objData).save((err, result) => { if (err) { return reject(err) } return resolve(result) }) }) } } export default BaseService
情報
import BaseService from './BaseService' import News from '../models/News' class NewsService extends BaseService {} export default new NewsService(News)
データを保存してください
await newsService.batchSave(newsListTem)
詳細については、Github にアクセスしてプロジェクトをクローンして確認してください。それ。
まとめ
以上、皆様の参考になれば幸いです。
関連記事:
react を使用して d3 強制有向グラフを構築する方法 (詳細なチュートリアル) nodejs を使用してインスタント メッセージングを実装する方法 axios での Vue.use についての質問以上がNode.js を使用して情報クローラーを実装する方法 (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。