'n Leë HTML-tabel beteken nie altyd dat die antwoord geen proxyrekords bevat nie. Sommige lyste plaas JSON-voorwerpe binne JavaScript-oproepe en vul die rye later in.

Vir 'n reeds verkrygde bron wat die spesifieke omhulsel gp.insertPrx gebruik, gevolg deur 'n JSON-voorwerp:

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 is die brontteks, nie 'n blaaierobjek nie. Die gereelde uitdrukking vind 'n bekende omhulsel; JSONDecoder bepaal waar sy JSON-waarde eindig. So word vermy om ingebedde JSON net met 'n gereelde uitdrukking te probeer ontleed.

Die voorbeeld se poortveld is uitdruklik heksadesimaal: C38 beteken desimaal 3128. Moenie basis 16 op 'n ander verskaffer se desimale veld toepas net omdat albei poort heet nie.

Dit is 'n ontleder vir die genoemde formaat, nie 'n JavaScript-tolker nie. Enkelgekwoteerde voorwerpliterale, berekende waardes en ander JavaScript-uitdrukkings vereis 'n ander gedokumenteerde datakoppelvlak. Moenie willekeurige bladsykode uitvoer om 'n eindpuntlys te kry nie.

Valideer die bronkontrak en hou protokolvelde apart. Vir 'n bron met ingevulde HTML-rye gebruik eerder rygerigte eindpuntonttrekking as hierdie JavaScript-omhulsel-ontleder. Om 'n adres en poort te onttrek, bewys nie dat die eindpunt tans 'n bruikbare proxydiens bied nie.

Verwante artikels