Elŝuti proksimajn IP-ojn kaj deksesumajn havenojn el enkonstruita JSON
Malĉifru konatajn JSON-ŝarĝojn el skriptovokoj de proksimaj listoj kaj interpretu deksesuman havenon nur kiam la fontformo tion deklaras.
Malplena HTML-tabelo ne ĉiam signifas, ke la respondo enhavas neniujn proksimajn rikordojn. Iuj listoj metas JSON-objektojn en JavaScript-vokojn kaj plenigas la vicojn poste.
Por jam akirita fonto uzanta la specifan envolvaĵon gp.insertPrx sekvatan de JSON-objekto:
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 estas la fonta teksto, ne retumila objekto. La regula esprimo trovas konatan envolvaĵon; JSONDecoder determinas, kie finiĝas ĝia JSON-valoro. Tiel oni evitas provi analizi nestitan JSON nur per regula esprimo.
La havena kampo de la ekzemplo estas eksplicite deksesuma: C38 signifas dekuman 3128. Ne apliku bazon 16 al dekuma kampo de alia provizanto nur ĉar ambaŭ nomiĝas haveno.
Ĉi tio estas analizilo por la indikita formo, ne JavaScript-interpretilo. Objektaj literaloj kun unuoblaj citiloj, komputitaj valoroj kaj aliaj JavaScript-esprimoj bezonas alian dokumentitan datuman interfacon. Ne plenumu arbitran paĝan kodon por akiri liston de finpunktoj.
Validigu la fontan kontrakton kaj tenu protokolajn kampojn aparte. Se la fonto anstataŭe havas plenigitajn HTML-vicojn, uzu vico-an finan punkton eltiraĵon anstataŭ ĉi tiu JavaScript-envolvaĵa analizilo. Eltiri adreson kaj havenon ne pruvas, ke la finpunkto nun ofertas uzeblan proksiman servon.