# 🎌 Anime Scraper
Un scraper web robusto y escalable para extraer información de sitios de anime, comenzando con **AnimeFlv**. Este proyecto está diseñado con una arquitectura modular que permite agregar fácilmente nuevos sitios de anime en el futuro.
## 📋 Características
- 🔍 **Búsqueda de animes** por nombre con paginación
- 📊 **Información detallada** de animes (sinopsis, géneros, episodios, etc.)
- 🆕 **Animes más recientes** desde la página principal
- 📺 **Episodios recientes** con información actualizada
- 🔗 **Enlaces de reproducción** para episodios específicos
- 🛡️ **Protección anti-bot** usando cloudscraper
- 🏗️ **Arquitectura modular** para fácil extensión a nuevos sitios
## 🚀 Instalación
### Requisitos previos
- Python 3.8+
- pip (gestor de paquetes de Python)
### Instalación desde PyPI
```bash
pip install anime-api-scraper
```
**Dependencias incluidas:**
- `beautifulsoup4` - Parsing HTML
- `cloudscraper` - Evadir protecciones anti-bot
- `requests` - Peticiones HTTP
- `lxml` - Parser XML/HTML rápido
## 📁 Estructura del Proyecto
```
anime_api_scraper/
├── models/
│ └── data_models.py # Modelos de datos (AnimeInfo, SearchResponse, etc.)
├── processors/
│ ├── base_processors.py # Clase base para procesadores
│ └── animeflv_processors.py # Procesador específico para AnimeFlv
├── scraper/
│ ├── base_scraper.py # Clase base para scrapers
│ └── animeflv_scraper.py # Scraper específico para AnimeFlv
├── services/
│ ├── base_services.py # Clase base para servicios
│ └── animeflv_services.py # Servicio principal para AnimeFlv
└── utils/
└── exception.py # Excepciones personalizadas
```
## 🔧 Uso
### Inicialización del Servicio
```python
from anime_api_scraper import AnimeFLV
# Usando context manager (recomendado)
with AnimeFLV() as anime_service:
# Tu código aquí
pass
```
### Búsqueda de Animes
```python
with AnimeFLV() as anime_service:
# Buscar animes por nombre
resultados = anime_service.search_anime("Naruto", pagina=1)
print(f"Página {resultados.pagination.pagina_actual} de {resultados.pagination.pagina_total}")
for anime in resultados.results:
print(f"ID: {anime.anime_id}")
print(f"Nombre: {anime.nombre}")
print(f"Imagen: {anime.imagen}")
```
### Información Detallada de un Anime
```python
with AnimeFLV() as anime_service:
# Obtener información completa
anime_info = anime_service.anime_info("naruto-tv")
print(f"Nombre: {anime_info.nombre}")
print(f"Tipo: {anime_info.tipo}")
print(f"Géneros: {anime_info.genero}")
print(f"Descripción: {anime_info.descripcion}")
print(f"Estado: {anime_info.estado}")
print(f"Episodios disponibles: {len(anime_info.episodios)}")
if anime_info.proximo_episodio:
print(f"Próximo episodio: {anime_info.proximo_episodio}")
# Animes relacionados
for relacionado in anime_info.animes_relacionados:
print(f"- {relacionado.nombre} (ID: {relacionado.anime_id})")
```
### Animes y Episodios Recientes
```python
with AnimeFLV() as anime_service:
# Obtener animes más recientes
animes_recientes = anime_service.latest_anime()
for anime in animes_recientes:
print(f"{anime.nombre} - {anime.tipo} - ⭐{anime.puntaje}")
# Obtener episodios más recientes
episodios_recientes = anime_service.latest_episodes()
for episodio in episodios_recientes:
print(f"{episodio.nombre} - Episodio {episodio.episodio}")
```
### Enlaces de Reproducción
```python
with AnimeFLV() as anime_service:
# Obtener enlaces para un episodio específico
enlaces = anime_service.links("naruto", "1")
for enlace in enlaces:
print(f"Servidor: {enlace.server}")
print(f"Título: {enlace.titulo}")
print(f"URL: {enlace.url}")
```
## 📊 Modelos de Datos
### AnimeSearchResult
Información básica para resultados de búsqueda:
- `anime_id`: Identificador único
- `nombre`: Título del anime
- `imagen`: URL de la imagen de portada
### AnimeInfo
Información completa del anime:
- `anime_id`: Identificador único
- `nombre`: Título completo
- `tipo`: Tipo (TV, Movie, OVA, etc.)
- `genero`: Géneros separados por comas
- `descripcion`: Sinopsis del anime
- `animes_relacionados`: Lista de animes relacionados
- `episodios`: Lista de números de episodios disponibles
- `estado`: Estado de emisión (En emisión, Finalizado, etc.)
- `proximo_episodio`: Fecha del próximo episodio (si aplica)
### LatestAnime
Información de animes recientes:
- `anime_id`: Identificador único
- `nombre`: Título del anime
- `tipo`: Tipo de anime
- `puntaje`: Puntuación (rating)
- `descripción`: Descripción breve
- `imagen`: URL de la imagen
### LatestEpisodes
Información de episodios recientes:
- `anime_id`: Identificador del anime
- `nombre`: Nombre del anime
- `episodio`: Número del episodio
- `imagen`: URL de la imagen del episodio
## 🏗️ Arquitectura
### Patrón de Diseño
El proyecto utiliza una **arquitectura modular** basada en el patrón de responsabilidad única:
1. **Services** (`BaseServices` → `AnimeFLVServices`)
- Capa de abstracción principal para el cliente
- Gestión optimizada de recursos y contexto
- API limpia y consistente
2. **Scrapers** (`BaseScraper` → `AnimeFLVScraper`)
- Manejan las peticiones HTTP
- Coordinan el flujo de scraping
- Gestionan la sesión y configuración específica del sitio
3. **Processors** (`BaseProcessors` → `AnimeFLVProcessors`)
- Procesan el HTML crudo
- Extraen y estructuran los datos
- Convierten HTML en objetos Python
4. **Models** (`data_models.py`)
- Definen la estructura de datos
- Validan tipos usando dataclasses
- Proporcionan consistencia entre componentes
### Ventajas de esta Arquitectura
- ✅ **Escalabilidad**: Fácil agregar nuevos sitios
- ✅ **Mantenibilidad**: Separación clara de responsabilidades
- ✅ **Reutilización**: Componentes base reutilizables
- ✅ **Testeo**: Cada componente se puede testear independientemente
## 🔮 Extensibilidad
Para agregar un nuevo sitio de anime (ej: Crunchyroll):
1. **Crear el procesador específico**:
```python
from anime_api_scraper.processors.base_processors import BaseProcessors
class CrunchyrollProcessors(BaseProcessors):
def process_search(self, response):
# Lógica específica para Crunchyroll
pass
```
2. **Crear el scraper específico**:
```python
from anime_api_scraper.scraper.base_scraper import BaseScraper
class CrunchyrollScraper(BaseScraper):
def __init__(self):
self._base_url = "https://crunchyroll.com"
self._processor = CrunchyrollProcessors()
```
3. **Crear el servicio específico**:
```python
from anime_api_scraper.services.base_services import BaseServices
class CrunchyrollServices(BaseServices):
def __init__(self):
super().__init__()
self._scraper = CrunchyrollScraper()
```
## ⚡ Manejo de Errores
El proyecto incluye manejo robusto de errores:
### AnimeException
Excepción personalizada que incluye:
- `message`: Descripción del error
- `metodo`: Método donde ocurrió el error
- `source`: Fuente del error (ej: "animeflv")
### Validaciones Comunes
- ✅ Validación de parámetros de entrada
- ✅ Verificación de elementos HTML existentes
- ✅ Manejo de contenido malformado
- ✅ Timeout y errores de conectividad
## 🛡️ Características Técnicas
### Anti-Bot Protection
- Utiliza `cloudscraper` para evadir protecciones Cloudflare
- Headers realistas de navegador
- Manejo automático de challenges JavaScript
### Parsing Robusto
- Múltiples selectores CSS como fallback
- Validación de datos extraídos
- Manejo graceful de contenido faltante
### Performance
- Sesión persistente para múltiples requests
- Parser `lxml` para velocidad optimizada
- Context managers para gestión eficiente de recursos
## 📝 Ejemplos Avanzados
### Búsqueda con Paginación Completa
```python
def buscar_anime_completo(nombre):
"""Busca un anime en todas las páginas disponibles."""
from anime_api_scraper import AnimeFLV
with AnimeFLV() as anime_service:
todos_resultados = []
pagina = 1
while True:
resultado = anime_service.search_anime(nombre, pagina)
todos_resultados.extend(resultado.results)
if pagina >= resultado.pagination.pagina_total:
break
pagina += 1
return todos_resultados
```
### Información Completa de un Anime
```python
def info_anime_completa(anime_id):
"""Obtiene toda la información disponible de un anime."""
from anime_api_scraper import AnimeFLV
with AnimeFLV() as anime_service:
info = anime_service.anime_info(anime_id)
# Obtener enlaces del primer episodio si está disponible
enlaces = []
if info.episodios:
try:
enlaces = anime_service.links(anime_id, info.episodios[0])
except Exception as e:
print(f"No se pudieron obtener enlaces: {e}")
return {
'info': info,
'enlaces_primer_episodio': enlaces
}
```
## 🤝 Contribuir
1. Fork el repositorio
2. Crea una rama para tu feature (`git checkout -b feature/nueva-funcionalidad`)
3. Commit tus cambios (`git commit -am 'Agrega nueva funcionalidad'`)
4. Push a la rama (`git push origin feature/nueva-funcionalidad`)
5. Crea un Pull Request
### Guías para Contribuir
- Sigue el estilo de código existente
- Agrega docstrings a todas las funciones públicas
- Incluye manejo de errores apropiado
- Escribe tests para nuevas funcionalidades
## ⚠️ Consideraciones Legales
Este proyecto está diseñado para **uso educativo y personal**. Los usuarios son responsables de:
- Cumplir con los términos de servicio de los sitios web
- Respetar los derechos de autor del contenido
- Usar el scraper de manera responsable y ética
- No sobrecargar los servidores con requests excesivos
## 🐛 Resolución de Problemas
### Errores Comunes
**Error: "No se encontraron resultados"**
- Verifica que el nombre del anime esté escrito correctamente
- Algunos animes pueden tener nombres específicos en el sitio
**Error de conexión**
- Verifica tu conexión a internet
- El sitio podría estar temporalmente inaccesible
- Considera implementar reintentos automáticos
**Error: "No se pudieron obtener enlaces"**
- Verifica que el anime_id y número de episodio sean correctos
- Algunos episodios pueden no tener enlaces disponibles
## 🔄 Roadmap
### Versión Actual (v1.0)
- ✅ Scraper completo para AnimeFlv
- ✅ Búsqueda, información detallada y enlaces
- ✅ Manejo robusto de errores
### Futuras Versiones
- 📋 Soporte para múltiples sitios de anime
- 🔄 Sistema de cache para mejorar performance
- 📊 API REST para acceso programático
- 🤖 Rate limiting inteligente
- 📱 Interfaz web para uso fácil
- 🔍 Búsqueda avanzada con filtros
- 📈 Estadísticas y analytics
## 🏷️ Versionado
Utilizamos [SemVer](http://semver.org/) para el versionado. Para las versiones disponibles, revisa los [tags de este repositorio](https://github.com/dst3v3n/Anime-Api/tags).
## 📄 Licencia
Este proyecto está bajo la Licencia MIT - revisa el archivo [LICENSE](LICENSE) para más detalles.
## 👥 Autores
- **DSt3v3n** - *Desarrollo inicial* - [dst3v3n](https://github.com/dst3v3n)
## 🙏 Agradecimientos
- Comunidad de desarrolladores de Python
- Mantenedores de BeautifulSoup y cloudscraper
- Sitios de anime que proporcionan contenido a los fans
## 📞 Soporte
Si encuentras algún problema o tienes preguntas:
1. Revisa la sección de [Issues](https://github.com/dst3v3n/Anime-Api/issues)
2. Crea un nuevo issue con detalles del problema
3. Incluye información de tu entorno (Python version, OS, etc.)
---
**⚡ ¿Te gusta el proyecto?** ¡Dale una estrella ⭐ en GitHub!
Raw data
{
"_id": null,
"home_page": null,
"name": "anime-api-scraper",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "anime, scraper, web-scraping, animeflv, streaming",
"author": null,
"author_email": "DSt3v3n <haroldsabogal48@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/59/c7/bd50893268dfc9ff81cfd57e1eb3258f8a64a8a8a7db077de973f4485ab8/anime_api_scraper-1.0.1.tar.gz",
"platform": null,
"description": "# \ud83c\udf8c Anime Scraper\n\nUn scraper web robusto y escalable para extraer informaci\u00f3n de sitios de anime, comenzando con **AnimeFlv**. Este proyecto est\u00e1 dise\u00f1ado con una arquitectura modular que permite agregar f\u00e1cilmente nuevos sitios de anime en el futuro.\n\n## \ud83d\udccb Caracter\u00edsticas\n\n- \ud83d\udd0d **B\u00fasqueda de animes** por nombre con paginaci\u00f3n\n- \ud83d\udcca **Informaci\u00f3n detallada** de animes (sinopsis, g\u00e9neros, episodios, etc.)\n- \ud83c\udd95 **Animes m\u00e1s recientes** desde la p\u00e1gina principal\n- \ud83d\udcfa **Episodios recientes** con informaci\u00f3n actualizada\n- \ud83d\udd17 **Enlaces de reproducci\u00f3n** para episodios espec\u00edficos\n- \ud83d\udee1\ufe0f **Protecci\u00f3n anti-bot** usando cloudscraper\n- \ud83c\udfd7\ufe0f **Arquitectura modular** para f\u00e1cil extensi\u00f3n a nuevos sitios\n\n## \ud83d\ude80 Instalaci\u00f3n\n\n### Requisitos previos\n\n- Python 3.8+\n- pip (gestor de paquetes de Python)\n\n### Instalaci\u00f3n desde PyPI\n\n```bash\npip install anime-api-scraper\n```\n\n**Dependencias incluidas:**\n- `beautifulsoup4` - Parsing HTML\n- `cloudscraper` - Evadir protecciones anti-bot\n- `requests` - Peticiones HTTP\n- `lxml` - Parser XML/HTML r\u00e1pido\n\n## \ud83d\udcc1 Estructura del Proyecto\n\n```\nanime_api_scraper/\n\u251c\u2500\u2500 models/\n\u2502 \u2514\u2500\u2500 data_models.py # Modelos de datos (AnimeInfo, SearchResponse, etc.)\n\u251c\u2500\u2500 processors/\n\u2502 \u251c\u2500\u2500 base_processors.py # Clase base para procesadores\n\u2502 \u2514\u2500\u2500 animeflv_processors.py # Procesador espec\u00edfico para AnimeFlv\n\u251c\u2500\u2500 scraper/\n\u2502 \u251c\u2500\u2500 base_scraper.py # Clase base para scrapers\n\u2502 \u2514\u2500\u2500 animeflv_scraper.py # Scraper espec\u00edfico para AnimeFlv\n\u251c\u2500\u2500 services/\n\u2502 \u251c\u2500\u2500 base_services.py # Clase base para servicios\n\u2502 \u2514\u2500\u2500 animeflv_services.py # Servicio principal para AnimeFlv\n\u2514\u2500\u2500 utils/\n \u2514\u2500\u2500 exception.py # Excepciones personalizadas\n```\n\n## \ud83d\udd27 Uso\n\n### Inicializaci\u00f3n del Servicio\n\n```python\nfrom anime_api_scraper import AnimeFLV\n\n# Usando context manager (recomendado)\nwith AnimeFLV() as anime_service:\n # Tu c\u00f3digo aqu\u00ed\n pass\n```\n\n### B\u00fasqueda de Animes\n\n```python\nwith AnimeFLV() as anime_service:\n # Buscar animes por nombre\n resultados = anime_service.search_anime(\"Naruto\", pagina=1)\n \n print(f\"P\u00e1gina {resultados.pagination.pagina_actual} de {resultados.pagination.pagina_total}\")\n \n for anime in resultados.results:\n print(f\"ID: {anime.anime_id}\")\n print(f\"Nombre: {anime.nombre}\")\n print(f\"Imagen: {anime.imagen}\")\n```\n\n### Informaci\u00f3n Detallada de un Anime\n\n```python\nwith AnimeFLV() as anime_service:\n # Obtener informaci\u00f3n completa\n anime_info = anime_service.anime_info(\"naruto-tv\")\n \n print(f\"Nombre: {anime_info.nombre}\")\n print(f\"Tipo: {anime_info.tipo}\")\n print(f\"G\u00e9neros: {anime_info.genero}\")\n print(f\"Descripci\u00f3n: {anime_info.descripcion}\")\n print(f\"Estado: {anime_info.estado}\")\n print(f\"Episodios disponibles: {len(anime_info.episodios)}\")\n \n if anime_info.proximo_episodio:\n print(f\"Pr\u00f3ximo episodio: {anime_info.proximo_episodio}\")\n \n # Animes relacionados\n for relacionado in anime_info.animes_relacionados:\n print(f\"- {relacionado.nombre} (ID: {relacionado.anime_id})\")\n```\n\n### Animes y Episodios Recientes\n\n```python\nwith AnimeFLV() as anime_service:\n # Obtener animes m\u00e1s recientes\n animes_recientes = anime_service.latest_anime()\n \n for anime in animes_recientes:\n print(f\"{anime.nombre} - {anime.tipo} - \u2b50{anime.puntaje}\")\n \n # Obtener episodios m\u00e1s recientes\n episodios_recientes = anime_service.latest_episodes()\n \n for episodio in episodios_recientes:\n print(f\"{episodio.nombre} - Episodio {episodio.episodio}\")\n```\n\n### Enlaces de Reproducci\u00f3n\n\n```python\nwith AnimeFLV() as anime_service:\n # Obtener enlaces para un episodio espec\u00edfico\n enlaces = anime_service.links(\"naruto\", \"1\")\n \n for enlace in enlaces:\n print(f\"Servidor: {enlace.server}\")\n print(f\"T\u00edtulo: {enlace.titulo}\")\n print(f\"URL: {enlace.url}\")\n```\n\n## \ud83d\udcca Modelos de Datos\n\n### AnimeSearchResult\nInformaci\u00f3n b\u00e1sica para resultados de b\u00fasqueda:\n- `anime_id`: Identificador \u00fanico\n- `nombre`: T\u00edtulo del anime\n- `imagen`: URL de la imagen de portada\n\n### AnimeInfo\nInformaci\u00f3n completa del anime:\n- `anime_id`: Identificador \u00fanico\n- `nombre`: T\u00edtulo completo\n- `tipo`: Tipo (TV, Movie, OVA, etc.)\n- `genero`: G\u00e9neros separados por comas\n- `descripcion`: Sinopsis del anime\n- `animes_relacionados`: Lista de animes relacionados\n- `episodios`: Lista de n\u00fameros de episodios disponibles\n- `estado`: Estado de emisi\u00f3n (En emisi\u00f3n, Finalizado, etc.)\n- `proximo_episodio`: Fecha del pr\u00f3ximo episodio (si aplica)\n\n### LatestAnime\nInformaci\u00f3n de animes recientes:\n- `anime_id`: Identificador \u00fanico\n- `nombre`: T\u00edtulo del anime\n- `tipo`: Tipo de anime\n- `puntaje`: Puntuaci\u00f3n (rating)\n- `descripci\u00f3n`: Descripci\u00f3n breve\n- `imagen`: URL de la imagen\n\n### LatestEpisodes\nInformaci\u00f3n de episodios recientes:\n- `anime_id`: Identificador del anime\n- `nombre`: Nombre del anime\n- `episodio`: N\u00famero del episodio\n- `imagen`: URL de la imagen del episodio\n\n## \ud83c\udfd7\ufe0f Arquitectura\n\n### Patr\u00f3n de Dise\u00f1o\n\nEl proyecto utiliza una **arquitectura modular** basada en el patr\u00f3n de responsabilidad \u00fanica:\n\n1. **Services** (`BaseServices` \u2192 `AnimeFLVServices`)\n - Capa de abstracci\u00f3n principal para el cliente\n - Gesti\u00f3n optimizada de recursos y contexto\n - API limpia y consistente\n\n2. **Scrapers** (`BaseScraper` \u2192 `AnimeFLVScraper`)\n - Manejan las peticiones HTTP\n - Coordinan el flujo de scraping\n - Gestionan la sesi\u00f3n y configuraci\u00f3n espec\u00edfica del sitio\n\n3. **Processors** (`BaseProcessors` \u2192 `AnimeFLVProcessors`)\n - Procesan el HTML crudo\n - Extraen y estructuran los datos\n - Convierten HTML en objetos Python\n\n4. **Models** (`data_models.py`)\n - Definen la estructura de datos\n - Validan tipos usando dataclasses\n - Proporcionan consistencia entre componentes\n\n### Ventajas de esta Arquitectura\n\n- \u2705 **Escalabilidad**: F\u00e1cil agregar nuevos sitios\n- \u2705 **Mantenibilidad**: Separaci\u00f3n clara de responsabilidades\n- \u2705 **Reutilizaci\u00f3n**: Componentes base reutilizables\n- \u2705 **Testeo**: Cada componente se puede testear independientemente\n\n## \ud83d\udd2e Extensibilidad\n\nPara agregar un nuevo sitio de anime (ej: Crunchyroll):\n\n1. **Crear el procesador espec\u00edfico**:\n```python\nfrom anime_api_scraper.processors.base_processors import BaseProcessors\n\nclass CrunchyrollProcessors(BaseProcessors):\n def process_search(self, response):\n # L\u00f3gica espec\u00edfica para Crunchyroll\n pass\n```\n\n2. **Crear el scraper espec\u00edfico**:\n```python\nfrom anime_api_scraper.scraper.base_scraper import BaseScraper\n\nclass CrunchyrollScraper(BaseScraper):\n def __init__(self):\n self._base_url = \"https://crunchyroll.com\"\n self._processor = CrunchyrollProcessors()\n```\n\n3. **Crear el servicio espec\u00edfico**:\n```python\nfrom anime_api_scraper.services.base_services import BaseServices\n\nclass CrunchyrollServices(BaseServices):\n def __init__(self):\n super().__init__()\n self._scraper = CrunchyrollScraper()\n```\n\n## \u26a1 Manejo de Errores\n\nEl proyecto incluye manejo robusto de errores:\n\n### AnimeException\nExcepci\u00f3n personalizada que incluye:\n- `message`: Descripci\u00f3n del error\n- `metodo`: M\u00e9todo donde ocurri\u00f3 el error\n- `source`: Fuente del error (ej: \"animeflv\")\n\n### Validaciones Comunes\n- \u2705 Validaci\u00f3n de par\u00e1metros de entrada\n- \u2705 Verificaci\u00f3n de elementos HTML existentes\n- \u2705 Manejo de contenido malformado\n- \u2705 Timeout y errores de conectividad\n\n## \ud83d\udee1\ufe0f Caracter\u00edsticas T\u00e9cnicas\n\n### Anti-Bot Protection\n- Utiliza `cloudscraper` para evadir protecciones Cloudflare\n- Headers realistas de navegador\n- Manejo autom\u00e1tico de challenges JavaScript\n\n### Parsing Robusto\n- M\u00faltiples selectores CSS como fallback\n- Validaci\u00f3n de datos extra\u00eddos\n- Manejo graceful de contenido faltante\n\n### Performance\n- Sesi\u00f3n persistente para m\u00faltiples requests\n- Parser `lxml` para velocidad optimizada\n- Context managers para gesti\u00f3n eficiente de recursos\n\n## \ud83d\udcdd Ejemplos Avanzados\n\n### B\u00fasqueda con Paginaci\u00f3n Completa\n\n```python\ndef buscar_anime_completo(nombre):\n \"\"\"Busca un anime en todas las p\u00e1ginas disponibles.\"\"\"\n from anime_api_scraper import AnimeFLV\n \n with AnimeFLV() as anime_service:\n todos_resultados = []\n pagina = 1\n \n while True:\n resultado = anime_service.search_anime(nombre, pagina)\n todos_resultados.extend(resultado.results)\n \n if pagina >= resultado.pagination.pagina_total:\n break\n pagina += 1\n \n return todos_resultados\n```\n\n### Informaci\u00f3n Completa de un Anime\n\n```python\ndef info_anime_completa(anime_id):\n \"\"\"Obtiene toda la informaci\u00f3n disponible de un anime.\"\"\"\n from anime_api_scraper import AnimeFLV\n \n with AnimeFLV() as anime_service:\n info = anime_service.anime_info(anime_id)\n \n # Obtener enlaces del primer episodio si est\u00e1 disponible\n enlaces = []\n if info.episodios:\n try:\n enlaces = anime_service.links(anime_id, info.episodios[0])\n except Exception as e:\n print(f\"No se pudieron obtener enlaces: {e}\")\n \n return {\n 'info': info,\n 'enlaces_primer_episodio': enlaces\n }\n```\n\n## \ud83e\udd1d Contribuir\n\n1. Fork el repositorio\n2. Crea una rama para tu feature (`git checkout -b feature/nueva-funcionalidad`)\n3. Commit tus cambios (`git commit -am 'Agrega nueva funcionalidad'`)\n4. Push a la rama (`git push origin feature/nueva-funcionalidad`)\n5. Crea un Pull Request\n\n### Gu\u00edas para Contribuir\n\n- Sigue el estilo de c\u00f3digo existente\n- Agrega docstrings a todas las funciones p\u00fablicas\n- Incluye manejo de errores apropiado\n- Escribe tests para nuevas funcionalidades\n\n## \u26a0\ufe0f Consideraciones Legales\n\nEste proyecto est\u00e1 dise\u00f1ado para **uso educativo y personal**. Los usuarios son responsables de:\n\n- Cumplir con los t\u00e9rminos de servicio de los sitios web\n- Respetar los derechos de autor del contenido\n- Usar el scraper de manera responsable y \u00e9tica\n- No sobrecargar los servidores con requests excesivos\n\n## \ud83d\udc1b Resoluci\u00f3n de Problemas\n\n### Errores Comunes\n\n**Error: \"No se encontraron resultados\"**\n- Verifica que el nombre del anime est\u00e9 escrito correctamente\n- Algunos animes pueden tener nombres espec\u00edficos en el sitio\n\n**Error de conexi\u00f3n**\n- Verifica tu conexi\u00f3n a internet\n- El sitio podr\u00eda estar temporalmente inaccesible\n- Considera implementar reintentos autom\u00e1ticos\n\n**Error: \"No se pudieron obtener enlaces\"**\n- Verifica que el anime_id y n\u00famero de episodio sean correctos\n- Algunos episodios pueden no tener enlaces disponibles\n\n## \ud83d\udd04 Roadmap\n\n### Versi\u00f3n Actual (v1.0)\n- \u2705 Scraper completo para AnimeFlv\n- \u2705 B\u00fasqueda, informaci\u00f3n detallada y enlaces\n- \u2705 Manejo robusto de errores\n\n### Futuras Versiones\n- \ud83d\udccb Soporte para m\u00faltiples sitios de anime\n- \ud83d\udd04 Sistema de cache para mejorar performance\n- \ud83d\udcca API REST para acceso program\u00e1tico\n- \ud83e\udd16 Rate limiting inteligente\n- \ud83d\udcf1 Interfaz web para uso f\u00e1cil\n- \ud83d\udd0d B\u00fasqueda avanzada con filtros\n- \ud83d\udcc8 Estad\u00edsticas y analytics\n\n## \ud83c\udff7\ufe0f Versionado\n\nUtilizamos [SemVer](http://semver.org/) para el versionado. Para las versiones disponibles, revisa los [tags de este repositorio](https://github.com/dst3v3n/Anime-Api/tags).\n\n## \ud83d\udcc4 Licencia\n\nEste proyecto est\u00e1 bajo la Licencia MIT - revisa el archivo [LICENSE](LICENSE) para m\u00e1s detalles.\n\n## \ud83d\udc65 Autores\n\n- **DSt3v3n** - *Desarrollo inicial* - [dst3v3n](https://github.com/dst3v3n)\n\n## \ud83d\ude4f Agradecimientos\n\n- Comunidad de desarrolladores de Python\n- Mantenedores de BeautifulSoup y cloudscraper\n- Sitios de anime que proporcionan contenido a los fans\n\n## \ud83d\udcde Soporte\n\nSi encuentras alg\u00fan problema o tienes preguntas:\n\n1. Revisa la secci\u00f3n de [Issues](https://github.com/dst3v3n/Anime-Api/issues)\n2. Crea un nuevo issue con detalles del problema\n3. Incluye informaci\u00f3n de tu entorno (Python version, OS, etc.)\n\n---\n\n**\u26a1 \u00bfTe gusta el proyecto?** \u00a1Dale una estrella \u2b50 en GitHub!\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Scraper robusto para extraer informaci\u00f3n de sitios de anime, comenzando con AnimeFlv",
"version": "1.0.1",
"project_urls": {
"Bug Tracker": "https://github.com/dst3v3n/Anime-Api/issues",
"Documentation": "https://github.com/dst3v3n/Anime-Api#readme",
"Homepage": "https://github.com/dst3v3n/Anime-Api",
"Repository": "https://github.com/dst3v3n/Anime-Api.git"
},
"split_keywords": [
"anime",
" scraper",
" web-scraping",
" animeflv",
" streaming"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "073bc079af67db366f4cb1f207e0dc6610f647ac6b316b8a75504646b9fd974c",
"md5": "e6a846c07b0db1ecd789df03d423456c",
"sha256": "a9f9ca6521698178069bbff2479774d68cea8c0d1b36621f06eed72095d3b305"
},
"downloads": -1,
"filename": "anime_api_scraper-1.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e6a846c07b0db1ecd789df03d423456c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 21743,
"upload_time": "2025-08-11T02:54:56",
"upload_time_iso_8601": "2025-08-11T02:54:56.625933Z",
"url": "https://files.pythonhosted.org/packages/07/3b/c079af67db366f4cb1f207e0dc6610f647ac6b316b8a75504646b9fd974c/anime_api_scraper-1.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "59c7bd50893268dfc9ff81cfd57e1eb3258f8a64a8a8a7db077de973f4485ab8",
"md5": "bde35be1c3bab73742187e6afbf5c792",
"sha256": "35942e79f045bfe4df0c4d731fc93bab91f2014a749aa202f2316cc44a1be294"
},
"downloads": -1,
"filename": "anime_api_scraper-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "bde35be1c3bab73742187e6afbf5c792",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 22098,
"upload_time": "2025-08-11T02:54:57",
"upload_time_iso_8601": "2025-08-11T02:54:57.604116Z",
"url": "https://files.pythonhosted.org/packages/59/c7/bd50893268dfc9ff81cfd57e1eb3258f8a64a8a8a7db077de973f4485ab8/anime_api_scraper-1.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-11 02:54:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "dst3v3n",
"github_project": "Anime-Api",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "anime-api-scraper"
}