Tühi HTML-tabel ei tähenda alati, et vastuses pole proxy-kirjeid. Mõned nimekirjad panevad JSON-objektid JavaScripti kutsungite sisse ja täidavad read hiljem.

Juba hangitud allika puhul, mis kasutab konkreetset mähisjat gp.insertPrx, millele järgneb JSON-objekt:

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 on allika tekst, mitte brauseri objekt. Regulaaravaldis leiab tuntud mähisja; JSONDecoder määrab, kus JSON-i väärtus lõpeb. Nii välditakse pesastatud JSON-i ainult regulaaravaldisega parsimise katset.

Näite pordiväli on selgesõnaliselt kuueteistkümnend: C38 tähendab kümnendkohana 3128. Ärge rakendage alust 16 teise teenusepakkuja kümnendväljale ainult sellepärast, et mõlemat nimetatakse pordiks.

See on parser nimetatud vormingu jaoks, mitte JavaScripti tõlk. Ühekordsete jutumärkidega objektiliteraalid, arvutatud väärtused ja muud JavaScripti avaldised vajavad teist dokumenteeritud andmeliidest. Ärge käivitage suvalist lehekülje koodi lõpp-punktide loendi saamiseks.

Valideerige allika leping ja hoidke protokolliväljad eraldi. Kui allikal on hoopis täidetud HTML-read, kasutage selle JavaScripti mähisja parseri asemel reapõhist lõpp-punktide eraldamist. Aadressi ja pordi eraldamine ei tõenda, et lõpp-punkt pakub praegu kasutatavat proxy-teenust.

Seotud artiklid