Извлечение IP-адресов прокси и шестнадцатеричных портов из встроенного JSON
Декодируйте известные полезные нагрузки JSON из вызовов скриптов списков прокси и интерпретируйте шестнадцатеричный порт только тогда, когда формат источника это указывает.
Пустая HTML-таблица не всегда означает, что в ответе нет записей прокси. Некоторые списки помещают объекты JSON внутрь вызовов JavaScript и заполняют строки позже.
Для уже полученного источника, использующего определённую обёртку gp.insertPrx, за которой следует объект 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 — это текст источника, а не объект браузера. Регулярное выражение находит известную обёртку; JSONDecoder определяет, где заканчивается значение JSON. Так удаётся избежать попытки разбирать вложенный JSON только регулярным выражением.
Поле порта в примере явно шестнадцатеричное: C38 означает десятичное 3128. Не применяйте основание 16 к десятичному полю другого провайдера только потому, что оба называются портом.
Это анализатор для указанного формата, а не интерпретатор JavaScript. Объектные литералы в одинарных кавычках, вычисляемые значения и другие выражения JavaScript требуют другого документированного интерфейса данных. Не выполняйте произвольный код страницы, чтобы получить список конечных точек.
Проверьте контракт источника и храните поля протокола отдельно. Если у источника вместо этого есть заполненные строки HTML, используйте извлечение конечных точек по строкам вместо этого анализатора обёрток JavaScript. Извлечение адреса и порта не доказывает, что конечная точка сейчас предоставляет работоспособную службу прокси.