nodejs学習ノートのURLモジュール


URLモジュール
このモジュールはurlアドレスを解析してくれます.中から多くの有用な内容を取り出して使ってくれます.
url.parse(url String[,parseQueryString]]
解析したオブジェクトに戻ります.最初のパラメータは解析するurlアドレス、二つ目のパラメータはquery文字列をオブジェクト形式に解析するかどうか、二つ目のパラメータはプロトコルがない場合はドメイン名などを解析するかどうかを制御します.
url.format(urlObject)
一つのurlを解析したオブジェクトをurlアドレスに戻します.
url.resove(from,to)
私達の二段のurlを一つのurl住所に解析できます.
console.log(url.resolve('http://www.baidu.com','/api/index.html'))
//'http://www.baidu.com/api/index.html'
queryString
私たちのqueryString文字列(a=1&b=2&c=3)を解析または逆コンパイルできます.
querystrings.strigify(obj[,sep[,eq[,options]]):
一つのオブジェクト(キーの値ペア)を一つのquerystringに解析できます.二つ目のパラメータは分割記号(&)、三つ目のパラメータはキーパッドのペア間のリンク記号(=)を設定できます.
querystring.parse(str[,sep[,eq[,options]])
一つのQs文字列を一つのオブジェクトに解析できます.後ろのパラメータはある規則に従って解析します.
querystring.escape(str)、querystring.unescape(str)
私達の中国語を百分コードに解析できます.
console.log(qs.escape('  '))//%E5%8C%97%E4%BA%AC
console.log(qs.unescape('%E5%8C%97%E4%BA%AC'))//  


http小爬虫
http.get方法を利用して、あるURLのファイルの内容を取得して、cherioツールを利用して、重要な内容の抽出を行います.
1.モジュールの導入とグローバル変数の設定
//  https  (            https)
var https=require('https');
//cheerio        html         jq  ,  jq       
var cheerio=require('cheerio');
//       
var url='https://www.lagou.com/';

2.要求データ
get方法は、あるURLのファイルの内容、最初のパラメータurlアドレス(登用するURL)を取得するためにシミュレーション要求を行うことができます.コールバック関数は、resオブジェクトにいくつかのイベントをバインドして動作します.

https.get(url,function(res){
	//          
	var html='';
	
	//data                ,            chunk(    )
	res.on('data',function(chunk){
		html+=chunk;
	})
	//end             
	res.on('end',function(){
		//       
		var menuData=filterMenu(html);
		//      
		controlMenu(menuData)
	})
	//error          ,      
	res.on("error",function(err){
		console.log(err)
	})
});
3.設計データ構造
//       
//[
//	{
//		menuTitle:'  ',
//		menuList:[
//			'java','php'
//		]
//	}
//]
4.html文字列を解析し、内容を抽出する関数
function filterMenu(html){
	// html        jq  
	var $=cheerio.load(html);
	//         
	var menuData=[];
	//        dom
	var menu=$(".menu_main");
	//  ,  ,  
	menu.each(function(i,value){
		var menuTitle=$(value).find('h2').text();
		var menuLists=$(value).find('a');
		var menuList=[];
		menuLists.each(function(i,value){
			menuList.push($(value).text())
		})
		menuData.push({
			menuTitle:menuTitle,
			menuList:menuList
		})
	})
	 
	 return menuData;
	
}
5.抽出した内容を処理する関数は、ここでは出力のみを行います.
//              
function controlMenu(menu){
	menu.forEach(function(item,index){
		console.log(item.menuTitle+'
'); item.menuList.forEach(function(item,index){ console.log(item+'
'); }) }) }
主な技術点:https、https.get、data、end、error事件、cherioモジュール
request Get/request Post
requestによってデータをgetする(要求されるのは豆板映画のapi):
1.モジュールの導入とグローバル変数の設定
//  https  
const https = require('https');
//       
//http          80,https         443
var options = {
  hostname: 'api.douban.com',
  port: 443,
  path: '/v2/movie/in_theaters',
  method: 'GET'
};
2.設定要求のプロセス
//         
var req = https.request(options, (res) => {
  console.log('   :', res.statusCode);
  console.log('   :', res.headers);

  var requestData='';
  res.on('data', (chunk) => {
  	requestData+=chunk;
  });
  
  res.on('end',function(){
  	console.log(JSON.parse(requestData).subjects[0].title)
  })
  
});
//        
req.on('error', (e) => {
  console.error(e);
});
//     end  
req.end();
requestのpost方法によってレビュー(控除丁学堂)を行います.
1.モジュールの導入とグローバル変数の設定
//  http   qs  
const http = require('http');
const qs=require('querystring');
//      ,     querystring(a=1&b=2)
var postData=qs.stringify({
	'question[title]':'1701     ',
	'question[content]':'

1701

', 'question[courseId]':'221', 'question[lessonId]':'1698', '_csrf_token':'4df960e69a84f1a05b551cd66cff159f7bd70349' })
2.プロファイル要求のオプション
var options = {
  hostname: 'www.codingke.com',
  port: 80,
  path: '/ajax/create/course/question',
  method: 'POST',
	headers:{//        headers,   cookie           ,              
		'Accept':'*/*',
			'Accept-Encoding':'gzip, deflate',
			'Accept-Language':'zh-CN,zh;q=0.8',
			'Connection':'keep-alive',
			'Content-Length':postData.length,
			'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
			'Cookie':'PHPSESSID=a7hmtvdr7odale2npuoe8kquo1; UM_distinctid=15bcc291625965-0b7625ecfa7e2b-4e47052e-100200-15bcc29162651c; CNZZDATA1256018185=1628677493-1493778687-null%7C1493778687; Hm_lvt_9f92046de4640f3c08cf26535ffdd93c=1493778896; Hm_lpvt_9f92046de4640f3c08cf26535ffdd93c=1493778931',
			'Host':'www.codingke.com',
			'Origin':'http://www.codingke.com',
			'Referer':'http://www.codingke.com/v/326-chapter-221-course',
			'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
			'X-CSRF-Token':'4df960e69a84f1a05b551cd66cff159f7bd70349',
			'X-Requested-With':'XMLHttpRequest'
	}
};
3.送信手順の設定
//         
var req = http.request(options, (res) => {

  res.on('data', (chunk) => {
  	console.log(chunk.toString())
  });
  
  res.on('end',function(){
  	console.log('    ')
  })
  
});
//        
req.on('error', (e) => {
  console.error(e);
});
//    
req.write(postData)
//     end  
req.end();
イベントエピター
nodejsはイベントの駆動です.例えば、前のresはdata、endイベントがあります.私達も対象を作って、イベントを定義して、ある状況でこの事件を触発します.
頼っているのはeventsモジュールです.お願いしたのはeventEmitter類です.

//  EventEmitter  ,     class
const EventEmitter=require('events')

//    Player    EventEmitter 
class Player extends EventEmitter {};

//          
var player=new Player();
//            
player.on("play",(name)=>{
	console.log('    :'+name)
})
//            
player.emit('play','        ');