Eine leere HTML-Tabelle bedeutet nicht immer, dass die Antwort keine Proxy-Einträge enthält. Manche Listen legen JSON-Objekte in JavaScript-Aufrufe und füllen die Zeilen später.

Für eine bereits abgerufene Quelle, die den speziellen Wrapper gp.insertPrx gefolgt von einem JSON-Objekt verwendet:

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 ist der Quelltext, kein Browserobjekt. Der reguläre Ausdruck findet einen bekannten Wrapper; JSONDecoder bestimmt, wo der JSON-Wert endet. So wird vermieden, verschachteltes JSON allein mit einem regulären Ausdruck parsen zu wollen.

Das Portfeld des Beispiels ist ausdrücklich hexadezimal: C38 bedeutet dezimal 3128. Wende die Basis 16 nicht auf das Dezimalfeld eines anderen Anbieters an, nur weil beide Port heißen.

Dies ist ein Parser für das genannte Format, kein JavaScript-Interpreter. Objektliterale in einfachen Anführungszeichen, berechnete Werte und andere JavaScript-Ausdrücke brauchen eine andere dokumentierte Datenschnittstelle. Führe keinen beliebigen Seitencode aus, um eine Endpunktliste zu erhalten.

Prüfe den Quellvertrag und halte Protokollfelder getrennt. Hat die Quelle stattdessen gefüllte HTML-Zeilen, nutze zeilenbezogene Endpunkt-Extraktion statt dieses JavaScript-Wrapper-Parsers. Adresse und Port zu extrahieren belegt nicht, dass der Endpunkt derzeit einen nutzbaren Proxy-Dienst anbietet.

Ähnliche Artikel