中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用 Node.js 開發資訊爬蟲流程

發布時間:2020-08-31 07:58:38 來源:腳本之家 閱讀:126 作者:mrr 欄目:web開發

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

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

爬蟲流程概括下來就是把目標網站的HTML下載到本地再進行數據提取。

一、下載頁面

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 。因為有很多網站是在客戶端渲染的,所以下載到的頁面不一定包含想要的HTML內容,我們可以使用 Google 的 puppeteer 來下載客戶端渲染的網站頁面。眾所周知的原因,在 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)
  }
 })
 }

當然客戶端渲染的頁面最好是直接使用接口請求的方式,這樣后面的HTML解析都不需要了,進行一下簡單的封裝,然后就可以像這樣使用了: #滑稽 :)

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

二、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
 }

三、定時任務

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

四、數據持久化

數據持久化理論上應該不屬于爬蟲關心的范圍,用 mongoose ,創建Model

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把項目clone下來看就好了。

總結

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

民权县| 聂荣县| 疏附县| 汝南县| 盐津县| 民权县| 盐城市| 丰镇市| 噶尔县| 桐乡市| 昂仁县| 凤台县| 潮安县| 建平县| 开封县| 长宁县| 廊坊市| 当涂县| 文登市| 繁昌县| 新乡市| 丹东市| 龙海市| 通山县| 横峰县| 宁津县| 河北区| 甘孜| 碌曲县| 新干县| 辉南县| 泗洪县| 融水| 汨罗市| 阿荣旗| 丹凤县| 监利县| 灯塔市| 河池市| 虎林市| 镇康县|