Estrarre IP proxy e porte esadecimali dal JSON incorporato
Decodifica i payload JSON noti dalle chiamate script degli elenchi proxy e interpreta una porta esadecimale solo quando il formato di origine lo dichiara.
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.