基于nodejs的爬虫

目标:通过爬虫将猫眼电影首页的电影名称、图片链接、时长、上映时间以及简介插入到数据库中

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文件同步模型表,然后运行爬虫文件将数据导入数据库

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值