Как вернуться из строки в JSON на WebScraping? - PullRequest
0 голосов
/ 09 декабря 2018

Я пытался что-то вроде веб-соскоба, и я не могу понять проблему, с которой я сейчас сталкиваюсь, что довольно легко, я полагаю.

То, что я хотел сделать, это получить каждое из названий продуктов отопределенный веб-сайт и распечатать их в формате JSON.Название каждого продукта становится очень ясным, когда я утешаю, но когда я пытаюсь использовать json, он показывает только первый элемент и выдает ошибку.Я полагаю, что существует какая-то асинхронная проблема, или, возможно, причина в том, что я забываю цикл перед печатью файла json, и он берет первый элемент 'title продукта' и печатает.

Спасибо за любой ответ.

Приветствия

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

1 Ответ

0 голосов
/ 09 декабря 2018

вы звоните res.send() внутри цикла.Но вы можете отправлять данные и закрывать соединение с клиентом (то, что на самом деле res.send() делает) только один раз.

Если измерения объекта JSON приемлемы, вы можете создать объект JSON, перебирая.product элементов и отправьте его клиенту после завершения анализа.

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. 
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...