利用node.js實現爬蟲,而且爬取豆瓣電影top250的列表和圖片。html
1 什麼是node.jsnode
簡單的說 Node.js 就是運行在服務端的 JavaScript。
Node.js 是一個基於Chrome JavaScript 運行時創建的一個平臺。
Node.js是一個事件驅動I/O服務端JavaScript環境,基於Google的V8引擎jquery
2 什麼是爬蟲npm
(又被稱爲網頁蜘蛛,網絡機器人,在FOAF社區中間,更常常的稱爲網頁追逐者),是一種按照必定的規則,自動地抓取萬維網信息的程序或者腳本。json
3 準備網絡
須要引入的包有cheerio和request,直接使用npm install命令在工程目錄下安裝便可。函數
其中cheerio是相似jquery的包,cheerio是nodejs的抓取頁面模塊,用於解析DOM的。網站
而Request —— 讓 Node.js http請求變得超簡單。ui
新建data目錄和img目錄,data目錄下面存放電影信息,img目錄存放圖片。這兩個目錄一樣能夠用fs模塊的內置函數生成。this
4 源碼
var http = require('https'); // 豆瓣網站添加了https,因此用http模塊就抓不到數據了,把http模塊換成https模塊,而且不得指定80端口,這裏無需指定端口,https模塊會默認使用443端口。 var fs = require('fs'); var path = require('path'); var cheerio = require('cheerio'); // 使用npm install cheerio --save 來安裝 加入--sava參數,項目對於此包的依賴就會寫入package.json中 // 這裏不須要全局安裝,因此不須要-g參數 var request = require('request'); var movies = []; // 爬蟲的URL信息 // var num=0; function getData(startNum) { var opt = { hostname: 'movie.douban.com', path: '/top250?start=' + startNum + '&filter=', // port : 80, headers: { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36' } }; http.get(opt, function(res) { var html = ''; res.setEncoding('utf-8'); res.on('data', function(chunk) { html += chunk; }); res.on('end', function() { // 真正的處理在這裏 var $ = cheerio.load(html); $('.item').each(function() { var info = $(".bd p", this).text().replace(/\s+/g, ""); var actor = $(".bd p", this).text(); var temp,temp2; info.replace(/([\u2E80-\u9FFF\:\·]+)/, function(match, $1, $2) { temp = $1; temp2 = $2; }); var movie = { title: $('.title', this).eq(0).text(), director: temp, actor: temp2, year: /\d+/g.exec(info).toString(), star: $('.info .star .rating_num', this).text(), quote: $(".quote .inq", this).text(), picURL: $('.pic img', this).attr('src') }; movies.push(movie); saveImg('img/',movie.picURL,movie.title); }); // console.log(movies); if(num<=25) getData(num+=5); }) // 還能夠是txt // 調用10次,每次 saveData('data/data.json', movies); }).on('error', function(err) { console.log(err); }) } getData(0); /** * [saveData description] * @param {[type]} path [保存數據的文件夾] * @param {[type]} movies [數據] * @return {[type]} [description] */ function saveData(path, movies) { fs.writeFile(path, JSON.stringify(movies), function(err) { if (err) { return console.log(err); }else { console.log("Data saved"); } }) } // 保存圖片函數 function saveImg(imgDir, url,title) { http.get(url, function(res) { var data = ''; res.setEncoding('binary'); res.on('data', function(chunk) { data += chunk; }); res.on('end', function() { // path.basename(url) fs.writeFile(imgDir + title + '.jpg', data, 'binary', function(err) { if (err) { return console.log(err); } console.log('image downloaded', title + '.jpg'); }); }) }).on('error', function(err) { console.log(err); }) }