m_avrina
@m_avrina
Студентота.

Почему вываливаются ошибки при парсинге большого кол-ва страниц?

Собственно вопрос вот какой, пытаюсь распарсить сайт с большим количеством страниц.
Работает, до определенного момента, потом вываливает кучу ошибок
Вот ошибки:
E:\Study\SPOcoursework\src\index.js:12
var $ = cheerio.load(ress.body);
^

TypeError: Cannot read property 'body' of undefined
at E:\Study\SPOcoursework\src\index.js:12:42
at done (E:\Study\SPOcoursework\src\node_modules\needle\lib\needle.js:440:14)
at ClientRequest.had_error (E:\Study\SPOcoursework\src\node_modules\needle\lib\needle.js:450:5)
at emitOne (events.js:116:13)
at ClientRequest.emit (events.js:211:7)
at TLSSocket.socketCloseListener (_http_client.js:363:9)
at emitOne (events.js:121:20)
at TLSSocket.emit (events.js:211:7)
at _handle.close (net.js:554:12)
at TCP.done [as _onclose] (_tls_wrap.js:356:7)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! package.json@1.0.0 start: `node index.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the package.json@1.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\USER\AppData\Roaming\npm-cache\_logs\2018-03-18T10_56_46_511Z-debug.log


А так же код:
var needle = require('needle');
    var cheerio = require('cheerio');
    var URL = 'https://www.menu.by/minsk/delivery/home.html';

    needle.get(URL, function(err, res) {
        var $ = cheerio.load(res.body);
        $('a.title').each(function (i, element) {
            var a = $(this);
            var url = "https://www.menu.by"+a.attr('href');
            var title = a.text();

            needle.get(url,function (error,ress) {
               var $ = cheerio.load(ress.body);
                $('div.prod-content').each(function (i, element) {
                    var c=$(this);
                    var name = c.text();

                    var json = {
                        name: title,
                        url: url,
                        subName: name
                    };
                    console.log(json);
                });
            });
        });
    });


Вот кратко что делаю, чтобы не вникать долго:

1) с главной страницы достаю ссылки на другие страницы(на которые нужно перейти и достать инфу)
2) Выполняю тот же код, что и для 1 прохода, но уже для подстраниц
3)Данные выводятся, до какого-то n-го момента(я так понимаю, что слишком много запросов)
4)ссылки почему-то берутся беспорядочно(хотя если вывести url то там все ссылки с главной страницы)

Собственно как с таким бороться?
  • Вопрос задан
  • 352 просмотра
Пригласить эксперта
Ответы на вопрос 2
yarkov
@yarkov Куратор тега JavaScript
https://github.com/yarkovaleksei/toster-extension
У вас в оба коллбэка ПЕРВЫМ аргументом передается объект ошибки, или null, если все норм.
Так начните обрабатывать эту ситуацию и все будет работать нормально. Сейчас же вы просто считаете, что ошибки быть не может ))
Ответ написан
sim3x
@sim3x
Внутри происходит ошибка
{ Error: read ECONNRESET
    at exports._errnoException (util.js:1020:11)
    at TLSWrap.onread (net.js:580:26) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }


Увеличил таймауты и по советам установил stream_length в 0

var needle = require('needle');
var cheerio = require('cheerio');

var URL = 'https://www.menu.by/minsk/delivery/home.html';

var needle_params =  {
  open_timeout: 60000,
  read_timeout: 60000,
  compressed: true,
  stream_length: 0
}

needle.get(URL, needle_params, function(err, res) {
  var $ = cheerio.load(res.body);
  $('a.title').each(function(i, element) {
    var a = $(this);
    var url = "https://www.menu.by" + a.attr('href');
    var title = a.text();

    needle.get(url, needle_params, function(error, response) {

      if (error) {
        needle.get(url, needle_params, function(error, response) { 
          // почему работает со второго раза - я так и не понял
          console.log(
            url,
            response ? response.statusCode : 'response is bad bro')
        });
      }
    });
  });
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы