大学生涯scrapy小红书数据处理+Apache-Echarts
Jie一. Apache-Echarts 简介
数据可视化在过去的几年中得到了长足的发展。开发者对于可视化产品的期待不再是简单的图表创建工具,而在交互、性能、数据处理等方面有了更高级的需求。
Apache ECharts 始终致力于让开发者以更方便的方式创造灵活丰富的可视化作品。在最新推出的 Apache ECharts 5,我们着力加强了图表的叙事能力,让开发者可以以更简单的方式,讲述数据背后的故事。
“表·达”是 Apache ECharts 5 的核心,通过五大模块、十五项特性的全面升级,围绕可视化作品的叙事表达能力,让图“表”更能传“达”数据背后的故事,帮助开发者更轻松地创造满足各种场景需求的可视化作品。
其一是个基于 JavaScript 的 <span style="color:red">
开源可视化图表库。
二. 小红书喜欢数实例
1.在 Echarts 平台中选取一个合适钟意的图
我这里选圆角环形图
点击下载示例
保存到 main.js 爬虫代码同级目录,pie-borderRadius.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| <!DOCTYPE html> <html lang="en" style="height: 100%"> <head> <meta charset="utf-8" /> </head> <body style="height: 100%; margin: 0"> <div id="container" style="height: 100%"></div> <script type="text/javascript" src="https://registry.npmmirror.com/echarts/5.5.1/files/dist/echarts.min.js" ></script>
<script type="text/javascript"> var dom = document.getElementById("container"); var myChart = echarts.init(dom, null, { renderer: "canvas", useDirtyRect: false, }); var app = {};
var option;
option = { tooltip: { trigger: "item", }, legend: { top: "5%", left: "center", }, series: [ { name: "小红书课堂开课啦!", type: "pie", radius: ["40%", "70%"], avoidLabelOverlap: false, itemStyle: { borderRadius: 10, borderColor: "#fff", borderWidth: 2, }, label: { show: false, position: "center", }, emphasis: { label: { show: true, fontSize: 40, fontWeight: "bold", }, }, labelLine: { show: false, }, data: [ { name: "1千+", value: 75 }, { name: "1万+", value: 61 }, { name: "10+", value: 36 }, { name: "4", value: 1 }, { name: "6", value: 1 }, ], }, ], };
if (option && typeof option === "object") { myChart.setOption(option); }
window.addEventListener("resize", myChart.resize); </script> </body> </html>
|
在该代码中只需要改 data 值即可,我们需要分析获得在小红书爬虫爬到的数据(content.json)中的数据,
2.获取数据
创建一个包 data_process,在里面创建 pie_data.js
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| const fs = require("fs").promises; const path = require("path");
let data = null; let d = null;
async function loadData() { try { const filePath = path.join(__dirname, "..", "content.json"); const fileContent = await fs.readFile(filePath, "utf8"); data = JSON.parse(fileContent); } catch (error) { console.error("Failed to load data:", error); } }
loadData() .then(() => { console.log("data.length", data.length); const dict = data.reduce((acc, item) => { acc[item.title] = item; return acc; }, {});
const dict_arr = []; for (const title in dict) { dict_arr.push(dict[title]); } console.log("dict_arr.length", dict_arr.length);
d = dict_arr.reduce((acc, item) => { let flag = false; for (const v of acc) { if (v.name === item.like) { v.value += 1; flag = true; } } if (flag === false) { acc.push({ name: item.like, value: 1, }); } return acc; }, []); console.log("data_handle\n", d); }) .catch((error) => { console.error("Failed to load data during startup:", error); });
|
解析
1 2 3 4 5
| const fs = require("fs").promises; const path = require("path");
let data = null; let d = null;
|
通过 require 引入依赖以及定义俩个全局变量
data 指没有处理过的原始 json 数据,即content.json中的数据
d 指经过处理后的 json 数据,即pie-borderRadius.html中所需 data 数据
1 2 3 4 5 6 7 8 9 10 11
| async function loadData() { try { const filePath = path.join(__dirname, "..", "content.json"); const fileContent = await fs.readFile(filePath, "utf8"); data = JSON.parse(fileContent); } catch (error) { console.error("Failed to load data:", error); } }
|
该函数用来引入上级目录的 content.json 的数据,可以通过打印日志来判断是否成功
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| loadData().then(() => { console.log("data.length", data.length) const dict = data.reduce((acc, item) => { acc[item.title] = item return acc }, {})
const dict_arr = [] for (const title in dict) { dict_arr.push(dict[title]) }
|
这里通过 python 中字典与数组的定义将在 content.json 中重复的数据去除,即去重
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| console.log("dict_arr.length", dict_arr.length);
d = dict_arr.reduce((acc, item) => { let flag = false; for (const v of acc) { if (v.name === item.like) { v.value += 1; flag = true; } } if (flag === false) { acc.push({ name: item.like, value: 1, }); } return acc; }, []); console.log("data_handle\n", d);
|
这里通过遍历判断 dict_arr 数组来将 content.json 中的 like 分类并相对应的计数
1 2 3 4
| }).catch(error => { console.error('Failed to load data during startup:', error); });
|
通过 try catch 来处理发生错误时的逻辑,需要什么可以自行添加
3.运行
由于静态 html 在浏览器中并不支持即时 node.js 来加载数据,所以我们需要手动的运行data_process中的pie-data.js文件,并且将之全局变量 d 的运行结果手动复制到pie-borderRadius.html的 data 数据处。
在 Terminal 中进入 data_process 文件夹中,运行:
之后复制到 pie-borderRadius.html*的 data 数据处通过浏览器打开该 HTML 即可,如图: