使用node.js爬虫,爬取电影信息,并存储到数据库
1.在进入正式内容之前首先我们需要了解一下,node.js的由来!Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎。2.现在进入正题,我们在爬取数据前,需要先下载模块,那么怎样下载模块呢?需要使用到npm包管理工具。这里我就不说用法了,如果大家感兴趣的话,可以去查一下怎么使用,其实那些命令不多,使用起来也是比较简单的。3.第一步我们需要做的就是导入模块。
·
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("用户表已创建!!");
})()
更多推荐
已为社区贡献1条内容
所有评论(0)