Inoor

Programació del WebScraping

Xat Bot 2026 – Iman Noor | Documentació del Projecte
SMX 1r · Equip 6 · 2026

Xat Bot 2026

Iman Noor

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.

🐍 Python 🍜 BeautifulSoup4 ☁️ Google Colab 📦 JSON 🤖 Gemini API 🐙 GitHub
Scroll

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.

github.com / imannoor-wq / Xat_Bot_2026_Equip6 — README.md
README del projecte al GitHub
📄 README.md — Portada del repositori amb la descripció completa del projecte.

Stack Tecnològic

🐍
Python
Llenguatge principal del projecte. Gestió de la lògica del scraper, manipulació de dades i exportació JSON.
🍜
BeautifulSoup4
Llibreria per analitzar i extreure el text de l’HTML. Permet filtrar etiquetes i eliminar brossa del DOM.
🌐
Requests
Mòdul Python per fer peticions HTTP. S’utilitza amb headers personalitzats i timeout per seguretat.
☁️
Google Colab
Entorn de desenvolupament al núvol amb notebooks Jupyter. No cal instal·lació local, ideal per a prototipat ràpid.
📦
JSON
Format d’emmagatzematge de les dades extretes. Estructurat, llegible i compatible amb qualsevol API moderna.
🤖
Gemini API
API de Google per processar les dades extretes i generar respostes intel·ligents per al xatbot.
🐙
GitHub
Plataforma de control de versions on es publica el codi, els fitxers JSON i la documentació del projecte.
🔗
urllib.parse
Mòdul estàndard de Python per parsejar i construir URLs. Garanteix que el scraper no surti del domini base.

Flux del Sistema

🔍
URL Base: L’script visita https://inoor.inscastellbisbal.net/ de forma recursiva, identifica els títols i paràgrafs importants, i guarda la informació neta en un fitxer JSON per ser processada posteriorment per l’API de Gemini.
01

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.

CONFIG · SETUP
02

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.

RECURSIÓ · CACHE · PROFUNDITAT
03

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.

ÈTICA · DELAYS · GESTIÓ D’ERRORS
04

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.

BEAUTIFULSOUP · FILTRAT · EXTRACCIÓ
05

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.

NAVEGACIÓ · URLJOIN · DOMINI
06

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.

JSON · EXPORTACIÓ · UTF-8
Google Colab — Codi Python
Codi Python a Google Colab
🐍 Codi del scraper: configuració inicial, funció recursiva i robustesa.
Google Colab — Execució en temps real
Execució del scraper a Google Colab
⚡ Sortida en temps real: el scraper navegant per totes les pàgines del web.

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.

XatBot_talent_2026.ipynb — Cel·la 1 Python 3
# ═══════════════════════════════════════════════════════
# 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")
💡
Per què profunditat_max=2? Amb profunditat 2, el scraper visita la pàgina principal i totes les sub-pàgines directament enllaçades, sense anar massa lluny. Això optimitza el temps d’execució i evita descarregar pàgines irrellevants o externes.

Organització del Projecte

📁 Xat_Bot_2026_Equip6 / branch: main
📓
XatBot_talent_2026.ipynb
Quadern de Python (Jupyter Notebook) amb tota la lògica del scraper. Conté el codi complet, comentaris explicatius i la sortida de l’execució. S’executa a Google Colab.
🗄️
dades_iman_total.json
Base de dades generada amb el contingut del web d’Iman. Conté les URLs, títols i paràgrafs de totes les pàgines scrapejades. Representa el resultat final del projecte.
📄
README.md
Documentació principal del projecte en format Markdown. Explica la descripció, tecnologies, estructura i com funciona l’script. És la primera cosa que veu qualsevol visitant del repositori.
📋
CHANGELOG.md
Historial de versions i millores del projecte. Documenta cada canvi rellevant amb número de versió semàntica (v1.0.0, v1.1.0, v1.2.0) i data. Facilita la traçabilitat del codi.
Edició README.md al GitHub
Edició README a GitHub
✏️ Editor de GitHub mostrant el README.md en format Markdown cru.
Edició CHANGELOG.md al GitHub
Edició CHANGELOG a GitHub
📋 Editor de GitHub mostrant el CHANGELOG.md amb totes les versions.
Google Colab — Panell de fitxers
Fitxers a Google Colab
📂 Panell de fitxers de Google Colab mostrant el fitxer dades_iman_total.json generat.

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.

📄 dades_iman_total.json
30+ pàgines
UTF-8 encoding
JSON format
“url” “https://inoor.inscastellbisbal.net/” “titols” “Iman Noor – Portafoli Digital” “Benvingut al meu espai” “Projectes” “contingut” “Sóc estudiant de SMX al Institut de la Bisbal. Aquí trobaràs tots els meus projectes…” “Treballem amb tecnologies modernes: Linux, xarxes, servidors i molt més.” “url” “https://inoor.inscastellbisbal.net/smx-1/” “titols” “SMX 1r – Mòduls i Apunts” “Sistemes Microinformàtics i Xarxes” “contingut” “Continguts del primer curs del cicle formatiu SMX…” “Aprenentatge de xarxes, sistemes operatius i administració de servidors.” “url” “https://inoor.inscastellbisbal.net/linux-essentials/” “titols” “Linux Essentials” “contingut” “Introducció a Linux, comandes bàsiques, gestió d’arxius i permisos…” “url” “https://inoor.inscastellbisbal.net/portfoli-digital/” “titols” “Portafoli Digital” “Els meus projectes” “contingut” “Recopilació de tots els treballs realitzats durant el curs…” // … 30+ pàgines més (reptes, apunts, projectes, etc.)
🤖
Ús amb l’API de Gemini: Aquest fitxer JSON es passarà com a context a l’API de Gemini de Google. El model AI podrà llegir totes les dades del web d’Iman i respondre preguntes personalitzades sobre els seus projectes, apunts i continguts del curs.
🔗 /
🔗 /ipop/
🔗 /politica-de-privadesa/
🔗 /linux-essentials/
🔗 /numeros/
🔗 /google-adsense/
🔗 /fases-electricas-fuentes-alimentacion/
🔗 /smx-1/
🔗 /repte-1-1/
🔗 /correu-corporatiu-del-centre/
🔗 /correu-professional/
🔗 /agenda-electronica/
🔗 /espai-de-treball-a-casa/
🔗 /espai-de-treball-al-nuvol/
🔗 /plataformes-web/
🔗 /portfoli-digital/
🔗 /repte-1-2/
🔗 /repte-1-3/
🔗 … i moltes més

Changelog

v1.0.0
📅 2026-05-01
+ Afegit
  • Configuració inicial de l’entorn a Google Colab.
  • Primer script de prova amb requests per llegir el títol del WordPress.
v1.1.0
📅 2026-05-05
↑ Millorat
  • 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).
v1.2.0
📅 2026-05-09
✓ Finalitzat
  • 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
imannoor-wq Contributor
main Branch
v1.2.0 Última versió
Vista del repositori GitHub
Repositori GitHub
🐙 Vista del repositori GitHub amb els fitxers README.md i CHANGELOG.md.
README renderitzat
README renderitzat
📄 Secció “Estructura del Repositori” i “Com funciona” del README renderitzat.

Projecte Web Scraping i Xatbot · Iman Noor

SMX 1r · Equip 6 · Institut de la Bisbal · 2026

Tecnologies: Python · BeautifulSoup4 · Google Colab · JSON · Gemini API · GitHub

Take the next step to success

Many Web3 platforms are complex and have a steep learning curve, discouraging new users from entering the space.