anime-api-scraper


Nameanime-api-scraper JSON
Version 1.0.1 PyPI version JSON
download
home_pageNone
SummaryScraper robusto para extraer información de sitios de anime, comenzando con AnimeFlv
upload_time2025-08-11 02:54:57
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords anime scraper web-scraping animeflv streaming
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 🎌 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"
}
        
Elapsed time: 1.06617s