ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js開発情報クローラプロセスのコード共有

Node.js開発情報クローラプロセスのコード共有

小云云
小云云オリジナル
2018-01-09 09:38:051256ブラウズ

この記事では、Node.js を使用して情報クローラーを開発するプロセスを主に紹介します。クローラーのプロセスは、ターゲット Web サイトの HTML をローカルにダウンロードし、データを抽出することとして要約できます。具体的な内容についてはこちらの記事をご参照ください。お役に立てれば幸いです。

最近、プロジェクトは Node.js で書かれているので、Node.js を使ってクローラーを書くのが自然です

プロジェクトのアドレス: github.com/mrtanweijie…、プロジェクトは Readhub をクロールします。オープンソース中国、開発者 Toutiao、および 36Kr の Web サイトの情報コンテンツは、現時点では複数のページに対して処理されていません。これは、クローラーが 1 日に 1 回実行されるため、最新の情報を取得するたびに需要を満たすことができるためです。後で改善されます

クローラーのプロセスは、ターゲット Web サイトの HTML をローカル コンピューターにダウンロードし、データを抽出することとして要約できます。

1. ダウンロードページ

Node.js には多くの http リクエスト ライブラリがあり、ここでは request が使用されます。メインのコードは次のとおりです:

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

後で async/await を使用できるように、パッケージ化に Promise を使用します。多くの 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 解析は必要ありません。単純なカプセル化を行うだけで、次のように使用できます。 # 面白い:)

await new Downloader('http://36kr.com/newsflashes', DOWNLOADER.puppeteer).downloadHTML()

2. HTML コンテンツの抽出

HTML コンテンツの抽出もちろん、アーティファクト Cheerio を使用しています。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 上のプロジェクトをクローンするだけで表示されます。

関連する推奨事項:

NodeJS Encyclopedia クローラーのサンプル チュートリアル

クローラーの問題を解決するための関連問題

Web クローラー関数のサンプル コードの nodeJS 実装

以上がNode.js開発情報クローラプロセスのコード共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。