20260130064244*
Este proyecto ha sido desarrollado y probado con Python 3.13.9.
Para evitar incompatibilidades, se recomienda usar esta versión.
- Windows 10 / Windows 11 (64 bits)
- Abre tu navegador y ve a: https://www.python.org/downloads/windows/
https://www.python.org/downloads/windows/- Busca Python 3.13.9 (64-bit).
- Descarga el instalador:
Windows installer (64-bit)
https://www.python.org/ftp/python/3.13.9/python-3.13.9-amd64.exe- Ejecuta el instalador descargado.
- MUY IMPORTANTE: marca estas opciones antes de continuar:
- ✅ Add Python to PATH
- ✅ Install launcher for all users (opcional pero recomendable)
- Pulsa Install Now.
- Espera a que finalice la instalación.
Nota: python puede apuntar a varias versiones como por ejemplo:
Regex para eliminar líneas vacías en Notepad++: ^\s*$\n
- Python Launcher para Windows (modo consola).
- Selecciona automáticamente la versión de Python según argumentos,
shebango configuración. - Recomendado para scripts multiplataforma (
#!/usr/bin/env python).
- Gestor interno del Python Launcher.
- Utilizado para administración de instalaciones Python (normalmente no se invoca manualmente).
- Apoya la detección y selección de versiones.
- Intérprete estándar de Python (CLI).
- Abre consola interactiva o ejecuta scripts
.py. - Bloquea la terminal hasta finalizar el proceso.
#####python3-64.exe
- Intérprete Python versión 3, 64 bits.
- Alias explícito para evitar ambigüedad con Python 2 (histórico).
- No siempre presente en todas las instalaciones.
- Intérprete Python versión 3.13.x.
- Útil para pruebas o proyectos fijados a una versión concreta.
- Consola activa (stdout/stderr visibles).
- Intérprete Python versión 3.14.x, 64 bits.
- Instalación específica por arquitectura.
- Ideal para entornos que requieren consistencia binaria.
- Intérprete Python versión 3.14.x (arquitectura según instalación).
- Similar a
python.exepero versionado explícitamente.
- Alias genérico de Python 3.
- Puede apuntar a la versión 3 “predeterminada” del sistema.
- Útil en scripts y automatización.
- Intérprete Python sin consola (Windows GUI mode).
- Usado para aplicaciones gráficas (Tkinter, PyQt, etc.).
- No muestra salida por terminal.
- Python GUI (
pythonw) versión 3, 64 bits. - Pensado para aplicaciones gráficas modernas.
- Python GUI versión 3.13.x.
- Sin ventana de consola.
- Python GUI versión 3.14.x, 64 bits.
- Ideal para apps gráficas en entornos productivos.
- Python GUI versión 3.14.x (arquitectura según instalación).
- Variante sin consola del intérprete versionado.
- Alias genérico de Python 3 GUI.
- Selecciona la versión gráfica predeterminada.
- Python Launcher en modo GUI.
- Equivalente a
py.exe, pero sin consola. - Respeta
shebangy configuración del launcher.
- Gestor del launcher GUI.
- Parte del subsistema de selección de intérprete sin consola.
- Uso principalmente interno.
Abre una terminal (CMD, PowerShell o Git Bash) y ejecuta:
python --version
La salida debe ser:
Python 3.13.9
Si ves otra versión:
- revisa que no haya otra instalación anterior de Python
- o que el
PATHesté correctamente configurado
Para confirmar la ruta del intérprete:
which python
- Versiones anteriores de Python pueden no ser compatibles con algunas dependencias del proyecto.
- Se recomienda no usar Python 3.12 o inferior para evitar problemas con:
- Django
- Selenium
- dependencias tipadas
El proceso comienza con la creación de la estructura base del proyecto y la preparación de un entorno virtual aislado, con el objetivo de mantener las dependencias del proyecto separadas del Python global del sistema y evitar conflictos entre versiones o librerías. Se trabaja explícitamente con Python 3.13.9, garantizando coherencia con el resto del desarrollo y las herramientas utilizadas.
- Se crea el directorio raíz del proyecto y se accede a él:
mkdir webscraper
cd webscraper
# Se inicializa el archivo .gitignore para definir, desde el inicio, qué archivos o carpetas no deben versionarse (por ejemplo, el entorno virtual):
touch .gitignore
# Se crea un entorno virtual utilizando la versión específica de Python 3.13.9:
python3.13 -m venv .venv
# Se activa el entorno virtual en un entorno Windows con Git Bash, asegurando que los comandos posteriores utilicen el intérprete aislado:
source .venv/Scripts/activate
# Se verifica la versión activa de Python para confirmar que el entorno virtual está correctamente configurado:
python --version
# Este paso establece una base reproducible y controlada sobre la que se construirá el resto del proyecto.cat > .gitignore
# Entorno virtual
.venv/
# Python
__pycache__/
*.pyc
# Variables de entorno
.env
# IDEs
.vscode/
.idea/
# Archivos temporales de Microsoft Office
~$*.docxEn esta fase se instala el framework Django dentro del entorno virtual activo y se genera la estructura base del proyecto web.
El objetivo es disponer de un esqueleto funcional sobre el que empezar a desarrollar la aplicación.
Para ejecutar pip install django debes encontrarte en:
~/Proyectos/webscraper
Es decir, la raíz del proyecto, con el entorno virtual .venv activado. El directorio concreto no afecta técnicamente a pip, pero hacerlo desde la raíz facilita la gestión de dependencias (requirements.txt). Pasos realizados Instalación de Django en el entorno virtual:
pip install djangoCreación del proyecto Django:
django-admin startproject webscraper_projectAcceso al directorio del proyecto:
cd webscraper_projectEstructura del proyecto generada (desde webscraper)
webscraper/
├── README.md # Documentación inicial del proyecto
├── requirements.txt # Dependencias del proyecto (Django, etc.)
├── .venv/ # Entorno virtual (no versionado)
└── webscraper_project/
├── manage.py # Utilidad principal de administración Django
├── db.sqlite3 # Base de datos SQLite por defecto
├── scraper/ # Aplicación Django principal
│ ├── __init__.py # Marca el directorio como paquete Python
│ ├── admin.py # Registro de modelos en el admin de Django
│ ├── apps.py # Configuración de la app `scraper`
│ ├── models.py # Definición de modelos de datos
│ ├── views.py # Vistas (lógica de respuesta HTTP)
│ ├── tests.py # Tests de la aplicación
│ ├── migrations/ # Control de cambios en la base de datos
│ │ ├── __init__.py # Inicialización del paquete migrations
│ │ └── 0001_initial.py # Migración inicial de modelos
│ ├── services/ # Lógica de negocio desacoplada
│ │ ├── __init__.py # Inicialización del paquete services
│ │ ├── scrape.py # Lógica principal de scraping
│ │ ├── scrape_inline.py # Variante de scraping inline
│ │ └── scrape_ChatGPT_Corregido.py # Versión corregida/iterada del scraping
│ └── management/ # Comandos personalizados de Django
│ ├── __init__.py # Inicialización del paquete management
│ └── commands/
│ ├── __init__.py # Inicialización del paquete commands
│ └── scraper.py # Comando personalizado (`python manage.py scraper`)
└── webscraper_project/ # Configuración global del proyecto
├── __init__.py # Marca el paquete del proyecto
├── settings.py # Configuración principal de Django
├── urls.py # Definición de rutas (URL routing)
├── asgi.py # Punto de entrada ASGI (async)
└── wsgi.py # Punto de entrada WSGI (deploy clásico)
Observación técnica La estructura refleja una separación clara entre configuración del proyecto y lógica de aplicación, siguiendo buenas prácticas Django: webscraper_project/ (interno): configuración global. · scraper/: dominio funcional del scraping. · services/ y management/commands/: desacoplo de lógica y automatización.
Repasar:
find .
-type d (
-name ".git" -o
-name ".venv" -o
-name "pycache"
) -prune -o
-type f (
-name ".py" -o
-name ".md" -o
-name "manage.py" -o
-name "requirements.txt" -o
-name "db.sqlite3"
) -print
./README.md
./requirements.txt
./webscraper_project/db.sqlite3
./webscraper_project/manage.py
./webscraper_project/scraper/admin.py
./webscraper_project/scraper/apps.py
./webscraper_project/scraper/management/commands/scraper.py
./webscraper_project/scraper/management/commands/init.py
./webscraper_project/scraper/management/init.py
./webscraper_project/scraper/migrations/0001_initial.py
./webscraper_project/scraper/migrations/init.py
./webscraper_project/scraper/models.py
./webscraper_project/scraper/services/scrape.py
./webscraper_project/scraper/services/scrape_ChatGPT_Corregido.py
./webscraper_project/scraper/services/scrape_inline.py
./webscraper_project/scraper/services/init.py
./webscraper_project/scraper/tests.py
./webscraper_project/scraper/views.py
./webscraper_project/scraper/init.py
./webscraper_project/webscraper_project/asgi.py
./webscraper_project/webscraper_project/settings.py
./webscraper_project/webscraper_project/urls.py
./webscraper_project/webscraper_project/wsgi.py
./webscraper_project/webscraper_project/init.py
**Si quieres, el siguiente paso natural sería documentar: **registro de la app en INSTALLED_APPS **primer comando manage.py runserver **flujo completo de un comando de scraping **Dime cómo continuamos.
En esta fase se consolidan las dependencias del proyecto y se establece el control de versiones con Git, garantizando trazabilidad, reproducibilidad y una base sólida para el trabajo colaborativo.
Todo el proceso se realiza con el entorno virtual activado y desde la raíz del proyecto webscraper.
Se instalan las librerías necesarias para la automatización de navegadores y la gestión de drivers:
pip install selenium
pip install webdriver-managerA continuación, se congela el estado exacto de las dependencias instaladas:
pip freeze > requirements.txtEsto permite recrear el entorno en cualquier otro sistema mediante pip install -r requirements.txt.
Se inicializa el repositorio local y se prepara el proyecto para su versionado:
git initConfiguración de .gitignore El archivo .gitignore se ajusta para excluir elementos que no deben versionarse, como: Entorno virtual: .venv/ Archivos temporales de Microsoft Office: ~$*.docx
Se añade el estado actual del proyecto al área de staging y se realiza el commit inicial:
git add .
git commit -m "Estado inicial del proyecto webscraper"Este commit representa una línea base estable del proyecto.
Siguiendo una estrategia de ramas tipo Git Flow, cada commit local se sincroniza con la rama develop del repositorio remoto en GitHub. Pasos estándar tras cada commit Crear (si no existe) y cambiar a la rama develop:
git checkout -b develop**(Si ya existe, usar git checkout develop)
git remote add origin https://github.com/Jose-JulioRamirezySanchez-Escobar/<nombre-del-repositorio>.gitgit push -u origin developgit pushResultado del proceso Al finalizar esta fase se dispone de: Dependencias controladas y versionadas (requirements.txt) Repositorio Git inicializado y limpio Historial de cambios coherente Rama develop sincronizada con el repositorio remoto Este punto marca el inicio formal del desarrollo controlado del proyecto webscraper. **Si quieres, el siguiente paso lógico sería documentar: **la estrategia de ramas completa (develop / feature / main) **o el flujo de trabajo diario con commits y PRs
Sí, es posible crear el repositorio remoto directamente desde Git Bash, pero no con Git “puro”.
Para ello se utiliza la CLI oficial de GitHub, que permite autenticarse, crear repositorios y operar remotamente sin salir de la terminal.
La herramienta recomendada es :contentReference[oaicite:0]{index=0} CLI (gh).
- ❌
git remote add origin ...NO crea repositorios remotos - ✅
gh repo createSÍ crea el repositorio en GitHub - ✅ Todo el flujo puede hacerse desde Git Bash, tras autenticación
(solo una vez en el sistema)
winget install --id GitHub.cliVerificación:
gh --version- Autenticarse contra GitHub
gh auth loginSelección recomendada: Account: GitHub.com Protocol: HTTPS Authentication: Browser Authorize GitHub CLI ✔️ 📌 Tras esto, Git Bash queda autorizado para operar remotamente.
- Situarse en la raíz del proyecto local cd ~/Proyectos/webscraper Asegúrate de que: El repositorio Git está inicializado (git init) Hay al menos un commit
- Crear el repositorio remoto desde Git Bash
gh repo create webscraper \
--public \
--source=. \
--remote=origin \
--pushQué hace exactamente: Crea webscraper en tu cuenta de GitHub Lo vincula como origin Sube automáticamente la rama actual 5. (Opcional) Usar rama develop como flujo principal
git checkout -b develop
git push -u origin developA partir de aquí:
git pushes suficiente tras cada commit.
gh repo create webscraper --public
git remote add origin https://github.com/Jose-JulioRamirezySanchez-Escobar/webscraper.git
git push -u origin developÚtil si quieres más control manual. Flujo típico a partir de ahora
git add .
git commit -m "Mensaje claro"git pushConclusión técnica ✔️ Sí, puedes crear repositorios remotos desde Git Bash ✔️ La autenticación se gestiona una sola vez ✔️ gh convierte Git Bash en un cliente remoto completo ✔️ Ideal para flujos profesionales (Git Flow, PRs, automatización) Si quieres, el siguiente paso natural sería documentar: el flujo feature → develop → main o la automatización de releases y tags Dime cómo continuamos.
https://github.com/Jose-JulioRamirezySanchez-Escobar/webscraper.git
Coder@F5-LAPMAD-124 MINGW64 ~/Proyectos/webscraper (master)
$ git add .
git commit -m "Estado inicial del proyecto webscraper"
warning: in the working copy of 'webscraper_project/scraper/models.py', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.obsidian/core-plugins.json', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.obsidian/workspace.json', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'README.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'webscraper_project/.obsidian/core-plugins.json', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'webscraper_project/.obsidian/workspace.json', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'webscraper_project/scraper/management/commands/scraper.py', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'webscraper_project/scraper/services/scrape.py', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'webscraper_project/scraper/services/scrape_ChatGPT_Corregido.py', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'webscraper_project/scraper/services/scrape_inline.py', LF will be replaced by CRLF the next time Git touches it
[master 129be74] Estado inicial del proyecto webscraper
21 files changed, 1122 insertions(+)
create mode 100644 .obsidian/app.json
create mode 100644 .obsidian/appearance.json
create mode 100644 .obsidian/core-plugins.json
create mode 100644 .obsidian/workspace.json
create mode 100644 README.md
create mode 100644 docs/~WRL0977.tmp
create mode 100644 webscraper_project/.obsidian/app.json
create mode 100644 webscraper_project/.obsidian/appearance.json
create mode 100644 webscraper_project/.obsidian/core-plugins.json
create mode 100644 webscraper_project/.obsidian/workspace.json
create mode 100644 webscraper_project/db.sqlite3
create mode 100644 webscraper_project/scraper/management/__init__.py
create mode 100644 webscraper_project/scraper/management/commands/__init__.py
create mode 100644 webscraper_project/scraper/management/commands/scraper.py
create mode 100644 webscraper_project/scraper/migrations/0001_initial.py
create mode 100644 webscraper_project/scraper/services/__init__.py
create mode 100644 webscraper_project/scraper/services/scrape.py
create mode 100644 webscraper_project/scraper/services/scrape_ChatGPT_Corregido.py
create mode 100644 webscraper_project/scraper/services/scrape_inline.py
(.venv)
Coder@F5-LAPMAD-124 MINGW64 ~/Proyectos/webscraper (master)
$ git checkout -b develop
Switched to a new branch 'develop'
(.venv)
Coder@F5-LAPMAD-124 MINGW64 ~/Proyectos/webscraper (develop)
$ ls -l
total 32
-rw-r--r-- 1 Coder 197121 16700 Jan 31 05:18 README.md
drwxr-xr-x 1 Coder 197121 0 Jan 31 05:12 docs/
-rw-r--r-- 1 Coder 197121 646 Jan 29 12:57 requirements.txt
drwxr-xr-x 1 Coder 197121 0 Jan 30 06:47 webscraper_project/
(.venv)
Coder@F5-LAPMAD-124 MINGW64 ~/Proyectos/webscraper (develop)
$ git remote add origin https://github.com/Jose-JulioRamirezySanchez-Escobar/webscraper.git
(.venv)
Coder@F5-LAPMAD-124 MINGW64 ~/Proyectos/webscraper (develop)
$ git push -u origin develop
Enumerating objects: 59, done.
Counting objects: 100% (59/59), done.
Delta compression using up to 8 threads
Compressing objects: 100% (56/56), done.
Writing objects: 100% (59/59), 1.35 MiB | 1.81 MiB/s, done.
Total 59 (delta 14), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (14/14), done.
To https://github.com/Jose-JulioRamirezySanchez-Escobar/webscraper.git
* [new branch] develop -> develop
branch 'develop' set up to track 'origin/develop'.
(.venv)
Coder@F5-LAPMAD-124 MINGW64 ~/Proyectos/webscraper (develop)
$