發現node能夠爬蟲,正好我在找暑期實習,而後就使用node爬一下網站數據找實習。javascript
//加載http模塊 var http = require('http'); //目標網站,嘿嘿,這個網站有不少實習職位 var pageUrl = 'http://shixi.info/'; http.get(pageUrl, function(res) { var html = ''; res.on('data', function(data) { html += data; }); res.on('end', function() { console.log(html); }); });
http的get請求一個目標網站,回調函數的參數是response,綁定兩個事件,一個'data'事件,會不斷觸發獲取數據,數據獲取完觸發’end‘ 事件。html
爬到的的數據就是目標網站的html源代碼。java
如今html代碼有了,咱們該怎麼解析這個呢?node
在這裏咱們使用cheerio模塊,是服務器端的html解析模塊,使用方法類型jQuerygit
var http = require('http'); var cheerio = require('cheerio'); var pageUrl = 'http://shixi.info/'; http.get(pageUrl, function(res) { var html = ''; res.on('data', function(data) { html += data; }); res.on('end', function() { //數據獲取完,執行回調函數 callback(html); }); }); function callback(html) { //使用load方法,參數是剛纔獲取的html源代碼數據 var $ = cheerio.load(html); var arrUrl = []; //寫法和jQuery如出一轍,有沒有以爲很cool $('article').each(function(index, element) { var href = $(element).find('.entry-title a').attr('href'); arrUrl.push(href); }); }
這樣咱們就把目標頁面的每條招聘信息的網址存放進了一個數組,固然咱們也能夠經過對象字面量存一些其餘數據,好比招聘信息的title,date等等。github
可能有人會問,我只要網址幹嗎?嘿嘿,由於JD是在詳情頁裏面,不去爬詳情頁,我咋看JD。express
爲演示方便:只獲取了職位title。npm
對arrUrl迭代,GET請求。由於是異步操做,因此在這裏咱們建一個count變量,每次完成一個操做count++,執行done函數,若是count值和arrUrl數組的長度相同,執行函數。編程
var count = 0; var results = []; function done() { if (count == arrUrl.length) { console.log('done'); } } arrUrl.forEach(function(item, index) { http.get(item, function(res) { var html = ''; res.on('data', function(data) { html += data; }); res.on('end', function() { var $ = cheerio.load(html); var title = $('.entry-title').text(); results[index] = { url: item, title: title }; count++; done(); }); }); });
var express = require('express'); var app = express(); function done() { if (count == arrUrl.length) { //get 方法,第一個參數路徑,是一個route的做用。 //回調函數,參數分別是:請求,響應。 //監聽8888端口,瀏覽器打開 http://127.0.0.1:8888 app.get('/', function(req, res) { res.send(JSON.stringify(results)); }).listen('8888', '127.0.0.1'); console.log('done'); } }
瀏覽器打開 http://127.0.0.1:8888,就能看到咱們爬的數據了。數組
固然咱們也能夠 對這些數據處理一下,返回到網頁的是html內容文本。
剛纔咱們使用的是count變量,有些不夠優雅。這裏咱們引入eventproxy模塊。
var eventproxy = require('eventproxy'); //獲得實例化對象ep var ep = new eventproxy(); //after,第一個參數是事件名,第二個參數是事件的數量,回調函數的參數是list集合, ep.after('subscribe', arrUrl.length, function(results) { app.get('/', function(req, res) { res.send(JSON.stringify(results)); }).listen('8888', '127.0.0.1'); console.log('done'); }); arrUrl.forEach(function(item, index) { http.get(item, function(res) { var html = ''; res.on('data', function(data) { html += data; }); res.on('end', function() { var $ = cheerio.load(html); var title = $('.entry-title').text(); //通知ep的subscribe事件,ep監測執行完的事件數量等於arrUrl.length,若是等於 執行回到函數。 ep.emit('subscribe', { url: item, title: title }); }); });
經過nodejs爬蟲的學習,學習到了http,express,cheerio,eventproxy的簡單使用。更瞭解到了node異步編程。