zoukankan      html  css  js  c++  java
  • 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();
    
  • 相关阅读:
    junit测试时,出现java.lang.IllegalStateException: Failed to load ApplicationContext
    Mybatis 3 返回布尔值,需要注意的地方
    mybatis sql in 查询
    在HTML中如何隐藏某段文字具体该怎么实现
    SpringMVC存取Session的两种方法
    spring mvc 使用session
    mybatis入门例子
    Android自定义GifView显示gif动画
    [wxWidgets]_[0基础]_[经常更新进度条程序]
    ASP.NET验证控件
  • 原文地址:https://www.cnblogs.com/sq800/p/13398297.html
Copyright © 2011-2022 走看看