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

Схожі статті