Как извлечь данные из PostgreSQL, обработать, затем сохранить в javascript?

#javascript #node.js #puppeteer #postgresql-10 #puppeteer-cluster

#javascript #node.js #кукловод #postgresql-10 #кукловод-кластер

Вопрос:

Я не слишком знаком с продвинутым javascript и ищу какое-нибудь руководство. Я хочу сохранить содержимое веб-страницы в БД, используя puppeteer-cluster, вот начальный пример:

 const { Cluster } = require('puppeteer-cluster');

(async () => {
  const cluster = await Cluster.launch({
    concurrency: Cluster.CONCURRENCY_CONTEXT,
    maxConcurrency: 2,
  });

  await cluster.task(async ({ page, data: url }) => {
    await page.goto(url);
    const screen = await page.content();
    // Store content, do something else
  });

  cluster.queue('http://www.google.com/');
  cluster.queue('http://www.wikipedia.org/');
  // many more pages

  await cluster.idle();
  await cluster.close();
})();
  

Похоже, мне, возможно, придется использовать pg addon для подключения к БД. Каков был бы рекомендуемый подход к этому?

Вот моя таблица:

  ---- ----------------------------------------------------- --------- 
| id | url                                                 | content |
 ---- ----------------------------------------------------- --------- 
| 1  | https://www.npmjs.com/package/pg                    |         |
 ---- ----------------------------------------------------- --------- 
| 2  | https://github.com/thomasdondorf/puppeteer-cluster/ |         |
 ---- ----------------------------------------------------- --------- 
  

Я полагаю, что мне пришлось бы извлекать данные в массив (идентификатор и URL), и после каждого получения содержимого сохранять его в БД (по идентификатору и содержимому).

Комментарии:

1. Я бы выполнил этот скрипт с node на сервере, чтобы получить содержимое веб-сайта. Например, node example.js и example.js был бы приведенный выше скрипт. github.com/GoogleChrome/puppeteer/blob/master/README.md

Ответ №1:

Вы должны создать подключение к базе данных вне функции task:

 const { Client } = require('pg');
const client = new Client(/* ... */);
await client.connect();
  

Затем вы запрашиваете данные и ставите их в очередь (с идентификатором, чтобы иметь возможность сохранить их в базе данных позже):

 const rows = await pool.query('SELECT id, url FROM your_table WHERE ...');
rows.forEach(row => cluster.queue({ id: row.id, url: row.url }));
  

И затем, в конце вашей целевой функции, вы обновляете строку таблицы.

 await cluster.task(async ({ page, data: { id, url, id } }) => {
    // ... run puppeteer and save results in content variable
    await pool.query('UPDATE your_table SET content=$1 WHERE id=$2', [content, id]);
});
  

В целом ваш код должен выглядеть примерно так (имейте в виду, что я сам не тестировал код):

 const { Cluster } = require('puppeteer-cluster');
const { Client } = require('pg');

(async () => {
    const client = new Client(/* ... */);
    await client.connect();

    const cluster = await Cluster.launch({
        concurrency: Cluster.CONCURRENCY_CONTEXT,
        maxConcurrency: 2,
    });

    await cluster.task(async ({ page, data: { id, url } }) => {
        await page.goto(url);
        const content = await page.content();
        await pool.query('UPDATE your_table SET content=$1 WHERE id=$2', [content, id]);
    });

    const rows = await pool.query('SELECT id, url FROM your_table');
    rows.forEach(row => cluster.queue({ id: row.id, url: row.url }));

    await cluster.idle();
    await cluster.close();
})();