Analiza cada fila de proxy como una unidad. Si aplanas cada td coincidente de la página y agrupas los resultados por un recuento fijo, una dirección de una fila puede emparejarse con un puerto de la siguiente cuando falta una celda o aparece otra tabla.

Para el HTML que la aplicación ya obtuvo, una tabla cuyas dos primeras columnas son dirección IP y puerto puede analizarse así:

import ipaddress
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")
table = soup.select_one(table_selector)
if table is None:
    raise ValueError("Expected proxy table was not found")

endpoints = set()
for row in table.select("tbody tr"):
    cells = row.find_all("td", recursive=False)
    if len(cells) < 2:
        continue
    try:
        address = ipaddress.ip_address(cells[0].get_text(strip=True))
        port = int(cells[1].get_text(strip=True))
    except ValueError:
        continue
    if 1 <= port <= 65535:
        endpoints.add((str(address), port))

html y table_selector son entradas de la aplicación. Elige el selector y la asignación de columnas a partir del marcado real de la fuente. La lista de proxies gratuitos es una fuente de registros de extremos, pero conviene inspeccionar sus filas antes de elegir esa asignación. Ni un ID de tabla histórico ni la afirmación de que una página contiene exactamente 300 registros son un esquema duradero.

El conjunto elimina los pares dirección-puerto duplicados y conserva la asociación de cada par. Aun así, una importación inesperada con cero resultados debe investigarse: la tabla puede haber cambiado o el documento descargado puede ser una página de desafío en lugar del listado.

Conserva cualquier protocolo anunciado y los campos de hora de comprobación junto al extremo cuando importen. Extraer una IP y un puerto plausibles establece el formato, no que el extremo ofrezca ahora un servicio HTTP o SOCKS funcional.

Las filas de cabecera o de filtro no son extremos. Una fila que solo contiene celdas th se omite, mientras que los campos vacíos o que no son direcciones fallan la validación. No descartes la primera y la última fila por posición: cualquiera de las dos puede ser un extremo real tras cambiar el diseño de la página.

Artículos relacionados