Unha táboa HTML baleira non sempre significa que a resposta non conteña rexistros de proxy. Algunhas listas colocan obxectos JSON dentro de chamadas JavaScript e enchen as filas máis tarde.

Para unha orixe xa obtida que use o envoltorio específico gp.insertPrx seguido dun obxecto JSON:

import ipaddress
import json
import re

decoder = json.JSONDecoder()
endpoints = set()
for marker in re.finditer(r"gp[.]insertPrx\(\s*", html):
    try:
        row, end = decoder.raw_decode(html, marker.end())
        if not isinstance(row, dict):
            continue
        address = ipaddress.ip_address(row["PROXY_IP"])
        port = int(row["PROXY_PORT"], 16)
    except (ValueError, KeyError, TypeError):
        continue
    if 1 <= port <= 65535 and html[end:].lstrip().startswith(");"):
        endpoints.add((str(address), port))

html é o texto da orixe, non un obxecto do navegador. A expresión regular atopa un envoltorio coñecido; JSONDecoder determina onde remata o seu valor JSON. Así evítase tentar analizar JSON aniñado só cunha expresión regular.

O campo de porto do exemplo é explicitamente hexadecimal: C38 significa 3128 decimal. Non aplique a base 16 ao campo decimal doutro provedor só porque ambos se chamen porto.

Este é un analizador para o formato indicado, non un intérprete de JavaScript. Os literais de obxecto con comiñas simples, os valores calculados e outras expresións JavaScript necesitan outra interface de datos documentada. Non execute código arbitrario da páxina para obter unha lista de puntos finais.

Valide o contrato da orixe e manteña os campos de protocolo por separado. Se a orixe ten no seu lugar filas HTML enchidas, use extracción de puntos finais por fila en vez deste analizador de envoltorios JavaScript. Extraer un enderezo e un porto non demostra que o punto final ofreza actualmente un servizo de proxy utilizábel.

Artigos relacionados