node.js - 抓取后如何将整个数据作为 json 文件获取
问题描述
在 node.js 中,我尝试使用 Axios 创建一个 Web抓取项目,并且在 console.log 时可以看到全部信息,但是当我尝试使用该数据创建 JSON 文件时,我只能获取数据中的第一个元素你帮帮我,拜托!!!!
"use strict";
const puppeteer = require('puppeteer');
const axios = require('axios');
const cheerio = require('cheerio');
const jsdom = require('jsdom');
const fs = require('fs');
const {JSDOM} = jsdom;
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
class dataToCsv {
constructor() {
this.getData();
}
async getData() {
try {
const KeyWord = 'laptop'
const url = `https://www.amazon.com/s?k=${KeyWord}&ref=nb_sb_noss_2`;
axios.get(url)
.then((response) => {
let $ = cheerio.load(response.data);
$('span.a-size-medium').each(async function (i, e) {
let names = await $(e).text();
let datas = '{ "employees" : [' +
`{ "firstName": ${names}}]}`;
let dataJsons = await JSON.stringify(datas, null, 2);
fs.writeFile('./data/student-2.json', dataJsons, (err) => {
if (err) throw err;
console.log('Data written to file');
});
});
$('span.a-offscreen').each(async function (i, e) {
let prices = await $(e).text();
let datas = '{ "employees" : [' +
`{ "firstName": ${prices}}]}`;
let dataJsons = await JSON.stringify(datas, null, 2);
fs.writeFile('./data/student-3.json', dataJsons, (err) => {
if (err) throw err;
console.log('Data written to file');
});
});
}).catch(function (e) {
console.log(e);
});
} catch (error) {
console.error(error);
}
}
}
new dataToCsv();
这是 JSON 输出:
{
"prices": "$239.99"
}
好的,我发现了获取数据的问题,但现在我无法使用多行获取数据。这是新代码
async getData() {
try {
const KeyWord = 'laptop'
const url = `https://www.amazon.com/s?k=${KeyWord}&ref=nb_sb_noss_2`;
axios.get(url)
.then((response) => {
let $ = cheerio.load(response.data);
let names = $('span.a-size-medium').text()
let prices = $('span.a-offscreen').text()
let datas = {
"name": names,
"price": prices,
}
let dataJsons = JSON.stringify(datas, null, 2);
fs.writeFile('./data/data.json', dataJsons, (err) => {
if (err) throw err;
console.log('Data written to file');
});
}).catch(function (e) {
console.log(e);
});
} catch (error) {
console.error(error);
}
}
和 JSON 输出是这样的
{ "name": "Acer Swift 3 轻薄笔记本电脑 | 14" 全高清 IPS 100% sRGB 显示屏 | AMD Ryzen 7 5700U 八核处理器 | 8GB LPDDR4X | 512GB NVMe SSD | 无线 6 | 背光知识库 | FPR | 亚马逊 Alexa | SF314-43-R2YYAcer Swift 3 英特尔 Evo 轻薄笔记本电脑,14 英寸全高清,英特尔酷睿 i7-1165G7,英特尔 Iris Xe 显卡,8GB LPDDR4X,256GB NVMe SSD,Wi-Fi 6,指纹读取器,背光 KB, SF314-59-75QCAcer Aspire 5 A515-46-R14K 超薄笔记本电脑 | 15.6" 全高清 IPS | AMD 锐龙 3 3350U 四核移动处理器 | 4GB DDR4 | 128GB NVMe SSD | 无线 6 | 背光知识库 | 亚马逊 Alexa | Windows 10 家庭版(S 模式)最新_HP Pavilion 15.6 英寸 FHD 笔记本电脑 PC 适用于商务学生,配备第 11 代英特尔酷睿 i5-1135G7 处理器 8GB RAM 512GB SSD WiFi HDMI 蓝牙网络摄像头 Windows 10 家庭版 1 周 AimCare SupLenovo IdeaPad 3 15.6" 6 英寸全高清 IPS 显示屏,Windows 10 家庭版,HP 快速充电,轻巧设计(15-dy2021nr,2020)华硕笔记本电脑 L410 超薄笔记本电脑,14 英寸全高清显示屏,英特尔赛扬 N4020 处理器,4GB RAM,128GB 存储空间,NumberPad,Windows 10 家用 S 模式,1 年 Microsoft 365,星黑色,L410MA-DB04 便携式显示器 - Lasitu 100% sRGB 超薄 15.6 英寸金属框架便携式屏幕 USB C/HDMI 游戏显示器,适用于笔记本电脑/PC/手机/PS3-5/开关/ Xbox 带可折叠外壳HP 14 笔记本电脑、AMD Ryzen 5 5500U、8 GB RAM、256 GB SSD 存储、14 英寸全高清显示屏、Windows 10 家庭版、轻薄便携、微边缘和防眩光屏幕、长电池寿命 (14 -fq1021nr, 2021)Acer Swift 3 轻薄笔记本电脑 | 14" 全高清 IPS 100% sRGB 显示屏 | AMD Ryzen 7 5700U 八核处理器 | 8GB LPDDR4X | 512GB NVMe SSD | 无线 6 | 背光知识库 | FPR | 亚马逊 Alexa | SF314-43-R2YYHP Stream 11.6 英寸高清笔记本电脑、英特尔赛扬 N4000、4 GB RAM、32 GB eMMC、Windows 10 Home 和 Office 365 个人版 1 年(11-ak0010nr,宝蓝色)戴尔 Inspiron 灵越 15 3000 商业版和学生笔记本电脑(2021 最新型号),15.6 英寸高清显示屏,英特尔 N4020 双核处理器,16GB RAM,1TB SSD,网络摄像头,HDMI,蓝牙,Wi-Fi,黑色,Windows 102021 HP 15.6 英寸薄笔记本电脑,英特尔 N4020, 8GB RAM 128GB SSD 网络摄像头、1 年 Office365、Wi-Fi、双核高达 2.8 GHz、Windows 10 S、FHD 显示屏、
"price": "$629.99$749.99$649.99$849.99$361.40$399.99$629.00$699.00$638.49$249.90$269.99$277.98$299.99$379.99$419.99$309.00$279.00$399.00$399.99$2,611.49$1,116.99$1,499.00$900.00$1,099.99$172.00$799.00$264.00$659.99$1,099.99$359.00$549.00$1,299.00$535.00$659.99$279.99$149.99$549.00$629.99$749.99$233.48$559.00$419.00$77.99$97.45$172.50 $171.00$299.99$379.00$499.00" }
解决方案
推荐阅读
- angular - 如何在垫子输入上附加和前置一个字符?
- json - 使用 Grep 从 Json 值中获取子字符串
- php - WooCommerce 添加到购物车重定向到以前的 URL
- html - 在文本输入标签的 value 属性中使用 Jinja 模板
- java - 在 java 中使用 Future 的最佳方式
- javascript - 点击 Mapbox GL JS 显示 Lat Lng 坐标
- laravel - localstack 上的 Laravel SQS 队列在运行时返回错误
- python - 你将如何重塑一个数组,遍历一列的所有行,并将重塑后的数组分配给一个新列?- Python/熊猫/Numpy
- python - Python Selenium .text 仅返回部分文本
- django - Wagtail 用户编辑中的附加字段