Programació del WebScraping

Codi que he utilitzat en Google Colab

!pip install flask-cors pyngrok google-generativeai beautifulsoup4 requests import requests, time, threading from bs4 import BeautifulSoup from flask import Flask, request, jsonify from flask_cors import CORS from pyngrok import ngrok from google.colab import userdata import google.generativeai as genai from urllib.parse import urljoin, urlparse # — 1. CONFIGURACIÓ — try: API_KEY = userdata.get(‘GOOGLE_API_KEY’) NGROK_TOKEN = userdata.get(‘token_ngrok’) genai.configure(api_key=API_KEY) ngrok.set_auth_token(NGROK_TOKEN) model = genai.GenerativeModel(‘gemini-1.5-flash’) except Exception as e: print(f»❌ ERROR: {e}») app = Flask(__name__) CORS(app) # CONFIGURACIÓ DE WEBS WEBS_A_RASTREJAR = [ «https://idiaz.inscastellbisbal.net», «https://iker-tu-web.github.io» # Posa aquí la teva web real ] # Memòria del bot base_de_dades_textual = «» # Inicialització de la variable # {base_de_dades_textual[:1500]} # Aquesta línia ha estat comentada ja que no té una funció clara tal com estava # — 2. EL MOTOR AUTOMÀTIC (BACKGROUND CRAWLER) — def motor_actualitzacio_automatica(): global base_de_dades_textual while True: nova_base_dades = «» print(f»\n🔄 [{time.strftime(‘%H:%M:%S’)}] Actualització automàtica en marxa…») for base_url in WEBS_A_RASTREJAR: visitades = set() per_visitar = [base_url] domain = urlparse(base_url).netloc while per_visitar and len(visitades) < 12: url = per_visitar.pop(0) if url in visitades: continue try: res = requests.get(url, timeout=5) visitades.add(url) soup = BeautifulSoup(res.text, 'html.parser') for s in soup(["script", "style", "nav", "footer"]): s.extract() text = soup.get_text(separator=' ', strip=True) nova_base_dades += f"\n[FONT: {url}]\n{text}\n" # Cerca automàtica de subpàgines for link in soup.find_all('a', href=True): full_url = urljoin(url, link['href']) if urlparse(full_url).netloc == domain and full_url not in visitades: per_visitar.append(full_url) except: continue base_de_dades_textual = nova_base_dades print("✅ Coneixement sincronitzat. Propera actualització en 10 minuts.") time.sleep(600) # S'actualitza sol cada 10 minuts (600 segons) # --- 3. LÒGICA DE RESPOSTA --- def consultar_ia(pregunta, nivell): roles = { "admin": "Ets l'Administrador. Respon amb dades precises i control total.", "usuari": "Ets l'assistent per a alumnes. Sigues amable i ajuda amb les tasques.", "visitant": "Ets un guia. Donar la benvinguda i explicar què hi ha als webs." } prompt = f""" {roles.get(nivell, roles['visitant'])} CONTEXT ACTUAL DELS WEBS: {base_de_dades_textual[:28000]} PREGUNTA: {pregunta} Respon en català basant-te en el context. Si no ho saps, digues-ho. """ try: response = model.generate_content(prompt) return response.text except Exception as e: # Aquesta línia imprimirà l'error real a la consola de Google Colab print(f"❌ ERROR DETECTAT: {e}") # Aquesta és la resposta que veurà l'usuari al xat return f"Ho sento, hi ha un error tècnic: {str(e)[:50]}..." # --- 4. RUTES API --- @app.route('/ask', methods=['POST']) def ask(): data = request.json resposta = consultar_ia(data.get("message", ""), data.get("level", "visitant")) return jsonify({"reply": resposta}) # --- 5. ARRANCADA AUTOMÀTICA --- if __name__ == '__main__': # 1. Activem el motor de rastreig en un fil separat (background) crawler_thread = threading.Thread(target=motor_actualitzacio_automatica, daemon=True) crawler_thread.start() # 2. Connectem Ngrok ngrok.kill() time.sleep(2) public_url = ngrok.connect(5000).public_url print("-" * 30) print(f"🚀 SERVIDOR 100% AUTOMÀTIC") print(f"🔗 URL GitHub: {public_url}/ask") print(f"🤖 El bot s'actualitza sol cada 10 minuts.") print("-" * 30) app.run(port=5000)
🤖 Assistent Iker Díaz
Hola! Soc la teva IA personalitzada. He llegit la teva web i estic llest per respondre preguntes. Què vols saber?