Proxy-IP's en hex-poorten uit ingesloten JSON halen
Decodeer bekende JSON-payloads uit scriptaanroepen van proxylijsten en interpreteer een hex-poort alleen wanneer dat bronformaat dat aangeeft.
Een lege HTML-tabel betekent niet altijd dat de reactie geen proxyrecords bevat. Sommige lijsten plaatsen JSON-objecten in JavaScript-aanroepen en vullen de rijen later.
Voor een al opgehaalde bron die de specifieke wrapper gp.insertPrx gebruikt, gevolgd door een JSON-object:
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 is de brontekst, geen browserobject. De reguliere expressie vindt een bekende wrapper; JSONDecoder bepaalt waar de JSON-waarde eindigt. Zo wordt voorkomen dat ingesloten JSON alleen met een reguliere expressie wordt geparseerd.
Het poortveld van het voorbeeld is uitdrukkelijk hexadecimaal: C38 betekent decimaal 3128. Pas basis 16 niet toe op het decimale veld van een andere provider, alleen omdat beide poort heten.
Dit is een parser voor het genoemde formaat, geen JavaScript-interpreter. Objectliteralen met enkele aanhalingstekens, berekende waarden en andere JavaScript-expressies vereisen een andere gedocumenteerde data-interface. Voer geen willekeurige paginacode uit om een eindpuntlijst te krijgen.
Valideer het broncontract en houd protocolvelden apart. Heeft de bron in plaats daarvan gevulde HTML-rijen, gebruik dan eindpuntextractie per rij in plaats van deze JavaScript-wrapperparser. Een adres en poort extraheren bewijst niet dat het eindpunt momenteel een bruikbare proxydienst biedt.