Празна 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 обвивки. Извличането на адрес и порт не доказва, че крайната точка в момента предлага използваема прокси услуга.

Подобни статии