国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

node.js做一個(gè)簡(jiǎn)單的爬蟲(chóng)案例教程

發(fā)布時(shí)間:2021-08-17 12:16 來(lái)源: 閱讀:0 作者:[Object object] 欄目: JavaScript 歡迎投稿:712375056

準備工作

  1. 首先,你需要下載 nodejs,這個(gè)應該沒(méi)啥問(wèn)題吧
  2. 原文要求下載 webstrom,我電腦上本來(lái)就有,但其實(shí)不用下載,完全在命令行里面操作就行

創(chuàng )建工程

準備工作做完了,下面就開(kāi)始創(chuàng )建工程了

  1. 首先,在你想要放資源的地方創(chuàng )建文件夾,比如我在 E 盤(pán)里面創(chuàng )建了一個(gè) myStudyNodejs 的文件夾
  2. 在命令行里面進(jìn)入你創(chuàng )建的文件夾 如圖
    進(jìn)入 e 盤(pán):E:
    進(jìn)入文件夾:cd myStudyNodejs(你創(chuàng )建的文件夾的名字)
    注意全是英文符號
  3. 初始化項目,在你創(chuàng )建的文件夾下面運行 npm init 初始化項目
    一路回車(chē),最后輸個(gè) yes 就行
  4. 運行完以后,會(huì )在文件夾里面生成一個(gè) package.json 的文件,里面包含了項目的一些基本信息。
  5. 安裝所需要的包
    在所創(chuàng )建的文件夾的目錄下運行
    npm install cheerio –save
    npm install request -save
    爬武大的話(huà),這兩個(gè)包就夠了,如果想爬草榴需要額外的轉換編碼的包,windows 上面是
    npm install iconv-lite -save
    Mac 上面是 npm install iconv -save
    運行結果應該第二幅圖這樣,中間手滑少寫(xiě)了個(gè)字母
  6. 創(chuàng )建文件
    在你所創(chuàng )建的文件夾下面創(chuàng )建一個(gè) data 文件夾用于保存爬到的文本數據。
    創(chuàng )建一個(gè) image 文件夾用于保存圖片數據。
    創(chuàng )建一個(gè) js 文件用來(lái)寫(xiě)程序。比如 study.js。(創(chuàng )建一個(gè)記事本文件將 .txt 改為 .js)
    說(shuō)明 –save 的目的是將項目對該包的依賴(lài)寫(xiě)入到 package.json 文件中。

武大計算機學(xué)院新聞爬蟲(chó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

文本資源:

圖片資源:

草榴技術(shù)討論區爬蟲(chóng)

爬完武大的新聞并不過(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í)歡迎投稿傳遞力量。

久久午夜夜伦鲁鲁片免费无码影视 | 国产乱人对白| 美国一区二区三区无码视频| 人人妻人人狠人人爽天天综合网| 强奷表妺好紧2| 最新国产aⅴ精品无码|