node 爬虫

爬的电影网站

通过异步请求获取到页面资源后再正则选定爬取,正则.exec(内容),只匹配一次,
返回数组,匹配多次需要循环

正则爬取分类栏a标签href->正则匹配每个页面中的电影链接,再根据传入的
分类栏href,遍历href获取所有分类栏电影链接->正则匹配电影详情需要的内容,遍历电影链接,获得所有电影内容

代码示例:

let url=require('url')
let axios =require('axios')
let {fsWrite,fsDir}=require('./fsR')

let http='https://www.1905.com/vod/list/n_1_t_1/o3p1.html';
//获取起始页面的所有分类地址
async function getClassUrl(){
	let res=await req(http);
	//解析html内容
	let reg=/<span class="search-index-L">类型(.*?)<div class="grid-12x">/igs
	//获得包含a标签的内容
	let results=reg.exec(res)[1];
	//获得a标签中的地址
	let reg1=/<a href="javascript:void\(0\);" onclick="location\.href='(.*?)';return false;" >(.*?)<\/a>/igs

	let arrClass=[];
	let end;
	//循环exec()获取类名和a标签的href
	while(end=reg1.exec(results)){
		if(end[2]!='全部'){
			let obj={
			className:end[2],
			url:end[1]
			}
			arrClass.push(obj);

			await fsDir("C:/Users/10853/Desktop/movie/"+end[2])
			getMovies(end[1],end[2])

		}
	}
	//console.log(arrClass);
}

getClassUrl();

//通过分类获取页面中的电影链接
async function getMovies(url,movieType){
	let data=await req(url);
	//获取电影详情a标签href
	let reg=/<a class="pic-pack-outer" target="_blank" href="(.*?)" .*?><img/igs

	let res;
	let arrList=[]
	while(res=reg.exec(data)){


		arrList.push(res[1]);
		parsePage(res[1],movieType);
	}
	// console.log('分类:',movieType)
	// console.log(arrList);
}

//获取电影链接后,获取电影详情
async function parsePage(url,movieType){
	let data=await req(url);


	let end=/<h1 class="playerBox-info-name playerBox-info-cnName">(.*?)<\/h1>.*?id="playerBoxIntroCon">(.*?)<a.*?导演.*?target="_blank" title="(.*?)" data-hrefexp/igs

    let res=end.exec(data);
    console.log(res[3]);

    if(res[1]!=null&&res[2]!=null&&res[3]!=null)
    {
    	let movie={
    	  	name:res[1],
    	  	brief:res[2],
    	  	director:res[3],
    	  	movieUrl:url,
    	  	movieType:movieType

    	}
    	let strMovie=JSON.stringify(movie);
    	fsWrite("C:/Users/10853/Desktop/movie/"+movieType+'/'+res[1]+'.json', strMovie);
    }

}


function req(url){
	return new Promise(function(resolve,reject){
		axios.get(url).then((res)=>{
			resolve(res.data);
		})
	})
}

//监听爬取过程进程错误
process.on('unhandledRejection', (reason, promise) => {
  console.log('Unhandled Rejection:', reason)
  // 在这里处理
})

写入文件:

let fs=require('fs')

function fsWrite(url,content){
	return new Promise(function(resolve,reject){
		fs.writeFile(url,content,{flag:'a',encoding:'utf-8'},function(err){
			if(err){
				reject(err);
			}else{

				resolve('ok');
			}
		})
	})
}

function fsDir(path){
	return new Promise(function(resolve,reject){
		fs.mkdir(path,function(err){
			if(err){
				reject(err);
			}else{

				resolve('ok目录');
			}
		})
	})
}
module.exports={
	fsWrite:fsWrite,
	fsDir:fsDir
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值