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();
    
  • 相关阅读:
    Linux IO接口 监控 (iostat)
    linux 防火墙 命令
    _CommandPtr 添加参数 0xC0000005: Access violation writing location 0xcccccccc 错误
    Visual Studio自动关闭
    Linux vsftpd 安装 配置
    linux 挂载外部存储设备 (mount)
    myeclipse 9.0 激活 for win7 redhat mac 亲测
    英文操作系统 Myeclipse Console 乱码问题
    Linux 基本操作命令
    linux 查看系统相关 命令
  • 原文地址:https://www.cnblogs.com/sq800/p/13398297.html
Copyright © 2011-2022 走看看