node.js - 如何在 WebScraping 上从字符串返回 JSON?
问题描述
我一直在尝试进行某种网络抓取,但我无法弄清楚我现在面临的问题,我认为这很容易。
我想要做的是从特定网站获取每个产品标题并以 json 格式打印它们。当我控制台时,每个产品标题都非常清楚,但是当我尝试使用 json 时,它只显示第一个元素并给出错误。我相信存在某种异步问题,或者原因可能是我在打印 json 文件之前忘记了 for 循环,它需要“产品标题”的第一个元素并打印。
感谢您的任何回复。
干杯
var express = require('express'),
app = express(),
request = require('request'),
cheerio = require('cheerio')
port = process.env.PORT || 3000,
bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
app.get("/product", function(req, res){
request('someWebsite', (error, response, html) => {
if(!error && response.statusCode == 200) {
const $ = cheerio.load(html);
$('.product').each((i, el) => {
var productTitle = $(el)
.find('.product-name')
.text();
// console.log(productTitle);
res.send(
{
message:productTitle
}
);
})
}
});
});
app.listen(port, ()=>{
console.log('App is running on port' + port);
});
解决方案
你res.send()
在一个循环中调用。但是您只能一次发送数据并关闭与客户端的连接(实际上res.send()
就是这样做的)。
如果 JSON 对象尺寸可接受,您可以在迭代.product
元素时构造 JSON 对象,并在完成解析后将其发送回客户端。
request('someWebsite', (error, response, html) => {
if(!error && response.statusCode == 200) {
const $ = cheerio.load(html);
let obj = {} // create an empty object
$('.product').each((i, el) => {
var productTitle = $(el)
.find('.product-name')
.text();
// console.log(productTitle);
// do not call res.send() inside "each" iteration
})
res.send(obj) // call res.send() AFTER "each" loop.
}
});
推荐阅读
- json - axios nuxtjs 编辑帖子数据 & 发送请求
- php - Vue.js (CLI) + PHP
- selenium - 使用 Webderiver4D 在 delphi 中更改 Chrome webdriver 的代理配置
- python - 在python中进行双重求和的更有效方法?
- hive - SQL 错误 10249 Hive 与 SELECT 子句中的子查询
- scala - 什么是猫 / fs2 相当于 ScheduledExecutorService.scheduleWithFixedDelay
- c++ - 在 zmq_msg_more 期间 zmq_socket_monitor 阻塞
- stream - 如何从 MAP 获取 MATCH 值
- python - sp_execute_external_script Python 内存变量以加快进程
- julia - Julia 分布式,出现冗余迭代