Trekk ut proxy-IP-ar og hex-portar frå innebygd JSON
Dekod kjende JSON-nyttelaster frå skriptkall i proxylister, og tolk ein hex-port berre når kildeformatet seier det.
Ein tom HTML-tabell tyder ikkje alltid at svaret ikkje inneheld proxy-oppføringar. Nokre lister plasserer JSON-objekt inne i JavaScript-kall og fyller radene seinare.
For ein allereie henta kilde som brukar den spesifikke innpakkinga gp.insertPrx etterfølgd av eit 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 kjeldeteksten, ikkje eit nettlesarobjekt. Det regulære uttrykket finn ei kjend innpakking; JSONDecoder avgjer kvar JSON-verdien sluttar. Det unngår å prøve å parse innebygd JSON med eit regulært uttrykk åleine.
Portfeltet i dømet er uttrykkjeleg heksadesimalt: C38 tyder desimalt 3128. Ikkje bruk grunntalet 16 på desimalfeltet til ein annan leverandør berre fordi begge blir kalla port.
Dette er ein parser for det oppgitte formatet, ikkje ein JavaScript-tolk. Objektliteralar med enkle hermeteikn, utrekna verdiar og andre JavaScript-uttrykk treng eit anna dokumentert datagrensesnitt. Ikkje køyr vilkårleg sidekode for å få ei endepunktliste.
Valider kontrakten til kjelda og hald protokollfelt åtskilde. Viss kjelda i staden har fylte HTML-rader, bruk radbasert endepunktuttrekk i staden for denne JavaScript-innpakkingsparsaren. Å trekkje ut ei adresse og ein port beviser ikkje at endepunktet for tida tilbyr ei brukbar proxytente.