<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Scraper de Dados Avançado</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
background-color: #f0f0f0;
}
button {
padding: 10px 20px;
font-size: 1.2em;
cursor: pointer;
background-color: #007bff;
color: white;
border: none;
border-radius: 5px;
margin-bottom: 20px;
}
#result {
white-space: pre-wrap;
text-align: left;
background-color: white;
padding: 20px;
border: 1px solid #ccc;
width: 80%;
border-radius: 5px;
height: 300px;
overflow-y: scroll;
}
</style>
</head>
<body>
<h1>Raspador de Dados Avançado</h1>
<button onclick="scrapeData()">Raspar Dados</button>
<div id="result">Clique no botão para iniciar.</div>
<script>
async function scrapeData() {
const proxyUrl = 'https://api.allorigins.win/raw?url=';
const targetUrl = 'https://www.cm-albufeira.pt/'; // URL alvo - pode ser alterada
try {
const response = await fetch(proxyUrl + encodeURIComponent(targetUrl));
if (!response.ok) {
throw new Error(`Erro HTTP: ${response.status}`);
}
const html = await response.text();
const parser = new DOMParser();
const doc = parser.parseFromString(html, 'text/html');
// Extração dos dados
let output = '';
// 1. Extração de e-mails
const emails = html.match(/[\w._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/gi);
output += emails ? `📧 E-mails:\n${emails.join('\n')}\n\n` : 'Nenhum e-mail encontrado.\n\n';
// 2. Extração de telefones (formato internacional e local)
const phones = html.match(/(\+?\d{1,3}[\s-]?)?(\(?\d{2,4}\)?[\s-]?)?\d{4,5}[-\s]?\d{4}/g);
output += phones ? `📞 Telefones:\n${phones.join('\n')}\n\n` : 'Nenhum telefone encontrado.\n\n';
// 3. Extração de datas (formato DD/MM/YYYY ou YYYY-MM-DD)
const dates = html.match(/\b\d{1,2}[/\-]\d{1,2}[/\-]\d{2,4}\b|\b\d{4}[-/]\d{2}[-/]\d{2}\b/g);
output += dates ? `📅 Datas:\n${dates.join('\n')}\n\n` : 'Nenhuma data encontrada.\n\n';
// 4. Extração de logins (padrão simplificado: palavras com até 20 caracteres alfanuméricos)
const logins = html.match(/\b[a-zA-Z0-9_]{3,20}\b/g);
output += logins ? `🔑 Logins:\n${logins.slice(0, 1000).join('\n')}\n\n` : 'Nenhum login encontrado.\n\n';
// 5. Extração de documentos importantes (ex.: PDFs, DOCs)
const documents = Array.from(doc.querySelectorAll('a[href$=".pdf"], a[href$=".doc"], a[href$=".docx"], a[href$=".xls"], a[href$=".xlsx"]'))
.map(link => link.href);
output += documents.length ? `📄 Documentos:\n${documents.join('\n')}\n\n` : 'Nenhum documento importante encontrado.\n\n';
document.getElementById('result').innerText = output;
} catch (error) {
console.error('Erro:', error);
document.getElementById('result').innerText = 'Erro ao raspar os dados. Veja o console para detalhes.';
}
}
</script>
</body>
</html>