用node實現了一個簡單的http爬蟲,在此向和我同樣正在學習node.js的朋友分享一下html
準備工做
1.node.js自己
2.cheerio模塊
能夠將html構建DOM結構,並提供像jquery同樣的選擇器。
經過npm install cheerio
進行安裝html5
爬取頁面分析
我這裏選取的是segmentfault的未回答問題頁面進行爬取。
(url爲’http://segmentfault.com/quest...‘+頁碼)node
要爬取的是未回答問題的標題及其代碼,從圖中咱們能夠看出,咱們所須要的內容都在div.summary下的h2.title中,因此咱們在獲取html代碼以後,能夠從這裏提取咱們須要的信息。mysql
代碼實現jquery
var http = require('http'); var cheerio = require('cheerio'); var seg_url = 'http://segmentfault.com/questions/unanswered?page='; /* *用於過濾HTML代碼,並從中獲得咱們須要的信息 *使用了cheerio模塊 */ function filter_html(html){ var $ = cheerio.load(html); var questions = $('div.summary'); var questionDatas = []; questions.each(function(item){ var summary = $(this); var question = summary.find('h2.title>a'); var questionData = { title:question.text(), code:question.attr('href').split('q/')[1] }; questionDatas.push(questionData); }); questionDatas.forEach(function(item){ console.log('title:'+item.title+' '+'code:'+item.code); }); } var i = 1;//經過改變i的值能夠爬取多個頁面的未回答問題 /* *http.get接受兩個參數,第一個包含有hostname,port,headers等內容的對象或者字 *符串(自動parse成對象),第二個參數是一個回調函數,用於對結果進行處理。這個方法 *和 request方法幾乎一致,不一樣之處是get方法的method固定爲GET,而且會自動 *觸發end事件 */ http.get(seg_url+i,function(res){ var html = ''; res.on('data',function(data){ html += data; }); res.on('end',function(){ filter_html(html); }); }).on('error',function(e){ console.log('Error:'+e.message); });
結果
最後的結果應該相似這樣:webpack
title:LLVM 中 CreatePHI 時,報錯 code:1010000004337912 title:求教ss-redir的iptables設置 code:1010000004337693 title:summernote 的pre問題 code:1010000004337464 title:Scheme解釋器中正則序是怎麼回事? code:1010000004336759 title:webpack編譯handlebars的問題 code:1010000004336625 title:你們以爲html5中的canvas怎麼使用呢? code:1010000004336370 title:移動版Safari不能自動播放mp3怎麼辦? code:1010000004336299 title:無線傳感器網絡的AODV協議有哪些不足之處? code:1010000004336203 title:Typecho沒法發表文章 code:1010000004335581 title:sphinx 以mysql爲數據源 建索引失敗 code:1010000004334330 ………………