目标:通过爬虫将猫眼电影首页的电影名称、图片链接、时长、上映时间以及简介插入到数据库中
1、连接数据库
const {Sequelize} = require("sequelize");
const sequelize = new Sequelize("film","root","root",{
host:"localhost",
dialect:"mysql"
});
module.exports = sequelize;
2、创建数据库的电影表
const sequelize = require("./db.js")
const { DataTypes } = require('sequelize');
// 电影名 链接地址 上映时间 时长 简介
const Movie = sequelize.define('Movie', {
// 电影名
name : {
type : DataTypes.STRING,
allowNull : false
},
// 链接地址
imgUrl : {
type : DataTypes.STRING
},
// 上映时间
publishDate : {
type : DataTypes.STRING,
allowNull : false
},
// 时长
duration: {
type: DataTypes.STRING,
allowNull: false
},
// 简介
introduction: {
type: DataTypes.STRING,
allowNull: false
}
}, {
paranoid : true,
});
module.exports = Movie;
3、同步模型
require("./Movie");
const sequelize = require("./db");
(async function(){
await sequelize.sync({ alter: true });
console.log("用户模型表刚刚(重新)创建");
})()
4、爬取猫眼电影的首页
const axios = require("axios")
const cheerio = require("cheerio")
const Movie = require("../models/Movie")
// console.log(axios)
async function getMovieHtml(){
const resp = await axios.get("https://maoyan.com/")
return resp.data
}
// 得到每个电影的详情页地址
async function getMovieLinks(){
const html = await getMovieHtml()
const $ = cheerio.load(html) //使用cheerio库
// console.log($)
const elements = $(".movie-grid .panel .panel-content .movie-list dd .movie-item>a")
// console.log(ele)
const links = elements.map((i,ele)=>{
const href = ele.attribs["href"]
return href
}).get()
// console.log(links)
return links
}
// 根据地址进入电影详情页,得到详细信息
async function getMovieDetail(detailUrl){
const resp = await axios.get(detailUrl)
const $ = cheerio.load(resp.data)
//获取电影名
const name = $("h1").text().trim()
// 获取电影海报路径
const imgUrl = $(".banner .celeInfo-left .avatar-shadow img.avatar").attr("src")
// 上映时间
const publishDate = $(".banner .celeInfo-right .movie-brief-container ul>li.ellipsis:eq(2)").text()
// 时长
const durationStr = $(".banner .celeInfo-right .movie-brief-container ul>li.ellipsis:eq(1)").text().trim()
const durationArr = durationStr.split("/")
const duration = durationArr[1].trim()
//简介
const introduction = $(".module .mod-content span.dra").text()
// console.log(name);
// console.log(imgUrl);
// console.log(publishDate);
// console.log(duration);
// console.log(introduction);
return {
name,
imgUrl,
publishDate,
duration,
introduction,
}
}
// getMovieDetail('https://maoyan.com/films/338384')
async function fetchAll(){
const links = await getMovieLinks()
// console.log(links)
const proms = links.map((item)=>{
item = `https://maoyan.com${item}`
return getMovieDetail(item)
})
// proms[4].then(data => {
// console.log(data)
// })
return Promise.all(proms)
}
async function resultData(){
const result = await fetchAll()
// console.log(result)
await Movie.bulkCreate(result)
console.log("保存至数据库成功")
}
resultData()
5、先运行sync文件同步模型表,然后运行爬虫文件将数据导入数据库