文章出處
文章列表
利用node.js實現爬蟲,并且爬取豆瓣電影top250的列表和圖片。
1 什么是node.js
簡單的說 Node.js 就是運行在服務端的 JavaScript。
Node.js 是一個基于Chrome JavaScript 運行時建立的一個平臺。
Node.js是一個事件驅動I/O服務端JavaScript環境,基于Google的V8引擎
2 什么是爬蟲
(又被稱為網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。
3 準備
需要引入的包有cheerio和request,直接使用npm install命令在工程目錄下安裝即可。
其中cheerio是類似jquery的包,cheerio是nodejs的抓取頁面模塊,用于解析DOM的。
而Request —— 讓 Node.js http請求變得超簡單。
新建data目錄和img目錄,data目錄下面存放電影信息,img目錄存放圖片。這兩個目錄同樣可以用fs模塊的內置函數生成。
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); }) }
文章列表
全站熱搜