
Security News
Another Round of TEA Protocol Spam Floods npm, But It’s Not a Worm
Recent coverage mislabels the latest TEA protocol spam as a worm. Here’s what’s actually happening.
anime-api-scraper
Advanced tools
Scraper robusto para extraer información de sitios de anime, comenzando con AnimeFlv
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.
pip install anime-api-scraper
Dependencias incluidas:
beautifulsoup4 - Parsing HTMLcloudscraper - Evadir protecciones anti-botrequests - Peticiones HTTPlxml - Parser XML/HTML rápidoanime_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
from anime_api_scraper import AnimeFLV
# Usando context manager (recomendado)
with AnimeFLV() as anime_service:
# Tu código aquí
pass
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}")
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})")
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}")
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}")
Información básica para resultados de búsqueda:
anime_id: Identificador úniconombre: Título del animeimagen: URL de la imagen de portadaInformación completa del anime:
anime_id: Identificador úniconombre: Título completotipo: Tipo (TV, Movie, OVA, etc.)genero: Géneros separados por comasdescripcion: Sinopsis del animeanimes_relacionados: Lista de animes relacionadosepisodios: Lista de números de episodios disponiblesestado: Estado de emisión (En emisión, Finalizado, etc.)proximo_episodio: Fecha del próximo episodio (si aplica)Información de animes recientes:
anime_id: Identificador úniconombre: Título del animetipo: Tipo de animepuntaje: Puntuación (rating)descripción: Descripción breveimagen: URL de la imagenInformación de episodios recientes:
anime_id: Identificador del animenombre: Nombre del animeepisodio: Número del episodioimagen: URL de la imagen del episodioEl proyecto utiliza una arquitectura modular basada en el patrón de responsabilidad única:
Services (BaseServices → AnimeFLVServices)
Scrapers (BaseScraper → AnimeFLVScraper)
Processors (BaseProcessors → AnimeFLVProcessors)
Models (data_models.py)
Para agregar un nuevo sitio de anime (ej: Crunchyroll):
from anime_api_scraper.processors.base_processors import BaseProcessors
class CrunchyrollProcessors(BaseProcessors):
def process_search(self, response):
# Lógica específica para Crunchyroll
pass
from anime_api_scraper.scraper.base_scraper import BaseScraper
class CrunchyrollScraper(BaseScraper):
def __init__(self):
self._base_url = "https://crunchyroll.com"
self._processor = CrunchyrollProcessors()
from anime_api_scraper.services.base_services import BaseServices
class CrunchyrollServices(BaseServices):
def __init__(self):
super().__init__()
self._scraper = CrunchyrollScraper()
El proyecto incluye manejo robusto de errores:
Excepción personalizada que incluye:
message: Descripción del errormetodo: Método donde ocurrió el errorsource: Fuente del error (ej: "animeflv")cloudscraper para evadir protecciones Cloudflarelxml para velocidad optimizadadef 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
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
}
git checkout -b feature/nueva-funcionalidad)git commit -am 'Agrega nueva funcionalidad')git push origin feature/nueva-funcionalidad)Este proyecto está diseñado para uso educativo y personal. Los usuarios son responsables de:
Error: "No se encontraron resultados"
Error de conexión
Error: "No se pudieron obtener enlaces"
Utilizamos SemVer para el versionado. Para las versiones disponibles, revisa los tags de este repositorio.
Este proyecto está bajo la Licencia MIT - revisa el archivo LICENSE para más detalles.
Si encuentras algún problema o tienes preguntas:
⚡ ¿Te gusta el proyecto? ¡Dale una estrella ⭐ en GitHub!
FAQs
Scraper robusto para extraer información de sitios de anime, comenzando con AnimeFlv
We found that anime-api-scraper demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Recent coverage mislabels the latest TEA protocol spam as a worm. Here’s what’s actually happening.

Security News
PyPI adds Trusted Publishing support for GitLab Self-Managed as adoption reaches 25% of uploads

Research
/Security News
A malicious Chrome extension posing as an Ethereum wallet steals seed phrases by encoding them into Sui transactions, enabling full wallet takeover.