How to name each row in a url list

0

Can I name each line in the url list, to return the nickname I gave it to?

Type so the result was this:

 Prefeitura Municipal de Bocaiúva do Sul | PRONIM TB 518.01.07-013 |
 Prefeitura Municipal de Matinhos | PRONIM TB 518.01.04-000 |
 | PRONIM TB 518.01.07-012 |
 Prefeitura Municipal de Castanhal | PRONIM TB 518.01.07-012 |

In these cases I know which site is because the parameter on the site is ok

But there are cases like the penultimate line that does not have in the site and does not have where to look for, however I know where it is since I have the link of the site.

Is it possible to set a different name for each url as if it were to name each url and at the time of pulling the file to bring that nickname?

The code is this:

const cheerio = require('cheerio');
const { get } = require('request');
const { writeFileSync } = require('fs');
const { promisify } = require('util');

// Transforma o "get" em uma função que retorna uma promessa
const promisedGET = promisify(get);

const visitar = async uri => {
const { statusCode, body } = await promisedGET({ uri, encoding: 'binary' });

// Retorna um erro caso o status seja diferente de 200
if (statusCode !== 200) throw new Error(body);

return { body };
}

const ler = async ({ body }) => {
const $ = cheerio.load(body);

const cliente = $('table.Class_Relatorio tr:nth-of-type(4) > td:nth-of- 
type(2)').text().trim();
const versao = $('table.Class_Relatorio tr:nth-of-type(1) > td:nth-of- 
type(1)').text().trim();

return { cliente, versao };
}

const executar = async urls => {
 // Faz requisições para todos os sites da lista
const paginas = await Promise.all(urls.map(url => visitar(url)));
// Lê as páginas retornadas e transforma em objetos
const linhas = await Promise.all(paginas.map(conteudo => ler(conteudo)));
// Transforma as linhas em uma string de conteúdo
const conteudo = linhas.map(({ cliente, versao }) => '${cliente} | ${versao} 
|').join('\n');
 // grava o conteúdo no arquivo
 writeFileSync('versao.txt', conteudo);

 return conteudo;
 }

// Exemplo da chamada da função principal
(async () => {
// Inicia o timer
  console.time('Execução');

 try {
 await executar([
  'http://transparencia.bocaiuvadosul.pr.gov.br:9191/pronimtb/index.asp',
  'http://transparencia.matinhos.pr.gov.br/pronimtb/index.asp',
  'http://transparencia.rolandia.pr.gov.br/pronimtb/index.asp',
  'http://transparencia.castanhal.pa.gov.br/pronimtb/index.asp',
  ]);
  } catch (err) {
  console.log(err)
 }

 // Totaliza o tempo de execução
  console.timeEnd('Execução');
 })();
    
asked by anonymous 01.10.2018 / 22:25

1 answer

0

Change the execute function to get a array of objects instead of a array of string and pass this to the recording line.

...
await executar([
  { assinatura: 'Bocaiúva do Sul', url: 'http://transparencia.bocaiuvadosul.pr.gov.br:9191/pronimtb/index.asp' },
  { assinatura: 'Matinhos', url: 'http://transparencia.matinhos.pr.gov.br/pronimtb/index.asp' },
  { assinatura: 'Rolândia', url: 'http://transparencia.rolandia.pr.gov.br/pronimtb/index.asp' },
  { assinatura: 'Castanhal', url: 'http://transparencia.castanhal.pa.gov.br/pronimtb/index.asp' },
]);
...

Then the line that maps the visitation promises of url :

const paginas = await Promise.all(urls.map(({ assinatura, url }) => visitar(assinatura, url)));

Change the visitar function to return the signature at the end:

...
const visitar = async (assinatura, uri) => {
...
return { assinatura, body };
...

Change the ler function to return the signature at the end:

...
const ler = async ({ assinatura, body }) => {
...
return { assinatura, cliente, versao };
...

And finally on the line that forms what will be written, add the signature:

...
const conteudo = linhas.map(({ assinatura, cliente, versao }) => '${assinatura} | ${cliente} | ${versao} |').join('\n');
...
    
01.10.2018 / 22:37