Extrakce proxy IP adres a hexadecimálních portů z vloženého JSON
Dekódujte známé JSON obsahy z volání skriptů seznamů proxy a hexadecimální port interpretujte jen tehdy, když to formát zdroje uvádí.
Prázdná HTML tabulka ještě neznamená, že odpověď neobsahuje žádné proxy záznamy. Některé seznamy vkládají JSON objekty do volání JavaScriptu a řádky doplní později.
Pro již získaný zdroj, který používá konkrétní obal gp.insertPrx následovaný objektem 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 je text zdroje, ne objekt prohlížeče. Regulární výraz najde známý obal; JSONDecoder určí, kde hodnota JSON končí. Tím se vyhneme pokusu analyzovat vnořený JSON pouze regulárním výrazem.
Pole portu v příkladu je výslovně hexadecimální: C38 znamená desítkově 3128. Neaplikujte základ 16 na desítkové pole jiného poskytovatele jen proto, že se obě jmenují port.
Toto je parser pro uvedený formát, nikoli interpret JavaScriptu. Objektové literály v jednoduchých uvozovkách, vypočtené hodnoty a další výrazy JavaScriptu vyžadují jiné dokumentované datové rozhraní. Nespouštějte libovolný kód stránky, abyste získali seznam koncových bodů.
Ověřte kontrakt zdroje a uchovávejte protokolová pole odděleně. Pokud má zdroj místo toho vyplněné HTML řádky, použijte extrakci koncových bodů po řádcích namísto tohoto parseru obalů JavaScriptu. Extrakce adresy a portu nedokazuje, že koncový bod nyní nabízí použitelnou proxy službu.