Udtræk proxy-IP'er og hex-porte fra indlejret JSON
Afkod kendte JSON-data fra scriptkald i proxylister, og fortolk en hex-port kun, når kildeformatet angiver det.
En tom HTML-tabel betyder ikke altid, at svaret ikke indeholder proxy-poster. Nogle lister placerer JSON-objekter inde i JavaScript-kald og udfylder rækkerne senere.
For en allerede hentet kilde, der bruger den specifikke indpakning gp.insertPrx efterfulgt af et 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 er kildeteksten, ikke et browserobjekt. Det regulære udtryk finder en kendt indpakning; JSONDecoder afgør, hvor JSON-værdien slutter. Det undgår at forsøge at parse indlejret JSON med et regulært udtryk alene.
Eksemplets portfelt er udtrykkeligt hexadecimalt: C38 betyder decimalt 3128. Anvend ikke grundtal 16 på en anden udbyders decimale felt, bare fordi begge kaldes port.
Dette er en parser til det angivne format, ikke en JavaScript-fortolker. Objektliteraler med enkelte anførselstegn, beregnede værdier og andre JavaScript-udtryk kræver en anden dokumenteret datagrænseflade. Kør ikke vilkårlig sidekode for at få en endpoint-liste.
Validér kildens kontrakt, og hold protokolfelter adskilt. Hvis kilden i stedet har udfyldte HTML-rækker, så brug rækkeafgrænset endpoint-udtræk frem for denne JavaScript-indpakningsparser. At udtrække en adresse og port beviser ikke, at endpointet i øjeblikket tilbyder en brugbar proxytjeneste.