En tom HTML-tabell betyder inte alltid att svaret inte innehåller proxy-poster. Vissa listor placerar JSON-objekt i JavaScript-anrop och fyller raderna senare.

För en redan hämtad källa som använder det specifika omslaget gp.insertPrx följt av ett 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 är källtexten, inte ett webbläsarobjekt. Det reguljära uttrycket hittar ett känt omslag; JSONDecoder avgör var JSON-värdet slutar. Det undviker att försöka parsa inbäddad JSON med enbart ett reguljärt uttryck.

Exemplets portfält är uttryckligen hexadecimalt: C38 betyder decimalt 3128. Använd inte basen 16 på en annan leverantörs decimalfält bara för att båda kallas port.

Detta är en parser för det angivna formatet, inte en JavaScript-tolk. Objektliteraler med enkla citattecken, beräknade värden och andra JavaScript-uttryck kräver ett annat dokumenterat datagränssnitt. Kör inte godtycklig sidkod för att få en endpoint-lista.

Validera källans kontrakt och håll protokollfält åtskilda. Om källan i stället har fyllda HTML-rader, använd radbaserat endpoint-utdrag i stället för denna JavaScript-omslagsparser. Att extrahera en adress och port bevisar inte att endpointen för närvarande erbjuder en användbar proxytjänst.

Relaterade artiklar