Izdvajanje proxy IP adresa i heksadecimalnih portova iz ugrađenog JSON-a
Dekodirajte poznate JSON sadržaje iz poziva skripti proxy popisa i tumačite heksadecimalni port samo kada format izvora to navodi.
Prazna HTML tablica ne znači uvijek da odgovor ne sadrži proxy zapise. Neki popisi stavljaju JSON objekte unutar JavaScript poziva i popunjavaju retke kasnije.
Za već dobiven izvor koji koristi poseban omotač gp.insertPrx iza kojeg slijedi 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 je tekst izvora, a ne objekt preglednika. Regularni izraz pronalazi poznati omotač; JSONDecoder određuje gdje JSON vrijednost završava. Time se izbjegava pokušaj parsiranja ugniježđenog JSON-a samo regularnim izrazom.
Polje porta u primjeru izričito je heksadecimalno: C38 znači decimalno 3128. Ne primjenjujte bazu 16 na decimalno polje drugog pružatelja samo zato što se oba zovu port.
Ovo je parser za navedeni format, a ne JavaScript interpretator. Objektni literali u jednostrukim navodnicima, izračunate vrijednosti i drugi JavaScript izrazi zahtijevaju drugo dokumentirano sučelje za podatke. Ne izvršavajte proizvoljni kod stranice da biste dobili popis krajnjih točaka.
Provjerite ugovor izvora i čuvajte protokolska polja odvojeno. Ako izvor umjesto toga ima popunjene HTML retke, koristite izdvajanje krajnjih točaka po retku umjesto ovog parsera JavaScript omotača. Izdvajanje adrese i porta ne dokazuje da krajnja točka trenutačno nudi upotrebljivu proxy uslugu.