麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

使用 Node.js 開發(fā)資訊爬蟲流程

2019-11-19 14:34:36
字體:
供稿:網(wǎng)友

最近項目需要一些資訊,因為項目是用 Node.js 來寫的,所以就自然地用 Node.js 來寫爬蟲了

項目地址:github.com/mrtanweijie… ,項目里面爬取了 Readhub 、 開源中國 、 開發(fā)者頭條 、 36Kr 這幾個網(wǎng)站的資訊內(nèi)容,暫時沒有對多頁面進行處理,因為每天爬蟲都會跑一次,現(xiàn)在每次獲取到最新的就可以滿足需求了,后期再進行完善

爬蟲流程概括下來就是把目標網(wǎng)站的HTML下載到本地再進行數(shù)據(jù)提取。

一、下載頁面

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

使用 Promise 來進行包裝,便于后面使用的時候用上 async/await 。因為有很多網(wǎng)站是在客戶端渲染的,所以下載到的頁面不一定包含想要的HTML內(nèi)容,我們可以使用 Google 的 puppeteer 來下載客戶端渲染的網(wǎng)站頁面。眾所周知的原因,在 npm i 的時候 puppeteer 可能因為需要下載Chrome內(nèi)核導致安裝會失敗,多試幾次就好了:)

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

二、HTML內(nèi)容提取

HTML內(nèi)容提取當然是使用神器 cheerio 了, cheerio 暴露了和 jQuery 一樣的接口,用起來非常簡單。瀏覽器打開頁面 F12 查看提取的頁面元素節(jié)點,然后根據(jù)需求來提取內(nèi)容即可

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 }

三、定時任務

cron 每天跑一跑 function job () { let cronJob = new cron.CronJob({ cronTime: cronConfig.cronTime, onTick: () => {  spider() }, start: false }) cronJob.start()}

四、數(shù)據(jù)持久化

數(shù)據(jù)持久化理論上應該不屬于爬蟲關心的范圍,用 mongoose ,創(chuàng)建Model

import mongoose from 'mongoose'const Schema = mongoose.Schemaconst 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)

愉快地保存數(shù)據(jù)

await newsService.batchSave(newsListTem)

更多內(nèi)容到Github把項目clone下來看就好了。

總結(jié)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 蜜桃传媒视频麻豆第一区免费观看 | 18pao国产成人免费视频 | 日本免费a∨ | 成人午夜激情视频 | 国产深夜福利视频在线播放 | 激情久久婷婷 | 色中色激情影院 | 在线播放中文 | 天堂在线资源av | bt 自拍 另类 综合 欧美 | 国产成人羞羞视频在线 | 日本高清在线免费 | 久久久久久久久久久久99 | 国产亚洲精品久久久久婷婷瑜伽 | 99seav| 国产成人小视频在线观看 | 亚州视频在线 | 日本高清一级片 | 国产精品中文在线 | 5a级毛片 | 成人羞羞视频在线观看免费 | 中文字幕网址 | 羞羞的网址| 久久精品一区二区三区四区五区 | 免费看欧美一级特黄a大片 久久免费视频一区二区三区 | 成人免费一区二区三区在线观看 | 欧美大胆xxxx肉体摄影 | 久久精品视频3 | 一级α片免费看刺激高潮视频 | 欧美扩阴视频 | 欧美成人免费看 | 少妇一级淫片免费放播放 | 羞羞网站视频 | 91亚洲免费视频 | 日本a级免费 | 天海翼无删减av三级在线观看 | 久久精品com| 未成年人在线观看 | 手机免费看一级片 | 日韩伦理电影免费观看 | 国产精品99久久99久久久二 |