1.在进入正式内容之前首先我们需要了解一下,node.js的由来!

Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎。

2.现在进入正题,我们在爬取数据前,需要先下载模块,那么怎样下载模块呢?需要使用到npm包管理工具。这里我就不说用法了,如果大家感兴趣的话,可以去查一下怎么使用,其实那些命令不多,使用起来也是比较简单的。

3.第一步我们需要做的就是导入模块。

// 导入axios模块 cheerio模块
const axios = require("axios").default;
const cheerio = require("cheerio");
const Movie = require("../module/Movie.js");

4.获取猫眼电影网页源代码信息

// 1.获取猫眼电影网页源代码的所有HTML信息
async function getMovieHTML() {
    const resp = await axios.get("https://maoyan.com/");
    console.log(resp.data);
    return resp.data;
}
// getMovieHTML();

// 得到每一电影的的详情链接,然后转换成数组
async function getMovieLinks() {
    const html = await getMovieHTML();
    // 使用cheerio库
    const $ = cheerio.load(html);
    // console.log($);
    const achorElements = $("#app .content .main .movie-grid .panel .panel-content .movie-list .movie-item>a");
    // console.log(achorElements[0]);
    const links = achorElements.map((i, ele) => {
        const href = ele.attribs["href"];
        return href;
    }).get();
    // console.log(links);
    return links;
}
// getMovieLinks();

5.获取详情页电影的字段信息,并以对象的方式返回出去。

// 3.根据数据的详情页地址进入详情页 得到电影的详细信息
async function getMovieDetail(detailUrl) {
    console.log(detailUrl);
    const resp = await axios.get(`https://maoyan.com${detailUrl}`);
    const $ = cheerio.load(resp.data);
    // 获取电影名
    const name = $('.banner .wrapper .celeInfo-right .movie-brief-container h1').text().trim();
    // 获取图片路径
    const imgUrl = $(".banner .wrapper .celeInfo-left .avatar-shadow img").attr("src");
    // 获取放映时间
    const date = $('.banner .wrapper .celeInfo-right .movie-brief-container ul li').eq(2).text();
    // 截取下时间
    const builtDate = date.substring(0, 10);
    // 电影时间
    const time = $('.banner .wrapper .celeInfo-right .movie-brief-container ul li').eq(1).text().split('/')[1].trim();
    // console.log(e);
    return {
        name,
        imgUrl,
        builtDate,
        time
    }
}
// getMovieDetail("https://maoyan.com/films/338384");

最后获取所有的电影信息,并存入到数据库里面

// 获取所有电影的信息
async function fetchAll() {
    const links = await getMovieLinks();
    const proms = links.map((link) => {
        return getMovieDetail(link)
    })
    return Promise.all(proms)
}

async function savaToDB() {
    const movies = await fetchAll();
    await Movie.bulkCreate(movies)
    console.log("数据保存至数据库")
}
savaToDB()

对了还需要导入创建表的js文件,Movie.js文件。

const sequelize = require("./db.js")
const {
    DataTypes
} = require('sequelize');

const Movie = sequelize.define('Movie', {
    name: {
        type: DataTypes.STRING,
        allowNull: false
    },
    time: {
        type: DataTypes.STRING,
        allowNull: false
    },
    builtDate: {
        type: DataTypes.STRING,
        allowNull: false
    },
    imgUrl: {
        type: DataTypes.STRING,
        allowNull: false
    }
}, {
    paranoid: true,
});


module.exports = Movie;

还需要连接数据库的js文件,这里我取名为db.js文件。

// 连接数据库
// 引入sequelize插件,使用npm下载

const { Sequelize } = require('sequelize');

const sequelize = new Sequelize('test', 'root', 'root', {
    host: 'localhost',
    dialect: 'mysql'
});

module.exports = sequelize;

还有就是执行连接数据库和建表的js文件。在node环境中运行这个文件,让它在数据库里面生成表。

require("./Movie")
const sequelize = require("./db");


(async function() {
    await sequelize.sync({
        alter: true
    });
    console.log("用户表已创建!!");
})()

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐