Extrahera proxy-IP:n och hex-portar från inbäddad JSON
Avkoda kända JSON-nyttolaster från skriptanrop i proxylistor och tolka en hex-port endast när källformatet anger det.
En tom HTML-tabell betyder inte alltid att svaret inte innehåller proxy-poster. Vissa listor placerar JSON-objekt i JavaScript-anrop och fyller raderna senare.
För en redan hämtad källa som använder det specifika omslaget gp.insertPrx följt av ett JSON-objekt:
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 är källtexten, inte ett webbläsarobjekt. Det reguljära uttrycket hittar ett känt omslag; JSONDecoder avgör var JSON-värdet slutar. Det undviker att försöka parsa inbäddad JSON med enbart ett reguljärt uttryck.
Exemplets portfält är uttryckligen hexadecimalt: C38 betyder decimalt 3128. Använd inte basen 16 på en annan leverantörs decimalfält bara för att båda kallas port.
Detta är en parser för det angivna formatet, inte en JavaScript-tolk. Objektliteraler med enkla citattecken, beräknade värden och andra JavaScript-uttryck kräver ett annat dokumenterat datagränssnitt. Kör inte godtycklig sidkod för att få en endpoint-lista.
Validera källans kontrakt och håll protokollfält åtskilda. Om källan i stället har fyllda HTML-rader, använd radbaserat endpoint-utdrag i stället för denna JavaScript-omslagsparser. Att extrahera en adress och port bevisar inte att endpointen för närvarande erbjuder en användbar proxytjänst.