Una tabella HTML vuota non significa sempre che la risposta non contenga record proxy. Alcuni elenchi inseriscono oggetti JSON dentro chiamate JavaScript e riempiono le righe più tardi.

Per un'origine già ottenuta che usa il wrapper specifico gp.insertPrx seguito da un oggetto 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 è il testo dell'origine, non un oggetto del browser. L'espressione regolare trova un wrapper noto; JSONDecoder determina dove termina il suo valore JSON. Così si evita di provare ad analizzare JSON annidato solo con un'espressione regolare.

Il campo porta dell'esempio è esplicitamente esadecimale: C38 significa 3128 decimale. Non applicare la base 16 al campo decimale di un altro fornitore solo perché entrambi si chiamano porta.

Questo è un parser per il formato indicato, non un interprete JavaScript. I letterali oggetto con virgolette singole, i valori calcolati e altre espressioni JavaScript richiedono un'altra interfaccia dati documentata. Non eseguire codice di pagina arbitrario per ottenere un elenco di endpoint.

Convalida il contratto dell'origine e conserva separatamente i campi di protocollo. Se l'origine ha invece righe HTML popolate, usa l'estrazione di endpoint per riga anziché questo parser di wrapper JavaScript. Estrarre un indirizzo e una porta non dimostra che l'endpoint offra attualmente un servizio proxy utilizzabile.

Articoli correlati