Ограничение числа строк, читаемых из CSV-файла, с помощью функции async / await в Node.js - PullRequest
0 голосов
/ 06 ноября 2018

Я использую Puppeteer для очистки веб-страницы методом async / await.

Чтобы очистить данные, мне нужно сначала найти более 600 значений с помощью браузера веб-страницы, поэтому я создал CSV-файл, содержащий значения.

Я импортирую csv-parser, чтобы прочитать файл, а затем объявляю строку из каждой строки в csv, чтобы потом можно было искать содержимое каждой строки в браузере.

Вот код, который мне удалось собрать:

const csv = require('csv-parser');
(async function main (){
    try{        
    fs.createReadStream('values.csv')
    .pipe(csv())
    .on('data', async function (data) {
            const str = String(data.Row1)

// … Here’s the code to open headless Chrome and open the webpage (working fine)

// Code to type in the string into the search bar and click the search button:

await page.type('#SearchBar', str);
await page.click('#SearchButton');

// … Here’s the code to scrape the data displayed after each search (working fine)
});
})();

Когда я запустил код, он попытался открыть более 600 безголовых браузеров, и появилось следующее сообщение:

(узел: 9568) MaxListenersExceededWarning: Обнаружена возможная утечка памяти в EventEmitter. Добавлено 11 SIGHUP слушателей. Используйте emitter.setMaxListeners () для увеличения лимита

Затем я попытался прочитать CSV-файл только с 10 строками, и он работал нормально. Но мне нужно включить все 600 значений в файл, поэтому я попытался ограничить число поисков до 10, заставив функцию принимать обратный вызов в качестве второго параметра с помощью модуля async, но это не сработало.

¿Как я могу асинхронно искать 10 значений за раз, то есть ограничивать чтение до 10 строк за итерацию?

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

1 Ответ

0 голосов
/ 06 ноября 2018

Вам нужно переместить код, запускающий браузер, за пределы обратного вызова data и поместить эту логику в обратный вызов finish. В обратном вызове data просто буферизируйте данные в массив, который вы можете slice позже.

const csv = require('csv-parser');
(async function main (){
    try{
    var searchTerms = [];        
    fs.createReadStream('values.csv')
    .pipe(csv())
    .on('data', function (data) {
            const str = String(data.Row1)
            searchTerms.push(str);
     })
     .on('finish', function() {

for (var i = 0; i < 10; i++) {
  var searchTermsChunk = searchTerms.slice(i*60, (i+1)*60);
  (async function(searchTermsChunk) {
    searchTermsChunk.forEach(function(str) {
      // … Here’s the code to open headless Chrome and open the webpage (working fine)

      // Code to type in the string into the search bar and click the search button:

       await page.type('#SearchBar', str);
       await page.click('#SearchButton');

      // … Here’s the code to scrape the data displayed after each search (working fine)
    });
  })(searchTermsChunk);
}
});
})();

Я не тестировал этот код, поэтому он может не работать из коробки. Общая идея заключается в том, что в обработчике событий finish вы разбиваете свои данные на 10 частей. Каждый searchTermsChunk содержит 60 элементов (последний блок может быть меньше). Для каждого блока вы создаете асинхронную функцию, всего 10 асинхронных функций. Внутри каждой асинхронной функции вы перебираете элементы чанка и ждете завершения событий страницы.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...