Xat Bot 2026
Sistema d’extracció de dades (Web Scraping) del lloc web personal de WordPress, amb l’objectiu de recollir informació de projectes i apunts per entrenar un xatbot intel·ligent alimentat per l’API de Gemini.
Sobre el Projecte
🎯 Objectiu
Aquest projecte consisteix en la creació d’un sistema d’extracció de dades (Web Scraping) del meu lloc web personal de WordPress (inoor.inscastellbisbal.net). L’objectiu final és recollir tota la informació dels meus projectes i apunts per entrenar un xatbot intel·ligent.
🧠 Visió de Futur
Les dades recollides s’estructuren en format JSON i s’envien a l’API de Gemini de Google per generar respostes intel·ligents. Això permet crear un xatbot personalitzat que coneix tot el contingut del meu web i pot respondre preguntes sobre els meus projectes i apunts de classe.
⚡ Metodologia
El sistema utilitza un scraper recursiu que navega per tots els enllaços interns del web, extreu text net (títols h1–h4, paràgrafs) i el desa en un fitxer JSON estructurat, evitant duplicats i brossa HTML com menús i peus de pàgina.
📐 Entorn de Treball
Tot el desenvolupament s’ha fet a Google Colab, un entorn de notebooks de Python al núvol que no requereix instal·lació local. El codi i els resultats s’han documentat i pujat a GitHub per garantir la traçabilitat i versió del projecte.
Stack Tecnològic
Flux del Sistema
Configuració Inicial
S’estableix la URL base (https://inoor.inscastellbisbal.net/),
s’extreu el domini amb urlparse, s’inicialitza el conjunt
d’URLs visitades (per evitar duplicats) i la llista de dades finals on s’acumularan els resultats.
Scraping Recursiu amb Profunditat
La funció scraper_recursiu(url_actual, profunditat_max=2) comprova
si la URL ja ha estat visitada o s’ha assolit el límit de profunditat. Si no, afegeix la URL
al cache i comença a processar la pàgina. Això garanteix que el sistema no s’endinsi
infinitament i controla la grandària de les dades.
Robustesa: Delays, Timeouts i Errors HTTP
Per ètica i seguretat, s’afegeix un delay de 0.3 segons entre peticions
(time.sleep(0.3)) per no saturar el servidor.
S’utilitzen headers personalitzats (User-Agent: Mozilla/5.0) i un
timeout de 10 segons. Els errors HTTP (404, 500) es gestionen amb
blocs try/except per evitar que l’script es pari.
Extracció i Filtrat del Contingut
S’utilitza BeautifulSoup per parsejar el HTML.
Es filtren les etiquetes de brossa (menús, peus de pàgina, sidebars) i s’extreuen
els títols (h1, h2, h3, h4) i paràgrafs
(p). El text es neteja i s’emmagatzema de forma estructurada.
Navegació pels Enllaços Interns
Es troben tots els enllaços <a href> de la pàgina.
Amb urljoin es converteixen a URLs absolutes i es
comprova que pertanyen al mateix domini. Els que passen el filtre es criden recursivament
amb profunditat_max - 1.
Exportació al Fitxer JSON
Un cop acabat el scraping, totes les dades de dades_finals
s’escriuen al fitxer dades_iman_total.json amb
json.dump() en format llegible (indent=2, ensure_ascii=False).
Això garanteix que els caràcters catalans (accents, ç) es desen correctament.
Implementació Python
A continuació es mostra el codi complet del scraper tal com apareix al notebook XatBot_talent_2026.ipynb a Google Colab. Cada secció du comentaris explicatius que justifiquen les decisions de disseny.
# ═══════════════════════════════════════════════════════ # IMPORTS — Llibreries necessàries per al scraper # ═══════════════════════════════════════════════════════ import requests from bs4 import BeautifulSoup import time import json from urllib.parse import urljoin, urlparse # ═══════════════════════════════════════════════════════ # 1. CONFIGURACIÓ INICIAL # ═══════════════════════════════════════════════════════ base_url = "https://inoor.inscastellbisbal.net/" domain = urlparse(base_url).netloc # extreu 'inoor.inscastellbisbal.net' urls_visitades = set() # cache per evitar repetir pàgines dades_finals = [] # llista on s'acumulen totes les dades # ═══════════════════════════════════════════════════════ # FUNCIÓ PRINCIPAL: SCRAPER RECURSIU # ═══════════════════════════════════════════════════════ def scraper_recursiu(url_actual, profunditat_max=2): # Punt 1: Comprovem si ja hem visitat la URL o si hem arribat al límit if url_actual in urls_visitades or profunditat_max == 0: return # Punt 2: Sistema de verificació (cache) per evitar repetir pàgines urls_visitades.add(url_actual) print(f"Explorant: {url_actual}") try: # Punt 3: Robustesa — Delay de 0.3 segons per ètica i seguretat time.sleep(0.3) # Punt 3: Robustesa — Timeout de 10 segons + headers Mozilla headers = {'User-Agent': 'Mozilla/5.0'} resposta = requests.get(url_actual, headers=headers, timeout=10) resposta.raise_for_status() # llança excepció si hi ha error HTTP # Parsejar el HTML amb BeautifulSoup sopa = BeautifulSoup(resposta.text, 'html.parser') # Eliminar brossa: menús, peus de pàgina, sidebars for tag in sopa.find_all(['nav', 'footer', 'header', 'aside']): tag.decompose() # Extreure títols (h1–h4) i paràgrafs titols = [t.get_text(strip=True) for t in sopa.find_all(['h1','h2','h3','h4'])] paragrafs = [p.get_text(strip=True) for p in sopa.find_all('p') if p.get_text(strip=True)] # Afegir les dades estructurades a la llista final if titols or paragrafs: dades_finals.append({ "url": url_actual, "titols": titols, "contingut": paragrafs }) # Punt 4: Navegar per tots els enllaços interns for link in sopa.find_all('a', href=True): url_absoluta = urljoin(base_url, link['href']) if urlparse(url_absoluta).netloc == domain: scraper_recursiu(url_absoluta, profunditat_max - 1) except Exception as e: print(f"Error a {url_actual}: {e}") # ═══════════════════════════════════════════════════════ # INICI DEL SCRAPING # ═══════════════════════════════════════════════════════ print("Iniciant el rastreig de la web d'Iman...") scraper_recursiu(base_url) # ═══════════════════════════════════════════════════════ # EXPORTACIÓ AL FITXER JSON # ═══════════════════════════════════════════════════════ with open('dades_iman_total.json', 'w', encoding='utf-8') as f: json.dump(dades_finals, f, indent=2, ensure_ascii=False) print(f"✅ Fet! {len(dades_finals)} pàgines exportades a dades_iman_total.json")
Organització del Projecte
dades_iman_total.json
El fitxer dades_iman_total.json és el resultat final del scraping. Conté tota la informació extreta del web d’Iman en un format estructurat i llegible per màquines. Cada entrada representa una pàgina web visitada.
Changelog
- Configuració inicial de l’entorn a Google Colab.
- Primer script de prova amb
requestsper llegir el títol del WordPress.
- Implementació de la funció recursiva per navegar per tots els enllaços interns.
- Filtre d’etiquetes HTML per evitar brossa (menús i peu de pàgina).
- Exportació massiva de dades al fitxer
dades_iman_total.json. - Connexió amb GitHub per pujar el codi i els resultats.
- Documentació completa del repositori (README.md + CHANGELOG.md).
Projecte a GitHub
🐙 Xat_Bot_2026_Equip6
Tot el codi, la documentació i les dades del projecte estan disponibles públicament al repositori de GitHub.
🔗 VISITA EL REPOSITORI
