link_scraper.py en Python
Raspar los enlaces de una página, separando internos de externos.
"""Raspa una página en busca de enlaces y cuenta internos y externos."""
import sys
from urllib.parse import urljoin, urlparse
import requests
from bs4 import BeautifulSoup
def extraer_enlaces(url):
respuesta = requests.get(url, timeout=10,
headers={"User-Agent": "typestar-bot/1.0"})
respuesta.raise_for_status()
sopa = BeautifulSoup(respuesta.text, "html.parser")
host = urlparse(url).netloc
internos, externos = [], []
for ancla in sopa.select("a[href]"):
completa = urljoin(url, ancla["href"])
destino = internos if urlparse(completa).netloc == host else externos
destino.append(completa)
return internos, externos
def principal():
url = sys.argv[1] if len(sys.argv) > 1 else "https://example.com"
try:
internos, externos = extraer_enlaces(url)
except requests.RequestException as exc:
print(f"no se pudo obtener {url}: {exc}")
raise SystemExit(1)
print(f"{url}")
print(f" enlaces internos: {len(internos)}")
print(f" enlaces externos: {len(externos)}")
for enlace in externos[:5]:
print(f" -> {enlace}")
if __name__ == "__main__":
principal()
Cómo funciona
- requests trae la página con un user agent.
- BeautifulSoup selecciona cada ancla con href.
urljoinyurlparseclasifican cada enlace.
Palabras clave y builtins usados aquí
asdefelseexceptforiflenprintraisereturntry
El intento, en números
- Líneas
- 38
- Caracteres a escribir
- 1059
- Tokens
- 256
- Ritmo de tres estrellas
- 115 tpm
Al ritmo de tres estrellas de 115 tokens por minuto, este intento toma unos 134 segundos.
Paso 1 de 1 en Bis; paso 9 de 9 en Web scraping.