溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Node.js(九)——HTTP小爬蟲(chóng)

發(fā)布時(shí)間:2020-06-24 09:04:11 來(lái)源:網(wǎng)絡(luò) 閱讀:462 作者:mazongfei 欄目:web開(kāi)發(fā)

HTTP爬蟲(chóng)

網(wǎng)絡(luò)上每時(shí)每刻都有海量的請(qǐng)求,有從客戶端到服務(wù)器端的,也有服務(wù)器端到服務(wù)器端的

一般在瀏覽器里,我們是通過(guò)ajax來(lái)完成表單的提交或者是數(shù)據(jù)的獲取,

那在http模塊里呢get和request這兩個(gè)接口來(lái)完成數(shù)據(jù)的獲取或者是提交。

來(lái)個(gè)實(shí)例,爬一下51cto博客的數(shù)據(jù)

先從最簡(jiǎn)單的爬蟲(chóng)開(kāi)始,爬源碼

示例代碼如下:

var http = require('http')
var url = 'http://mazongfei.blog.51cto.com/3174958/1909817'

http.get(url, function(res){
	var html = ''
	
	res.on('data',function(data){
		html += data
	})
	
	res.on('end',function(){
		console.log(html)
	}).on('error',function(){
		console.log('獲取博客頁(yè)面出錯(cuò)')
	})
})

運(yùn)行結(jié)果態(tài)度,截取一段如下:

Node.js(九)——HTTP小爬蟲(chóng)源碼雖然爬下來(lái)了,但是對(duì)我們來(lái)說(shuō)沒(méi)有多大意義,我們想拿到博客的標(biāo)題信息,(因知識(shí)儲(chǔ)備不夠,未能爬到博客的代碼,初步理解是Reboot文件)改爬慕課網(wǎng)

那這個(gè)時(shí)候就需要我們分析源碼,把有價(jià)值的東西給篩選出來(lái);

我們?cè)趺磳?duì)源碼進(jìn)行分析呢,這里推薦一個(gè)模塊:cherio

它就像jquery一樣能夠操作裝載后臺(tái)html,簡(jiǎn)單而又方便

首先先安裝一下該模塊: npm install cheerio

var http = require('http')
var cheerio = require('cheerio')
var url = 'http://www.imooc.com/learn/348'

function filterChapters(html){
	var $ = cheerio.load(html)
	var chapters = $('.chapter')
	//我們想拿到一個(gè)數(shù)組,格式如下:
	/*[{
		chapterTitle:'',
		videos:[
			title:'',
			id:''	
		]
	}]*/
	var courseData = []
	//遍歷的里面拿到數(shù)據(jù)
	chapters.each(function(item){
		var chapter = $(this);
		
		//章節(jié)標(biāo)題
		var chapterTitle = chapter.find('strong').text()
		console.log(chapterTitle)
		var videos = chapter.find('.video').children('li')
		var chapterData = {
			chapterTitle:chapterTitle,
			videos:[]
		}
		
		//遍歷videos
		videos.each(function(item){
			var video = $(this).find('.J-media-item')
			var videoTitle = video.text()
			var id = video.attr('href').split('video/')[1]
			
			chapterData.videos.push({
				title:videoTitle,
				id:id
			})
		})
		
		
		courseData.push(chapterData)
	})
	
	return courseData
}

function printCourseInfo(courseData){
	//數(shù)組中的遍歷
	courseData.forEach(function(item){
		var chapterTitle = item.chapterTitle
		
		item.videos.forEach(function(video){
			console.log('【'+video.id+'】'+video.title);
		})
	})
}

http.get(url, function(res){
	var html = ''
	
	res.on('data',function(data){
		html += data
	})
	
	res.on('end',function(){
		//處理
		var courseData = filterChapters(html)
		printCourseInfo(courseData)
	}).on('error',function(){
		console.log('獲取頁(yè)面出錯(cuò)')
	})
})

運(yùn)行結(jié)果如下:

Node.js(九)——HTTP小爬蟲(chóng)

如果出錯(cuò),進(jìn)行console.log進(jìn)行調(diào)試

有了編號(hào),我們就可以自己組裝url地址【6712】并單獨(dú)訪問(wèn)每一節(jié)的內(nèi)容,

可以做更多的事情,目前爬蟲(chóng)代碼先到此為止。

但還有另外一個(gè)問(wèn)題:如果把每一節(jié)的內(nèi)容都跑出來(lái)的話,

在代碼中的表現(xiàn)形式都是回調(diào),在此只拿課程主頁(yè)這個(gè)內(nèi)容,

如果去請(qǐng)求每一節(jié)的內(nèi)容的話是異步的不一定是多長(zhǎng)時(shí)間可以拿到內(nèi)容,

所以是回調(diào)的話,就是一個(gè)不知時(shí)間長(zhǎng)短的回調(diào);所以就有一種異步

的回調(diào)編程方式,來(lái)讓我們組裝好隊(duì)列,得到我們想要的結(jié)果


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI