亚洲国产综合日韩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

久久国产精品噜噜噜久久| 欧美日韩亚洲国内综合网香蕉| 99PAO在线视频国产| 狠狠精品久久久无码中文字幕| 精品无码人妻一区二区免费蜜桃| 成人国产精品视频一区二区| 日韩精品一区二区三区不卡中文字幕| 无码国产69精品久久久久网站| 国产乱码精品一区二区三区播放| 中文字幕亚洲综合久久青草| 日本电影一区二区三区| 99国产欧美另类久久精品| 久久精品国产96精品亚洲| 亚州中文字幕乱码中文字幕| 99视频久久精品久久| 丰满一区二区三区视频| 婷婷五月开心亚洲综合在线| 娇妻在客厅被朋友玩得呻吟动漫| 亚洲国产中文日韩?精品乱码| 狠狠综合久久综合88色鬼| CHINESE国产AV| 伊人久久大香线蕉综合影院首页| 成在人线AV无码免费| 亚洲see少妇裸体pics| 国产成人无码av丝袜美腿| 国产麻豆精品高清在线播放| 国产精品yy92观看| 亚洲综合久久精品哦夜夜嗨| av片在线观看免费| 91嫩草国产在线观看免费| 69久久夜色精品国产69| 亚洲AV一二三又爽又色又色| 日韩精品一区二区亚洲av观看下| 精品一区二区三区波多野结衣| 精品国产露脸对白在线观看| 国产特级毛片AAAAAA| 亚洲中文字幕久久无码| 亚洲欧美人高清精品av| 日本三级欧美三级高潮365| 任你操视频在线观看| 中国少妇bbwbbw牲交| 国产AV精国产传媒| 久久久国产精华液| 国产成人无码片av在线| 人妻少妇av中文字幕乱码| 亚洲精品乱码97久久久| 欧美另类一区二区三区| 国产国语在线播放视频| 日韩有码中文字幕在线播放| 99亚洲综合精品| 国产精品一二三四| 欧美色激情| 欧美一区二区三区视频| 欧美一区韩国二区老司机你懂的| 精品夜夜澡人妻无码av| 91片黄在线观看喷潮| 人人妻人人狠人人爽| 女干部光着屁股让领导玩| 在线国产亚洲91| 无码人妻精品一区二区三区在线| 久久这里只有精品2| 精品亚洲永久免费精品| 久久99国产亚洲精品| 国产精品网站在线观看| 无码国产69精品久久久久网站| 欧美最猛黑人XXXXX猛交| 曰韩人妻无码一区二区三区综合部| 人妻一区二区三区漫画| 久久久久亚洲av?成人无码网站| 国产一区在线免费观看| 91一区二区三区在线观看| 日韩欧美在线播放一区二区| 美女航空一级毛片在线播放| 特级毛片免费观看视频| 欧美做爰全过程免费观看| 日韩人妻精品无 在线看| 91精品国自产拍在线观看不卡| 中文天堂最新版手机| 中文字幕第一页在线资源| 亚洲综合男人的天堂| 国产巨乳超级黄色大片| 亚洲а∨天堂手机bt网| 国产真实乱子伦精品视手机观看| 永久免费av在线播放| 亚洲精品免播放器在线观看| 国产亚洲成aⅴ人片在线观看麻豆| 日本无码www在线视频观看| 国产日韩综合一区| 中文在线免费观看视频| 精品色婷婷亚洲综合看片| 久久AV高潮AV无码AV| 伊人色综合久久成人| 成人无码在线视频网站| 国产亚洲精久久久久久无码77777| 国产精品爽爽V在线观看无码| 欧美日韩美女piexx| 日韩av调教在线观看| 亚洲一区二区在线观看免费| 中文精品99久久国产| 一本色道久久88亚洲精品综合| 欧美麻豆精品久久久久| 一区二区综合熟女av| 色吧最新网址| 国产福利91精品| 亚洲精品久久午夜无码一区二区| 亚洲精品无码精品MV在线观看| 99精品久久99久久久久| 国产一区二区精品av在线观看| 国产免费a| 中文字幕人妻无码一区二| 男JI大巴进入女人的视频| 亚洲狠狠做深爱婷婷影院| 亚洲欧美日韩综合俺去了| 中文字幕无码中字亚洲一区| 中文字幕欧美激情| 亚洲AV无码乱码在线观看牲色| 亚洲第一最快av网站| 欧美日韩视频在线第一区| 欧美又大粗又黄又爽无码| 国产精品久久久久精k8| 欧美精品久久久久久久久25p| 国产免费伦精品一区二区三区| 日韩精品中文字幕有码在线视频| 区二区三区在线 | 欧洲| 日日精品亚洲未满电影| 日韩精品人妻中文字幕有码无码| 国语自产拍无码精品视频在| 艳妇厨房激情偷换| 欧美成人三级在观看线h级| 成人动漫h在线观看| 亚洲精品无码久久久久苍井空国产一| 中文无码亚洲字幕日日鲁去紫皮| 欧美一级簧片在线免费观看| 婷婷综合日在线视频观看| 中国少妇bbwbbw牲交| 精品亚洲国产成人av制服一| 久久亚洲国产最新网站之| 亚洲激在线观看情网站| 亚洲三级中文字幕在线| 中文字幕日韩亚洲乱码日韩在线| 人妻精品动漫H无码网站| 伦理电影 先锋影音| 国产在线精品一区二区中文| CHINESE少妇激情| 亚洲图片日韩视频一区二区| 国产视频一区二区三区四区| 亚洲精品自偷自拍无码忘忧| 中文字幕av高清片| 国产盗摄91精品一区二区三区| 在线看h片免费无码毛片| 精品国产福利在线观看网站| 在线欧美精品视频二区| 亚洲欧洲日产国码久在线| 欧美日韩在线视频网| 五月天婷婷在线播放视频| 国产清纯美女高潮出白浆+色| 国产精品欧美在线| 日韩视频在线一区二区| 蜜臀av粉嫩av懂色av| 少妇人妻国语中文字幕乱码| 国产精品女同一区二区| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲欧美中文日韩v在线中文字幕| 国产全肉乱妇杂乱视频|