Analise cada linha de proxy como uma unidade. Se achatar todos os td correspondentes da página e agrupar os resultados por uma contagem fixa, um endereço de uma linha pode ser emparelhado com uma porta da linha seguinte quando falta uma célula ou aparece outra tabela.

Para o HTML que a aplicação já obteve, uma tabela cujas duas primeiras colunas são endereço IP e porta pode ser analisada assim:

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 e table_selector são entradas da aplicação. Escolha o seletor e o mapeamento de colunas a partir da marcação real da fonte. A lista de proxies gratuitos é uma fonte de registos de endpoints, mas as suas linhas devem ser inspecionadas antes de escolher esse mapeamento. Nem um ID de tabela histórico nem a afirmação de que uma página contém exatamente 300 registos são um esquema duradouro.

O conjunto remove pares endereço-e-porta duplicados, preservando a associação de cada par. Ainda assim, uma importação inesperada com zero resultados deve ser investigada: a tabela pode ter mudado ou o documento obtido pode ser uma página de desafio em vez da listagem.

Mantenha qualquer protocolo anunciado e os campos de hora de verificação junto ao endpoint quando importarem. Extrair um IP e uma porta plausíveis estabelece o formato, não que o endpoint forneça agora um serviço HTTP ou SOCKS funcional.

As linhas de cabeçalho ou de filtro não são endpoints. Uma linha que só contém células th é ignorada, enquanto os campos vazios ou que não são endereços falham a validação. Não descarte a primeira e a última linha pela posição: qualquer uma delas pode ser um endpoint real depois de o layout da página mudar.

Artigos relacionados