利用node.js 和 mockjs爬取数据到 mysql 数据库(Visual Studio Code)

注释:mysql 版本:5.5.56  通过Navicat for MySQL (版本11.1.3   64位)使用数据库(功能:Navicat for MySQL 可连接任何本机或远程 MySQL 服务器,功能包括数据模型工具、数据同步、导入或导出、报表、以及更多。)

 

1.首先新建一个文件夹用Visual Studio Code 打开,创建如图所示文件夹

 

 2.在app.js集成终端中里面下载所需要的包:例如(mysql2,sequelize,mockjs,axios,cheerio)(右键打开集成终端)

 

 下载命令:npm i (mysql2,sequelize,mockjs,axios,cheerio) --save [分别下载5个包] 下载完成

 

 

3.首先连接数据库(点击数据库右键连接信息查看)

//首先连接数据库
//导入sequelize
const { Sequelize } = require("sequelize");

//根据实际配置修改 数据库名,用户名,密码
const sequelize = new Sequelize('movie','root','root',{
    //主机名
    host:'localhost',
    //所使用的语言
    dialect:'mysql'
})

//导出sequelize
module.exports = sequelize;

 

4.需要爬取的网站中设置数据库表中的字段

//导入连接的数据库
const sequelize = require("./db")
//导入下载的sequelize 定义为数据类型DataTypes
const { DataTypes } = require("sequelize");

//设置数据库中的 表名,及 字段(这里的sequelize指的是连接的数据库)
//films 表名 ;name、time、buildDate、imgUrl
const films = sequelize.define('films',{
    name:{
        //类型
        type:DataTypes.STRING,
        //是否为空
        allowNull:false,
    },
    time:{
        type:DataTypes.STRING,
    },
    buildDate:{
        type:DataTypes.STRING,
        allowNull:false,
    },
    imgUrl:{
        type:DataTypes.STRING,
    },
},{
    //paranoid表就是软删除而非硬删除机制的表。即只是做一个标记并不是真正的删除
    paranoid:true,
});

//导出films
module.exports = films;

 

 

5.创建用户模型表

//导入movie
require("./movie");
//导入数据库
const sequelize = require("./db");

//创建用户模型表
(async function(){
    await sequelize.sync({alter:true});
    console.log("用户模型表刚刚(重新创建)");
})()

 

 

6.在Navicat for MySQL 中创建一个叫movie的数据库

 

 

7.要在db.js的集成终端中下载sequelize

在sync的集成终端中运行

 

 

 

 

 

 创建成功

 

8.爬取需要的数据

//导入mockjs的插件
const axios = require("axios").default;
const cheerio = require("cheerio");
//导入movie
const movie = require("../models/movie");

//爬取猫眼
// 先获取猫眼电影网页所有html信息
async function getMoviesHTML(){
    const resp = await axios.get("https://www.maoyan.com/");
    return resp.data;
}

// 获取每一个电影的链接
async function getMoviesLinks(){
    const html = await getMoviesHTML();
    const $ = cheerio.load(html);
    const nameElements = $("#app .content .main .movie-grid .panel .panel-content .movie-list .movie-item>a");
    const links = nameElements.map((i,ele) => {
        const href = ele.attribs["href"];
        return href;
    }).get()
    return links;
}
// getMoviesLinks();

// 获取每一个电影的其他详情信息
async function getMoviesDetail(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 buildDate = $('.ellipsis:eq(3)').text().trim().slice(0,10);
    // 电影时间
    const time = $(".ellipsis:eq(2) ").text().trim().split('/')[1];
    // console.log(e);
    return {
        name,
        imgUrl,
        buildDate,
        time
    }
}
// getMoviesDetail("/films/338384");

async function fetchall(){
    const links = await getMoviesLinks();
    const proms = links.map((link)=>{
        return getMoviesDetail(link)
    })
    return Promise.all(proms);
}
// fetchall()

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

 

 

 

posted @ 2021-11-09 20:01  12345上山打老虎1  阅读(404)  评论(0)    收藏  举报