Necesitas obtener el favicon de un sitio web en un script de Python — quizá para una vista previa de enlace, un gestor de marcadores o un dashboard de monitorización. La buena noticia: no necesitas una herramienta pesada de automatización de navegador. Con unas pocas líneas usando requests y BeautifulSoup lo tendrás resuelto.
Este tutorial te muestra exactamente cómo escribir una función python get favicon from url que cubra los casos habituales. Veremos cómo parsear el HTML, cómo recurrir a /favicon.ico como fallback y cómo guardar el archivo binario.
Requisitos
Necesitas Python 3.7+ y dos librerías: requests y beautifulsoup4. Instálalas con pip:
pip install requests beautifulsoup4Si prefieres no parsear HTML a mano, también puedes recurrir a una librería como favicon (disponible en PyPI), pero aquí lo construiremos desde cero para tener control total.
Paso 1: Descargar el HTML de la página
Empieza descargando el código fuente de la página. Usa un header User-Agent realista: algunos servidores bloquean las peticiones de Python por defecto.
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
def get_favicon_url(page_url):
headers = {'User-Agent': 'Mozilla/5.0 (compatible; FaviconFetcher/1.0)'}
resp = requests.get(page_url, headers=headers, timeout=10)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, 'html.parser')
# ... continue belowEstablece siempre un timeout. Sin él, un servidor lento puede dejar tu script colgado indefinidamente.
Paso 2: Buscar las etiquetas link rel="icon"
La especificación de HTML define rel="icon" como la forma estándar de declarar un favicon. Los navegadores también aceptan shortcut icon y apple-touch-icon. Los comprobaremos todos, dando preferencia a SVG y PNG frente a ICO.
icon_link = soup.find('link', rel=lambda x: x and 'icon' in x.lower())
if icon_link and icon_link.get('href'):
return urljoin(page_url, icon_link['href'])
# Fallback to /favicon.ico
parsed = urlparse(page_url)
return f'{parsed.scheme}://{parsed.netloc}/favicon.ico'Fíjate en el uso de urljoin: los href de los favicons suelen ser relativos (por ejemplo, /assets/favicon.png) y necesitas resolverlos respecto a la URL de la página.
Paso 3: Descargar y guardar el icono
Una vez que tengas la URL, obtén el contenido binario y guárdalo en un archivo. Comprueba la cabecera Content-Type para elegir la extensión adecuada.
def download_favicon(favicon_url, output_path='favicon.ico'):
headers = {'User-Agent': 'Mozilla/5.0 (compatible; FaviconFetcher/1.0)'}
resp = requests.get(favicon_url, headers=headers, timeout=10)
resp.raise_for_status()
content_type = resp.headers.get('Content-Type', '')
if 'png' in content_type:
output_path = output_path.replace('.ico', '.png')
elif 'svg' in content_type:
output_path = output_path.replace('.ico', '.svg')
with open(output_path, 'wb') as f:
f.write(resp.content)
return output_pathEsa es la lógica principal. Puedes envolver ambas funciones en un único script que tome una URL desde la línea de comandos.
Errores habituales
- URLs relativas: Resuélvelas siempre con
urljoin. Unhref="favicon.ico"sin resolver fallará si no lo haces. - Redirecciones:
requestssigue las redirecciones por defecto, pero la URL final puede cambiar. Usaresp.urlcomo base paraurljoinsi necesitas precisión. - Favicon ausente: Muchos sitios no tienen un
/favicon.ico. Tu fallback devolverá un 404: gestiónalo de forma elegante con un try/except. - Discrepancia en Content-Type: Algunos servidores sirven archivos ICO como
image/x-iconoimage/vnd.microsoft.icon. No te bases solo en la extensión. - Archivos grandes: Los favicon suelen ser pequeños, pero conviene establecer un límite máximo (por ejemplo, 1 MB) para evitar descargar archivos enormes por error.
Si necesitas extraer varios formatos de iconos (Apple Touch, iconos del manifest), considera usar una herramienta dedicada como Mzu favicondl para inspeccionar todos los iconos disponibles. Para profundizar en los formatos de favicon, consulta nuestra guía de formatos de favicon.
Conclusión
Ahora ya dispones de una función en Python que funciona para obtener un favicon a partir de cualquier URL. Los pasos clave son: obtener la página, analizar las etiquetas <link>, resolver las URL relativas y descargar el binario. Gestiona los errores y los casos límite, y listo.
Recuerda respetar robots.txt y los límites de solicitudes cuando hagas scraping de muchos sitios. Para una solución completa para obtener favicons, consulta nuestro tutorial de PHP y compara las opciones.
Comprueba los requisitos documentados
El estándar HTML define rel='icon' como la relación de enlace para un icono que representa la página actual.