在写代码之前,我们先简单了解一下Axios是什么,Axios是一个基于Promise的HTTP库,可以用在浏览器和node.js中,它具有以下特征:
- 从浏览器中创建XMLHttpRequest
- 支持Promise API
- 客户端支持防止CSRF
- 提供了一些并发请求的接口
- 从node.js创建http请求
- 拦截请求和响应
- 转换请求和响应数据
- 取消请求
- 自动转换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()