- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > web開(kāi)發(fā) > JavaScript >
- node.js做一個(gè)簡(jiǎn)單的爬蟲(chóng)案例教程
準備工作做完了,下面就開(kāi)始創(chuàng )建工程了
下面就是武大計算機學(xué)院新聞的爬蟲(chóng)代碼了,復制到創(chuàng )建的 .js 文件中,保存。
var http = require('http'); var fs = require('fs'); var cheerio = require('cheerio'); var request = require('request'); var i = 0; //初始url var url = "http://cs.whu.edu.cn/a/xinwendongtaifabu/2018/0428/7053.html"; function fetchPage(x) { //封裝了一層函數 startRequest(x); } function startRequest(x) { //采用http模塊向服務(wù)器發(fā)起一次get請求 http.get(x, function (res) { var html = ''; //用來(lái)存儲請求網(wǎng)頁(yè)的整個(gè)html內容 var titles = []; res.setEncoding('utf-8'); //防止中文亂碼 //監聽(tīng)data事件,每次取一塊數據 res.on('data', function (chunk) { html += chunk; }); //監聽(tīng)end事件,如果整個(gè)網(wǎng)頁(yè)內容的html都獲取完畢,就執行回調函數 res.on('end', function () { var $ = cheerio.load(html); //采用cheerio模塊解析html var news_item = { //獲取文章的標題 title: $('div#container dt').text().trim(), i: i = i + 1, }; console.log(news_item); //打印新聞信息 var news_title = $('div#container dt').text().trim(); savedContent($,news_title); //存儲每篇文章的內容及文章標題 savedImg($,news_title); //存儲每篇文章的圖片及圖片標題 //下一篇文章的url var nextLink="http://cs.whu.edu.cn" + $("dd.Paging a").attr('href'); str1 = nextLink.split('-'); //去除掉url后面的中文 str = encodeURI(str1[0]); //這是亮點(diǎn)之一,通過(guò)控制I,可以控制爬取多少篇文章.武大只有8篇,所以設置為8 if (i <= 8) { fetchPage(str); } }); }).on('error', function (err) { console.log(err); }); } //該函數的作用:在本地存儲所爬取的新聞內容資源 function savedContent($, news_title) { $('dd.info').each(function (index, item) { var x = $(this).text(); var y = x.substring(0, 2).trim(); if (y == '') { x = x + '\n'; //將新聞文本內容一段一段添加到/data文件夾下,并用新聞的標題來(lái)命名文件 fs.appendFile('./data/' + news_title + '.txt', x, 'utf-8', function (err) { if (err) { console.log(err); } }); } }) } //該函數的作用:在本地存儲所爬取到的圖片資源 function savedImg($,news_title) { $('dd.info img').each(function (index, item) { var img_title = $(this).parent().next().text().trim(); //獲取圖片的標題 if(img_title.length>35||img_title==""){ img_title="Null"; } var img_filename = img_title + '.jpg'; var img_src = 'http://cs.whu.edu.cn' + $(this).attr('src'); //獲取圖片的url //采用request模塊,向服務(wù)器發(fā)起一次請求,獲取圖片資源 request.head(img_src,function(err,res,body){ if(err){ console.log(err); } }); request(img_src).pipe(fs.createWriteStream('./image/'+news_title + '---' + img_filename)); //通過(guò)流的方式,把圖片寫(xiě)到本地/image目錄下,并用新聞的標題和圖片的標題作為圖片的名稱(chēng)。 }) } fetchPage(url); //主程序開(kāi)始運行
下面就是激動(dòng)人心的時(shí)刻了,在當前文件夾下面,運行創(chuàng )建的 js 文件,比如我的是 news.js。
npm news.js
文本資源:
圖片資源:
爬完武大的新聞并不過(guò)癮,于是嘗試了一波爬草榴的技術(shù)討論區(當然也能爬一些你懂的)。其中遇到了一些問(wèn)題。
爬草榴的時(shí)候,發(fā)送 http 請求報文頭里面需要包含 User-Agent 字段,于是需要把 初始url 做如下改變
var url = { hostname: 'cl.5fy.xyz', path: '/thread0806.php?fid=7', headers: { 'Content-Type': 'text/html', //沒(méi)有這個(gè)字段的話(huà)訪(fǎng)問(wèn)不了 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36', }};
其次,nodejs 只支持 抓取 utf-8 字符編碼的網(wǎng)站,所以需要安裝額外的包來(lái)轉換編碼,所以修改代碼如下
/* * @Author: user * @Date: 2018-04-28 19:34:50 * @Last Modified by: user * @Last Modified time: 2018-04-30 21:35:26 */ var http = require('http'); var fs = require('fs'); var cheerio = require('cheerio'); var request = require('request'); var iconv=require('iconv-lite'); var i = 0; //用來(lái)判斷存儲還是訪(fǎng)問(wèn) var temp=0; let startPage=3;//從哪一頁(yè)開(kāi)始爬 let page=startPage; let endPage=5;//爬到哪一頁(yè) let searchText='';//爬取的關(guān)鍵字,默認全部爬取,根據自己需要 //初始url var url = { hostname: '1024liuyouba.tk', path: '/thread0806.php?fid=16'+'&search=&page='+startPage, headers: { 'Content-Type': 'text/html', //沒(méi)有這個(gè)字段的話(huà)訪(fǎng)問(wèn)不了 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36', }}; //存儲首頁(yè)url urlList=[]; //封裝了一層函數 function fetchPage(x) { setTimeout(function(){ startRequest(x); },5000) } //首先存儲要訪(fǎng)問(wèn)界面的url function getUrl(x){ temp++; http.get(x,function(res){ var html = ''; res.setEncoding('binary'); res.on('data', function (chunk) { html += chunk; }); res.on('end', function () { var buf=new Buffer(html,'binary'); var str=iconv.decode(buf,'GBK'); var $ = cheerio.load(str); //采用cheerio模塊解析html $('tr.tr3 td.tal h3 a').each(function(){ var search=$(this).text(); if(search.indexOf(searchText)>=0){ var nextLink="http://cl.5fy.xyz/" + $(this).attr('href'); str1 = nextLink.split('-'); //去除掉url后面的中文 str = encodeURI(str1[0]); urlList.push(str); } }) page++; if(page<endPage){ //存儲下一頁(yè)url x.path='/thread0806.php?fid=16'+'&search=&page='+page, getUrl(x); }else if(urlList.length!=0){ fetchPage(urlList.shift()); }else{ console.log('未查詢(xún)到關(guān)鍵字!'); } }) }).on('error', function (err) { console.log(err); }); } function startRequest(x) { if(temp===0){ getUrl(x); } else{ //采用http模塊向服務(wù)器發(fā)起一次get請求 http.get(x, function (res) { var html = ''; //用來(lái)存儲請求網(wǎng)頁(yè)的整個(gè)html內容 res.setEncoding('binary'); var titles = []; //監聽(tīng)data事件,每次取一塊數據 res.on('data', function (chunk) { html += chunk; }); //監聽(tīng)end事件,如果整個(gè)網(wǎng)頁(yè)內容的html都獲取完畢,就執行回調函數 res.on('end', function () { var buf=new Buffer(html,'binary'); var str=iconv.decode(buf,'GBK'); var $ = cheerio.load(str); //采用cheerio模塊解析html var news_item = { //獲取文章的標題 title: $('h4').text().trim(), //i是用來(lái)判斷獲取了多少篇文章 i: i = i + 1, }; console.log(news_item); //打印信息 var news_title = $('h4').text().trim(); savedContent($,news_title); //存儲每篇文章的內容及文章標題 savedImg($,news_title); //存儲每篇文章的圖片及圖片標題 //如果沒(méi)訪(fǎng)問(wèn)完繼續訪(fǎng)問(wèn) if (urlList.length!=0 ) { fetchPage(urlList.shift()); } }); }).on('error', function (err) { console.log(err); }); } } //該函數的作用:在本地存儲所爬取的文本內容資源 function savedContent($, news_title) { $("div.t2[style] .tpc_content.do_not_catch").each(function (index, item) { var x = $(this).text(); x = x + '\n'; //將新聞文本內容一段一段添加到/data文件夾下,并用新聞的標題來(lái)命名文件 fs.appendFile('./data/' + news_title + '.txt', x, 'utf-8', function (err) { if (err) { console.log(err); } }); }) } //該函數的作用:在本地存儲所爬取到的圖片資源 function savedImg($,news_title) { //創(chuàng )建文件夾 fs.mkdir('./image/'+news_title, function (err) { if(err){console.log(err)} }); $('.tpc_content.do_not_catch input[src]').each(function (index, item) { var img_title = index;//給每張圖片附加一個(gè)編號 var img_filename = img_title + '.jpg'; var img_src = $(this).attr('src'); //獲取圖片的url //采用request模塊,向服務(wù)器發(fā)起一次請求,獲取圖片資源 request.head(img_src,function(err,res,body){ if(err){ console.log(err); } }); setTimeout(function(){ request({uri: img_src,encoding: 'binary'}, function (error, response, body) { if (!error && response.statusCode == 200) { fs.writeFile('./image/'+news_title+'/' + img_filename, body, 'binary', function (err) { if(err){console.log(err)} }); } }) }); }) } fetchPage(url); //主程序開(kāi)始運行
成果展示:
到此這篇關(guān)于node.js做一個(gè)簡(jiǎn)單的爬蟲(chóng)案例教程的文章就介紹到這了,更多相關(guān)node.js做一個(gè)簡(jiǎn)單的爬蟲(chóng)內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站