利用node.js中的axios模块实现爬虫

在写代码之前,我们先简单了解一下Axios是什么,Axios是一个基于Promise的HTTP库,可以用在浏览器和node.js中,它具有以下特征:

  1. 从浏览器中创建XMLHttpRequest
  2. 支持Promise API
  3. 客户端支持防止CSRF
  4. 提供了一些并发请求的接口
  5. 从node.js创建http请求
  6. 拦截请求和响应
  7. 转换请求和响应数据
  8. 取消请求
  9. 自动转换JSON数据

以获取淘票票网站首页影片信息为目标,获取前九部影片的片名、图片地址、上映时间、时长、评分等信息。

第一步:先导入需要使用到的模块

const axios = require("axios").default;
const cheerio = require("cheerio");
const Movie = require("../models/Movie");

第二步:利用axios发送请求,获取当前页面信息

async function getMovieHTML(){
    const resp = await axios.get("https://dianying.taobao.com/showList.htm?spm=a1z21.3046609.header.4.32c0112af51P5r&n_s=new")
    // console.log(resp.data);  // 可打印出当前html文件内容
    return resp.data
}

第三步:创建获取影片详情页链接的函数,以便于更方便的得到影片相应信息

async function getMovieLinks(){
    // 调用函数,得到页面信息,注意上述函数调用后得到的是Promise对象
    const html = await getMovieHTML();
    // 利用cheerio模块,便于后续使用jQuery的方法
    const $ = cheerio.load(html)
    const achor = $(".center-wrap .left-wrap .tab-content .tab-movie-list .movie-card-wrap .movie-card")
    const links = achor.map((i,ele) => {
        const href = ele.attribs["href"]
        return href
    }).get()
    // 返回得到的链接,保留前9部
    return links.splice(0,9)
}

第四步:创建根据详情页链接,获取对应信息的函数

async function getMovieDetails(detailUrl){
    const resp = await axios.get(detailUrl);
    // 转化为jQuery对象
    const $ = cheerio.load(resp.data)
    // 获取影片名
    let name = $(".detail-wrap .detail-cont .center-wrap h3").text()
    name = name.split("(")[0];
    // 获取图片地址
    const imgUrl = $(".detail-wrap .detail-cont .center-wrap .cont-pic img").attr("src")
    // 获取上映时间
    let buildDate = $(".detail-wrap .detail-cont .center-wrap .cont-time").text()
    buildDate = buildDate.split(":")[1];
    // 获取时长
    let time = $(".detail-wrap .detail-cont .center-wrap .cont-info li").eq(4).text()
    time = time.split(":")[1]
    // 获取时间
    const pingfen = $(".detail-wrap .detail-cont .center-wrap h3 em").text()
	// 将信息以对象的形式返回出去
    return {
        name,
        imgUrl,
        buildDate,
        time,
        pingfen
    }
}

调用axios模块拿到页面信息后转换为jQuery对象后可帮助我们利用常规JS的方法很方便地拿到我们想要的页面信息

第五步:调用函数,拿到全部九部影片的信息

async function fetchAll(){
    const links = await getMovieLinks();
    const proms = links.map((link) => {
        return getMovieDetails(link)
    })

    return Promise.all(proms)
}

第六步:将数据存储到你的数据库中就可以啦

async function saveToDB(){
    const movies = await fetchAll();
    await Movie.bulkCreate(movies);
    console.log("数据保存至数据库.");
}
saveToDB()
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值