Un tableau HTML vide ne signifie pas toujours que la réponse ne contient aucun enregistrement de proxy. Certaines listes placent des objets JSON dans des appels JavaScript et remplissent les lignes plus tard.

Pour une source déjà obtenue qui utilise l'enveloppe spécifique gp.insertPrx suivie d'un objet 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 est le texte source, pas un objet de navigateur. L'expression régulière trouve une enveloppe connue ; JSONDecoder détermine où se termine sa valeur JSON. Cela évite d'essayer d'analyser du JSON imbriqué avec une expression régulière seule.

Le champ de port de l'exemple est explicitement hexadécimal : C38 signifie 3128 en décimal. N'appliquez pas la base 16 au champ décimal d'un autre fournisseur simplement parce que les deux s'appellent port.

Il s'agit d'un analyseur pour le format indiqué, pas d'un interpréteur JavaScript. Les littéraux d'objet à guillemets simples, les valeurs calculées et les autres expressions JavaScript nécessitent une autre interface de données documentée. N'exécutez pas de code de page arbitraire pour obtenir une liste de points de terminaison.

Validez le contrat de la source et conservez les champs de protocole séparément. Si la source comporte plutôt des lignes HTML renseignées, utilisez l'extraction de points de terminaison par ligne plutôt que cet analyseur d'enveloppes JavaScript. Extraire une adresse et un port ne prouve pas que le point de terminaison propose actuellement un service de proxy utilisable.

Articles similaires