Estou com problema de cors e nao sei como resolve

Estou tentando fazer uma requisição com scrapping de um site, porem quando tento puxar os dados ele puxa no console de boa, ai vou tentar mandar para uma tabela no site e da erro de cors.

import React, { useState } from 'react';
import './css/all.css';
import axios from 'axios';
const cors = require('cors');

app.use((req, res, next) => {
	//Qual site tem permissão de realizar a conexão, no exemplo abaixo está o "*" indicando que qualquer site pode fazer a conexão
    res.header("Access-Control-Allow-Origin", "*");
	//Quais são os métodos que a conexão pode realizar na API
    res.header("Access-Control-Allow-Methods", 'GET,PUT,POST,DELETE');
    app.use(cors());
    next();
});

function App() {
  const cheerio = require('cheerio');
  const [mostrar, setMostrar] = useState([]);

  // URL da página que contém a tabela de links
  const url = 'https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=intelbras';

  async function run() {
    try {
      // Fazer uma requisição para a página
      const response = await axios.get(url);

      // Criar um objeto Cheerio com o HTML da página
      const $ = cheerio.load(response.data);

      // Encontrar a tabela de links
      const table = $('#TableWithRules');

      // Encontrar todos os links na tabela
      const links = table.find('a');

      // Lista para armazenar as informações coletadas
      const results = [];

      // Loop pelos links
      for (let i = 0; i < links.length; i++) {
        const link = links[i];

        // Obter a URL do link
        const linkUrl = $(link).attr('href');

        // Adicionar "https://" à URL, se necessário
        const fullLinkUrl = linkUrl.startsWith('http') ? linkUrl : `https://cve.mitre.org${linkUrl}`;

        // Fazer uma requisição para a página do link
        const linkResponse = await axios.get(fullLinkUrl);

        // Criar um objeto Cheerio com o HTML da página do link
        const link$ = cheerio.load(linkResponse.data);

        // Encontrar as informações que deseja coletar, como o título e a descrição do CVE
        const cveid = link$('h2').text().trim();
        const data = link$('b').eq(1).text().trim().replace(/\//g, '');

        // Adicionar as informações coletadas à matriz de resultados
        results.push({
          cveid: cveid,
          data: `${data.substring(6, 8)}/${data.substring(4, 6)}/${data.substring(0, 4)}`,
          link: fullLinkUrl
        });
      }

      // Atualizar o estado da variável "mostrar" com os resultados coletados
      setMostrar(results);

    } catch (error) {
      console.error(`Erro ao fazer a requisição para a página ${url}: ${error}`);
    }
  }

  run();


  return (
    <div>
      <header>
        <nav>
          <div className="navbar-menu">
            <ul>
              <li><a href="#">Mikrotik</a></li>
              <li><a href="#">Ubiquiti</a></li>
              <li><a href="#">Intelbras</a></li>
            </ul>
          </div>
        </nav>
      </header>

      <aside>
        <div className="sidebar-geral">
          <div className="sidebar-logo">
            <img src="assets/logo.png" alt="" />
          </div>
          <div className="sidebar-menu">
            <ul>
              <li><a href="#">Mikrotik</a></li>
              <li><a href="#">Ubiquiti</a></li>
              <li><a href="#">Intelbras</a></li>
            </ul>
          </div>
        </div>
      </aside>

      <main>
        <div className="tabela-geral">
          <table>
            <thead>
              <tr>
                <th>CVE-ID</th>
                <th>Link</th>
                <th>Data</th>
              </tr>
            </thead>
            <tbody>
              {mostrar.map((val, key) => {
                return (
                  <tr key={key}>
                    <td>{val.cveid}</td>
                    <td>{val.data}</td>
                    <td>{val.link}</td>
                  </tr>
                )
              })}
            </tbody>
          </table>
        </div>
      </main>
    </div>
  );
}

export default App;

Nossa que confusão de código… vc ta fazendo scrapping direto no front? Isso é responsabilidade do back end.

1 curtida

é que eu preciso que este codigo puxe as infos e crie uma tabela dinamina no front!

Se vc tah fazendo isso no front, e o host cve.mitre.org não estiver configurado para permitir acessos de outros domínios, infelizmente, não vejo outra forma de resolver, a não ser realizando esse processamento num backend.

isso q n entendo, quando eu estava usando o script em python puxou tudo lindo, so nao consig jogar pro site, mesmo criando um json tlgd.

Mas no caso, o python não iria rodar no navegador. O problema é executar no navegador, que é onde as regras de CORS serão aplicadas.

Cara, e se eu criar um programa ao inves de uma aplicação web sera q funciona?

Teoricamente você pode criar qualquer coisa, desde que você não esteja executando em um browser.

Partindo da premissa que você crie isso para rodar fora do browser, deve funcionar.

alguma dica por onde começar?

Desde que vc tenha algum backend coletando os dados da página, resta apenas saber para o que vc vai usar esses dados, seja gerar uma planilha, apresentar numa página de um sistema que vc fez, enviar por email, etc.

Por exemplo, se vc for apresentar os dados coletados numa página web, vc pode ter uma API no seu backend que invoca a coleta dos dados nesse site e retorna para a página.

eu tenho um scrapping em js que puxa os dados ja da pagina do “cve”, e eu so quero fazer um dash q mostra esses dados mas so para mim tlgd nao postar publico

Tu poderia executar esse código JS no node (talvez precise adaptar alguma coisa para executar de boas) e imprimir o resultado no console, por exemplo. (não confunda com o console do navegador)

no console ele printa tudo certo.

const cheerio = require('cheerio');
const axios = require('axios');
const fs = require('fs');


// URL da página que contém a tabela de links
const url = 'https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=intelbras';


async function run() {
  try {
    // Fazer uma requisição para a página
    const response = await axios.get(url);

    // Criar um objeto Cheerio com o HTML da página
    const $ = cheerio.load(response.data);

    // Encontrar a tabela de links
    const table = $('#TableWithRules');

    // Encontrar todos os links na tabela
    const links = table.find('a');

    // Lista para armazenar as informações coletadas
    const results = [];

    // Loop pelos links
    for (let i = 0; i < links.length; i++) {
      const link = links[i];

      // Obter a URL do link
      const linkUrl = $(link).attr('href');

      // Adicionar "https://" à URL, se necessário
      const fullLinkUrl = linkUrl.startsWith('http') ? linkUrl : `https://cve.mitre.org${linkUrl}`;

      // Fazer uma requisição para a página do link
      const linkResponse = await axios.get(fullLinkUrl);

      // Criar um objeto Cheerio com o HTML da página do link
      const link$ = cheerio.load(linkResponse.data);

      // Encontrar as informações que deseja coletar, como o título e a descrição do CVE
      const cveid = link$('h2').text().trim();
      const data = link$('b').eq(1).text().trim().replace(/\//g, '');

      // Adicionar as informações coletadas à matriz de resultados
      results.push([cveid, `${data.substring(6, 8)}/${data.substring(4, 6)}/${data.substring(0, 4)}`, fullLinkUrl]);
    }

    // Exibir os resultados em um formato apropriado
    for (let i = 0; i < results.length; i++) {
      const item = results[i];
      console.log(`${item[0]} | ${item[1]} | ${item[2]}`);
    }

  } catch (error) {
    console.error(`Erro ao fazer a requisição para a página ${url}: ${error}`);
  }
}

run();

image

Vc rodou pelo nodejs?

sim

Agora, se vc quiser apresentar numa página html, por exemplo, vc teria que configurar uma API que, ao ser chamada, iria retorna o array results. E essa API pode ser feita usando o pacote http do node ou usando o express.

Feito isso, basta vc criar a página que iria chamar essa API rest e montar os dados na tela.

aa certo, obrigado!