NodeJS爬取数据

NodeJS爬取数据

在这里插入图片描述

// Book.js
const Book = sequelize.define(
	"Book",
	{
		// 在这里定义模型属性
		name: {
			type: DataTypes.STRING,
			allowNull: false,
		},
		imgurl: {
			type: DataTypes.STRING,
		},
		publishDate: {
			type: DataTypes.STRING,
			allowNull: false,
		},
		author: {
			type: DataTypes.STRING,
			allowNull: false,
		},
	},
	{
		// 把第一个参数当作表名不写这个配置的话就是第一个参数的复数形式
		freezeTableName: true,
		// 直接提供表名
		// tableName: "Employees",
		paranoid: true, // 开启之后数据不能删除而是增加一列删除时间(deleteAt)
	},
);

module.exports = Book;
// 抓取豆瓣读书中的数据信息
const axios = require("axios").default;
const cheerio = require("cheerio");  // 用于分析html 是jquery的核心库所以可以用jquery的写法
const Book = require("../models/Book"); // 用sequelize的模型
const sequelize = require("./db");
const { DataTypes } = require("sequelize");


// 获取豆瓣读书的网页源代码

async function getBookDetailHTML(url) {
   const resp = await axios.get(url);
   return resp.data;
}

async function getBookHTML() {
   const resp = await axios.get("https://book.douban.com/latest");
   return resp.data;
}

async function getBookLinks() {
   const html = await getBookHTML();
   const $ = cheerio.load(html);
   const linkElements = $(".article .chart-dashed-list .media .media__img a");
   const links = linkElements
   	.map((i, elem) => {
   		return elem.attribs["href"];
   	})
   	.get();
   return links;
}

async function getBooksDetail() {
   const datas = [];
   const links = await getBookLinks();
   for (let i = 0; i < links.length; i++) {
   	let data = {};
   	const html = await getBookDetailHTML(links[i]);
       // 传入网页html
   	const $ = cheerio.load(html);
       // $(‘选择器’)可以获取元素内容
   	const name = $("#wrapper h1 span").text();
   	const imgurl = $("#mainpic a img")[0].attribs["src"];
   	const spans = $("#info span.pl");
   	const authorSpan = spans.filter((i, elem) => {
   		return $(elem).text().includes("作者");
   	});
   	const author = authorSpan.next("a").text();
   	const publishSpan = spans.filter((i, elem) => {
   		// 这里不是原生的filter方法是jquery的filter方法
   		return $(elem).text().includes("出版年"); // 要转换为jquery元素
   	});
   	const publishDate = publishSpan[0].nextSibling.nodeValue.trim();
   	data = {
   		name,
   		imgurl,
   		author,
   		publishDate,
   	};
   	datas.push(data);
   }
   return datas;
}

// 保存到数据库
async function save() {
   const datas = await getBooksDetail();
   const res = await Book.bulkCreate(datas);
   console.log("res", res);
}

save();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值