Extrair IPs de proxy e portas hexadecimais do JSON incorporado
Decodifique cargas JSON conhecidas das chamadas de script das listas de proxy e interprete uma porta hexadecimal apenas quando o formato de origem o declarar.
Uma tabela HTML vazia nem sempre significa que a resposta não contém registros de proxy. Algumas listas colocam objetos JSON dentro de chamadas JavaScript e preenchem as linhas mais tarde.
Para uma origem já obtida que use o wrapper específico gp.insertPrx seguido de um objeto 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 é o texto da origem, não um objeto do navegador. A expressão regular encontra um wrapper conhecido; o JSONDecoder determina onde o valor JSON termina. Assim evita-se tentar analisar JSON aninhado apenas com uma expressão regular.
O campo de porta do exemplo é explicitamente hexadecimal: C38 significa 3128 decimal. Não aplique a base 16 ao campo decimal de outro provedor só porque ambos se chamam porta.
Este é um analisador para o formato indicado, não um interpretador JavaScript. Literais de objeto com aspas simples, valores calculados e outras expressões JavaScript exigem outra interface de dados documentada. Não execute código de página arbitrário para obter uma lista de endpoints.
Valide o contrato da origem e mantenha os campos de protocolo separados. Se a origem tiver, em vez disso, linhas HTML preenchidas, use extração de endpoints por linha em vez deste analisador de wrappers JavaScript. Extrair um endereço e uma porta não prova que o endpoint ofereça atualmente um serviço de proxy utilizável.