您好,登錄后才能下訂單哦!
HTTP爬蟲
網絡上每時每刻都有海量的請求,有從客戶端到服務器端的,也有服務器端到服務器端的
一般在瀏覽器里,我們是通過ajax來完成表單的提交或者是數據的獲取,
那在http模塊里呢get和request這兩個接口來完成數據的獲取或者是提交。
來個實例,爬一下51cto博客的數據
先從最簡單的爬蟲開始,爬源碼
示例代碼如下:
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('獲取博客頁面出錯') }) })
運行結果態度,截取一段如下:
源碼雖然爬下來了,但是對我們來說沒有多大意義,我們想拿到博客的標題信息,(因知識儲備不夠,未能爬到博客的代碼,初步理解是Reboot文件)改爬慕課網
那這個時候就需要我們分析源碼,把有價值的東西給篩選出來;
我們怎么對源碼進行分析呢,這里推薦一個模塊:cherio
它就像jquery一樣能夠操作裝載后臺html,簡單而又方便
首先先安裝一下該模塊: 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') //我們想拿到一個數組,格式如下: /*[{ chapterTitle:'', videos:[ title:'', id:'' ] }]*/ var courseData = [] //遍歷的里面拿到數據 chapters.each(function(item){ var chapter = $(this); //章節標題 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){ //數組中的遍歷 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('獲取頁面出錯') }) })
運行結果如下:
如果出錯,進行console.log進行調試
有了編號,我們就可以自己組裝url地址【6712】并單獨訪問每一節的內容,
可以做更多的事情,目前爬蟲代碼先到此為止。
但還有另外一個問題:如果把每一節的內容都跑出來的話,
在代碼中的表現形式都是回調,在此只拿課程主頁這個內容,
如果去請求每一節的內容的話是異步的不一定是多長時間可以拿到內容,
所以是回調的話,就是一個不知時間長短的回調;所以就有一種異步
的回調編程方式,來讓我們組裝好隊列,得到我們想要的結果
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。