Loading

Node.js 爬虫爬取电影信息

Node.js 爬虫爬取电影信息

我的CSDN地址:https://blog.csdn.net/weixin_45580251/article/details/107669713
爬取的是1905电影网的信息,使用的是正则匹配。
本来为了更好地学习异步编程打好基础,没想到这玩意这么上头。
代码也写了好几天,自己技术不到家,肯定有写的不好的地方,还需要多努力。
下个月争取把vue学完,九月估计该开学了。

代码在最下面

目录
在这里插入图片描述

const request=require('request');
const url="https://www.1905.com/vod/list/n_1/o3p1.html";
const fs=require('fs');
const { resolve } = require('path');

function req(url){
    return new Promise((resolve,reject)=>{
        request.get(url,(err,response,body)=>{
            if(err) reject(err)
            else resolve({response,body});           
        })
    })
}

//获取起始界面的所有分类地址
async function getClassUrl(){
    let {response,body}=await req(url);
    // console.log(body);
    let reg1=/<span class="search-index-L">类型 :<\/span>(.*?)<div class="grid-12x">/igs;   //i不区分大小写 g全局 s让.匹配换行
    let result1=reg1.exec(body)[1];
    let reg2=/<a href="javascript\:void\(0\);" onclick="location\.href='(.*?)';return false;"(.*?)>(.*?)<\/a>/igs;
    let result2="";
    // console.log(reg2.exec(result1));
    let urlArr=[];
    while(result2=reg2.exec(result1)){
        if(result2[3]!="全部"){
            let obj={
                className:result2[3],
                url:result2[1]
            }
            urlArr.push(obj);
            fs.mkdir("./movies/"+result2[3],{ recursive: true },(err) => {
                    if (err) throw err;
                });
            getMovies(result2[1],result2[3]);
            // console.log(result2.index);
            // console.log(reg2.lastIndex);
        }
    }
    // console.log(urlArr.length);      //17个分类
};

//通过分类栏,获取页面中的电影连接
async function getMovies(url,className){
    let {response,body}=await req(url);
    let reg3=/<a class="pic-pack-outer" target="_blank" href="(.*?)".*?><img/igs;
    let result3="";
    let urlArr=[];
    while(result3=reg3.exec(body)){
        urlArr.push(result3[1]);
        getDate(result3[1],className);
    }
}

//对电影详情页进行分析
async function getDate(url,className){
    let {response,body}=await req(url);
    let reg1=/<h1 class="playerBox-info-name playerBox-info-cnName">(.*?)<\/h1>/;
    // let reg4=/<!-- 文字简介 -->.*?<span id="playerBoxIntroCon">(.*?)<a href="(.*?)" target="_blank" data-hrefexp="fr=vodplay_ypzl_xx">\.\.\.<span>[详细]/;
    let result1=reg1.exec(body);
    // console.log(result1[1]);
    let reg2=/<span id="playerBoxIntroCon">(.*?)<a href="(.*?)" /;
    let result2=reg2.exec(body);
    // console.log(result2[2]);
    writeFile(result1,result2,url,className);
    
}
//写入文件
async function writeFile(result1,result2,url,className){
    let movie={
        name:result1[1],
        brief:result2[1],
        url:url,
        details:result2[2]
    };
    let data=JSON.stringify(movie);
    fs.writeFile(`./movies/${className}/${movie.name}.json`,data,(err)=>{
        if (err) {return console.log(err)}
    });
    //下面的写入流写法也可以
    // let w = fs.createWriteStream(`./movies/${className}/${movie.name}.json`);
    // w.write(data,'utf-8');
    // w.end;
    // w.on('error', function(err){
    //     console.log(err.stack);
    //  });
};
getClassUrl();
posted @ 2020-07-29 17:15  sq800  阅读(353)  评论(0编辑  收藏  举报