亚洲国产综合日韩AV在线|午夜精品视频在线观看一区|亚洲国产精品看片在线观看|av网站手机免费在线观看|综合免费一区二区|a级国产乱理伦片在线观看|在线欧美熟乱视频第一页

亚洲国产综合日韩AV在线|午夜精品视频在线观看一区|亚洲国产精品看片在线观看|av网站手机免费在线观看|综合免费一区二区|a级国产乱理伦片在线观看|在线欧美熟乱视频第一页

合肥做網(wǎng)站,選擇瘋狗科技,專(zhuān)業(yè)、敬業(yè)的合肥網(wǎng)絡(luò )公司
首頁(yè) > 網(wǎng)站技術(shù) > 詳情

使用 Node.js 開(kāi)發(fā)資訊爬蟲(chóng)流程

2018-01-10 14:22:56   來(lái)源:互聯(lián)網(wǎng)   瀏覽:  次
最近項目需要一些資訊,因為項目是用 Node js 來(lái)寫(xiě)的,所以就自然地用 Node js 來(lái)寫(xiě)爬蟲(chóng)了項目地址:github com mrtanweijie…,項目里面爬取了 Readhub 、 開(kāi)源中國 、 開(kāi)發(fā)者頭條 、 36Kr 這幾個(gè)網(wǎng)站的資訊內容

最近項目需要一些資訊,因為項目是用 Node.js 來(lái)寫(xiě)的,所以就自然地用 Node.js 來(lái)寫(xiě)爬蟲(chóng)了

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

爬蟲(chóng)流程概括下來(lái)就是把目標網(wǎng)站的HTML下載到本地再進(jìn)行數據提取。

一、下載頁(yè)面

Node.js 有很多http請求庫,這里使用 request ,主要代碼如下: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 來(lái)進(jìn)行包裝,便于后面使用的時(shí)候用上 async/await 。因為有很多網(wǎng)站是在客戶(hù)端渲染的,所以下載到的頁(yè)面不一定包含想要的HTML內容,我們可以使用 Google 的 puppeteer 來(lái)下載客戶(hù)端渲染的網(wǎng)站頁(yè)面。眾所周知的原因,在 npm i 的時(shí)候 puppeteer 可能因為需要下載Chrome內核導致安裝會(huì )失敗,多試幾次就好了:) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)
  }
 })
 }

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

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

二、HTML內容提取

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
 }

三、定時(shí)任務(wù)

1
2
3
4
5
6
7
8
9
10
11
cron 每天跑一跑
function job () {
 let cronJob = new cron.CronJob({
 cronTime: cronConfig.cronTime,
 onTick: () => {
  spider()
 },
 start: false
 })
 cronJob.start()
}

四、數據持久化

數據持久化理論上應該不屬于爬蟲(chóng)關(guān)心的范圍,用 mongoose ,創(chuàng )建Model 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)

基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

資訊

1
2
3
4
import BaseService from './BaseService'
import News from '../models/News'
class NewsService extends BaseService {}
export default new NewsService(News)

愉快地保存數據

1
await newsService.batchSave(newsListTem)

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

總結

 

原文鏈接:https://juejin.im/post/5a506e6d51882573450156e3?utm_source=tuicool&utm_medium=referral

人妻体内射精一区二区三区| 亚洲中文字幕在线黄色av| 国产精品免费在线免费观看| 国产精品成人观看视频国产奇米| 国产无遮挡又黄又爽在线观看| 一本大道在线无码一区| 强奸2制服诱惑| 最新国产精品一区二区久久| 久久99国产精品久久99蜜桃| 国产日本一区二区三区四区五区| 日本道二区免费V| 小荡货腿张开给我cao免费视频| 国产性猛交╳XXX乱大交| 亚洲美女视频一区二区三区| 久久久久女人精品毛片| 丰满少妇被猛男猛烈进入久久| 亚洲中文无码人在线| 日韩大片高清播放器大全| 97在线观看视频公开免费| 娇妻的呻吟梦颖完整版| 日韩在线一区二区三区在线观看| 91精品国产99久久久久久| 国产精品成人自产拍在线观看0| 国产精品无码专区AV在线播放| 日韩精品久久久免费观看四虎| 韩日午夜在线资源一区二区| 国产午夜福利短视频| 国产69精品久久久久观看软件| 一本久久a久久精品免费不卡| 伦理电影 先锋影音| 人妻无码色AV麻豆去百度搜| 成人国产一区二区精品小说| 欧美成人三级伦在线观看| 精品动漫在线观看一区二区三区| 亚洲精品国产精品乱码不卞| 欧美日韩大片一区二区三区| 中文字幕一区二区三区精彩视频| 亚洲欧美日韩一区在线观看| 精品无码人妻一区二区免费蜜桃| 欧美日韩人妻免费二区| 日本娘婿义母免费播放电视剧| 日韩在线视频精品导航| 在线欧美精品二区三区| 亚洲熟妇AV一区二区三区宅男| 领导用嘴让我高潮了6次| 久久国产色| 亚洲成a人片在线观看69| 无码精品动漫一区二区| 国产一级高清在线观看| 国产成a人亚洲精v品在线观看| 亚洲精品自产拍在线| 国产性自爱拍偷在在线播放| 99热这里只有精品7| 日本不卡视频一区二区三区| 国产丝袜在线视频| 国产高潮娇喘免费网站| 少妇伦子伦精品无码STYLES| 国产农村妇女精品一区二区| 99久久99久久精品免费| 国产精品丝袜足交视频| 无码国产福利AV私拍| 一级毛片完整版免费播放| 亚洲品色永久网址入口app| 九九热精品在线视频| 亚洲永久免费视频网站| 伊人久久五月丁香综合中文亚洲| 久久亚洲精品国产精品尤物| 人妻系列无码专区按摩好紧| 五月天丁香婷婷亚洲欧洲国产| 欧美老妇高潮潮喷视频| 亚洲国产成人a精品不卡在线| 中文字幕人妻色偷偷久久hd| 亚洲国产一成人久久精品| 亚洲精品一区二区三区蜜桃| 在线看国产黄色av| 日本在线观看成人精品| 日韩精品一区二区av观看| 亚洲熟妇在线视频| 亚洲中字无码aV电影在线观看| 亚洲AV无码不卡一区二区三区| 亚洲黄片美女视频| 91精品国产福利在线观看| 巜性按摩1980| 在线观看高清无码亚洲人| 精品欧美高清不卡在线| 中文字幕一区二区三区网站视频| 精品国产乱码久久久久久郑州公司| 99久视频一区视频二区视频上去| 亚洲成av人无码| 国产h视频在线观看| 在线亚洲综合亚洲网色就色| 美女脱掉衣服| 国产亚洲精品美女久久久久久| 亚洲国产中文av福利网| 亚洲国产欧美在线| 亚洲综合一区国产| 国产网红欧美在线视频| 国产91专区| 人妖专区综合无码第一页| 国产亚洲欧美在线专区| 国产精品蜜臀在线观看| 亚洲人成电影在线观看四虎| 日本在线视频www鲁啊鲁蜜芽| 久久精品欧美美99亚洲洲在| 91九色视频无限观看免费| 亚洲午夜精品久久久久久| 在线视频免费观看WWW动漫| 亚洲Av永久无码精品| 国产在线精品观看免费观看| 中文字幕有码在线观看| 日韩一级a毛大片在线视频| 一区二区三区不卡视频| 欧美日本免费在线一区二区三区| 国产良妇出轨视频在线观看| 亚洲国产欧美在线观看片不卡| 囯产精品一品二区三区| 性无码专区无码| 中文字幕在线一区二区三区不卡| 亚洲人成网站18禁止久久影院| 久久久久久久久久久久久久| 最新精品影视播放网站| 国产一级一片内射视频插放| 99久久综合精品五月天| 一本大道久久久综合精品| 麻豆视频免费观看| 久久久久久久久久久久久电影| 中文字幕在线精品一区二区三区| 性色aⅴ闺蜜一区二区三区| 日韩在线视频免费观看| 少妇无码太爽了不卡视频在线看| 亚洲av无码av制服丝袜在线| 日韩视频免费一区二区三区| 亚洲一区二区三区天堂网| 亚洲欧美一区二区三区视频免费| 99国产牛牛视频在线网站| 在线国产自偷自拍视频| 久久99视频这里只有精品| 精品久久人人做人人爽综合| 亚洲中文字幕无码AV| 中文字幕av影院| 亚洲精品香蕉一区二区在线观看| 国产欧美综合在线观看第十页| 亚洲日本va中文| 亚洲综合色区中文字幕| 亚洲视频高清不卡在线| www.色小姐| 制服丝袜中文字幕自拍有码| 亚洲成国产人片在线观看| 青梅被从小摸到大H补课1视频| 日本不卡一区二区三区视频| 夜色资源站www国产在线视频| av天堂2018在线观看| 视频一区二区不卡| 99热这里只有精品8| 久久精品青草社区| 97在线视频人妻无码| 国产在线精品观看一区| 国产精品色欲av蜜臂在线观看| 亚洲精品久荜中文字幕| 一级黄色录像特级的播放| 亚洲精品一区二区国产精品| 国产日韩欧美在线观看网站插| 日韩大片在线久草热视频| 99视频精品全部免费 在线|