>  기사  >  웹 프론트엔드  >  Node.js 개발 정보 크롤러 프로세스 코드 공유

Node.js 개발 정보 크롤러 프로세스 코드 공유

小云云
小云云원래의
2018-01-09 09:38:051218검색

이 글에서는 Node.js를 활용하여 정보 크롤러를 개발하는 과정을 주로 소개합니다. 크롤러 과정은 대상 웹사이트의 HTML을 로컬에 다운로드한 후 데이터를 추출하는 것으로 요약할 수 있습니다. 구체적인 내용은 이 글을 참고해 주시길 바라며, 도움이 되셨으면 좋겠습니다.

최근에는 프로젝트에 몇 가지 정보가 필요합니다. 프로젝트가 Node.js로 작성되었으므로 Node.js를 사용하여 크롤러를 작성하는 것이 당연합니다.

프로젝트 주소: github.com/mrtanweijie…, 프로젝트는 Readhub를 크롤링합니다. Open Source China, 개발자 Toutiao 및 36Kr 웹사이트의 정보 콘텐츠는 크롤러가 하루에 한 번 실행되므로 현재 최신 정보를 얻을 때마다 수요를 충족할 수 있으므로 여러 페이지에 대해 처리되지 않습니다. 추후 개선될 예정입니다

크롤러 프로세스는 대상 웹사이트의 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)
  }
  })
 })
 }

나중에 async/await를 사용할 수 있도록 Promise를 패키징에 사용합니다. 많은 웹사이트가 클라이언트에서 렌더링되기 때문에 다운로드한 페이지에 원하는 HTML 콘텐츠가 반드시 포함되지 않을 수도 있습니다. Google의 인형극을 사용하여 클라이언트에서 렌더링된 웹사이트 페이지를 다운로드할 수 있습니다. 우리 모두 알고 있듯이 npm i를 사용할 때 puppeteer는 Chrome 커널을 다운로드해야 하기 때문에 설치에 실패할 수 있습니다. 몇 번만 더 시도해 보세요. :)

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

물론, puppeteer에 대한 인터페이스 요청 방법을 직접 사용하는 것이 가장 좋습니다. 이렇게 하면 후속 HTML 구문 분석이 필요하지 않습니다. 간단히 캡슐화한 다음 다음과 같이 사용할 수 있습니다. # funny:)

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

2. HTML 콘텐츠 추출

HTML 콘텐츠 추출 물론 아티팩트인 Cherio, Cherio를 사용하고 있습니다. 이는 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. 데이터 지속성

이론적으로 데이터 지속성은 내부에 있어서는 안 됩니다. 크롤러의 관심 범위는 몽구스를 사용하여 모델을 생성합니다.

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 백과사전 크롤러 예제 튜토리얼

크롤러 문제 해결을 위한 관련 문제

nodeJS 웹 크롤러 기능 예제 코드 구현

위 내용은 Node.js 개발 정보 크롤러 프로세스 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.