首页 > 解决方案 > 如何在 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); 
});

标签: node.jsrestapiweb-scraping

解决方案


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. 
        }
    });

推荐阅读