通过异步请求获取到页面资源后再正则选定爬取,正则.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
}