您好,登錄后才能下訂單哦!
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)度,截取一段如下:
源碼雖然爬下來(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é)果如下:
如果出錯(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é)果
免責(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)容。