Extrage IP-uri de proxy și porturi hexazecimale din JSON încorporat
Decodificați încărcături JSON cunoscute din apelurile de script ale listelor de proxy și interpretați un port hexazecimal doar când formatul sursei declară acest lucru.
Un tabel HTML gol nu înseamnă întotdeauna că răspunsul nu conține înregistrări de proxy. Unele liste pun obiecte JSON în apeluri JavaScript și completează rândurile mai târziu.
Pentru o sursă deja obținută care folosește wrapperul specific gp.insertPrx urmat de un obiect JSON:
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 este textul sursei, nu un obiect de browser. Expresia regulată găsește un wrapper cunoscut; JSONDecoder determină unde se termină valoarea JSON. Astfel se evită încercarea de a analiza JSON imbricat doar cu o expresie regulată.
Câmpul de port din exemplu este explicit hexazecimal: C38 înseamnă 3128 zecimal. Nu aplicați baza 16 câmpului zecimal al altui furnizor doar pentru că ambele se numesc port.
Acesta este un parser pentru formatul indicat, nu un interpretor JavaScript. Literalii de obiect cu ghilimele simple, valorile calculate și alte expresii JavaScript necesită altă interfață de date documentată. Nu executați cod arbitrar de pagină pentru a obține o listă de endpoint-uri.
Validați contractul sursei și păstrați câmpurile de protocol separat. Dacă sursa are în schimb rânduri HTML completate, folosiți extragerea de endpoint-uri pe rând în locul acestui parser de wrapper JavaScript. Extragerea unei adrese și a unui port nu dovedește că endpoint-ul oferă în prezent un serviciu de proxy utilizabil.