En tom HTML-tabel betyder ikke altid, at svaret ikke indeholder proxy-poster. Nogle lister placerer JSON-objekter inde i JavaScript-kald og udfylder rækkerne senere.

For en allerede hentet kilde, der bruger den specifikke indpakning gp.insertPrx efterfulgt af et 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 er kildeteksten, ikke et browserobjekt. Det regulære udtryk finder en kendt indpakning; JSONDecoder afgør, hvor JSON-værdien slutter. Det undgår at forsøge at parse indlejret JSON med et regulært udtryk alene.

Eksemplets portfelt er udtrykkeligt hexadecimalt: C38 betyder decimalt 3128. Anvend ikke grundtal 16 på en anden udbyders decimale felt, bare fordi begge kaldes port.

Dette er en parser til det angivne format, ikke en JavaScript-fortolker. Objektliteraler med enkelte anførselstegn, beregnede værdier og andre JavaScript-udtryk kræver en anden dokumenteret datagrænseflade. Kør ikke vilkårlig sidekode for at få en endpoint-liste.

Validér kildens kontrakt, og hold protokolfelter adskilt. Hvis kilden i stedet har udfyldte HTML-rækker, så brug rækkeafgrænset endpoint-udtræk frem for denne JavaScript-indpakningsparser. At udtrække en adresse og port beviser ikke, at endpointet i øjeblikket tilbyder en brugbar proxytjeneste.

Relaterede artikler