Prázdna HTML tabuľka ešte neznamená, že odpoveď neobsahuje žiadne proxy záznamy. Niektoré zoznamy vkladajú JSON objekty do volaní JavaScriptu a riadky doplnia neskôr.

Pre už získaný zdroj, ktorý používa konkrétny obal gp.insertPrx nasledovaný objektom JSON:

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 je text zdroja, nie objekt prehliadača. Regulárny výraz nájde známy obal; JSONDecoder určí, kde hodnota JSON končí. Tým sa vyhnete pokusu analyzovať vnorený JSON iba regulárnym výrazom.

Pole portu v príklade je výslovne hexadecimálne: C38 znamená desiatkovo 3128. Neaplikujte základ 16 na desiatkové pole iného poskytovateľa len preto, že sa obe volajú port.

Toto je parser pre uvedený formát, nie interpret JavaScriptu. Objektové literály v jednoduchých úvodzovkách, vypočítané hodnoty a ďalšie výrazy JavaScriptu vyžadujú iné zdokumentované dátové rozhranie. Nespúšťajte ľubovoľný kód stránky, aby ste získali zoznam koncových bodov.

Overte kontrakt zdroja a uchovávajte protokolové polia oddelene. Ak má zdroj namiesto toho vyplnené HTML riadky, použite extrakciu koncových bodov po riadkoch namiesto tohto parsera obalov JavaScriptu. Extrakcia adresy a portu nedokazuje, že koncový bod momentálne ponúka použiteľnú proxy službu.

Súvisiace články