Видобування 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. Видобування адреси й порту не доводить, що кінцева точка зараз пропонує працездатну службу проксі.