""" Scraper para ProgramaThor - https://programathor.com.br/jobs """ import requests from bs4 import BeautifulSoup import pandas as pd import time # Headers para simular navegador e evitar bloqueios HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7', } def scrape_programathor(delay: float = 2.0) -> pd.DataFrame: """ Raspa vagas do site ProgramaThor. Args: delay: Tempo de espera antes da requisição (anti-bloqueio) Returns: DataFrame com colunas: titulo, empresa, localizacao, link """ url = "https://programathor.com.br/jobs" vagas = [] try: # Delay anti-bloqueio time.sleep(delay) print(f"🔍 Raspando vagas de: {url}") response = requests.get(url, headers=HEADERS, timeout=30) response.raise_for_status() soup = BeautifulSoup(response.text, 'html.parser') # Encontrar cards de vagas (ajustar seletores conforme estrutura do site) job_cards = soup.select('.cell-list') for card in job_cards: try: # Extrair título titulo_elem = card.select_one('h3') or card.select_one('.title') titulo = titulo_elem.get_text(strip=True) if titulo_elem else "N/A" # Extrair empresa empresa_elem = card.select_one('.company-name') or card.select_one('h4') empresa = empresa_elem.get_text(strip=True) if empresa_elem else "N/A" # Extrair localização loc_elem = card.select_one('.location') or card.select_one('.info') localizacao = loc_elem.get_text(strip=True) if loc_elem else "Remoto" # Extrair link link_elem = card.select_one('a[href*="/jobs/"]') if link_elem: href = link_elem.get('href', '') link = f"https://programathor.com.br{href}" if href.startswith('/') else href else: link = url vagas.append({ 'titulo': titulo, 'empresa': empresa, 'localizacao': localizacao, 'link': link, 'fonte': 'ProgramaThor' }) except Exception as e: print(f"⚠️ Erro ao processar card: {e}") continue print(f"✅ {len(vagas)} vagas encontradas no ProgramaThor") except requests.exceptions.RequestException as e: print(f"❌ Erro na requisição ao ProgramaThor: {e}") except Exception as e: print(f"❌ Erro inesperado no ProgramaThor: {e}") return pd.DataFrame(vagas) if __name__ == "__main__": # Teste individual do scraper df = scrape_programathor() print(df.head())