Ένας κενός πίνακας HTML δεν σημαίνει πάντα ότι η απόκριση δεν περιέχει εγγραφές διακομιστή μεσολάβησης. Ορισμένες λίστες τοποθετούν αντικείμενα JSON μέσα σε κλήσεις JavaScript και συμπληρώνουν τις γραμμές αργότερα.

Για μια πηγή που έχει ήδη ληφθεί και χρησιμοποιεί το συγκεκριμένο περιτύλιγμα gp.insertPrx ακολουθούμενο από αντικείμενο 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 είναι το κείμενο της πηγής, όχι αντικείμενο προγράμματος περιήγησης. Η κανονική έκφραση βρίσκει ένα γνωστό περιτύλιγμα· ο JSONDecoder καθορίζει πού τελειώνει η τιμή JSON. Έτσι αποφεύγεται η προσπάθεια ανάλυσης ένθετου JSON μόνο με κανονική έκφραση.

Το πεδίο θύρας του παραδείγματος είναι ρητά δεκαεξαδικό: C38 σημαίνει δεκαδικό 3128. Μην εφαρμόζετε βάση 16 σε δεκαδικό πεδίο άλλου παρόχου μόνο επειδή και τα δύο ονομάζονται θύρα.

Αυτός είναι αναλυτής για τη δηλωμένη μορφή, όχι διερμηνευτής JavaScript. Τα γραμματικά αντικείμενα με απλά εισαγωγικά, οι υπολογισμένες τιμές και άλλες εκφράσεις JavaScript χρειάζονται άλλη τεκμηριωμένη διεπαφή δεδομένων. Μην εκτελείτε αυθαίρετο κώδικα σελίδας για να αποκτήσετε λίστα τελικών σημείων.

Επικυρώστε το συμβόλαιο της πηγής και κρατήστε τα πεδία πρωτοκόλλου χωριστά. Αν η πηγή έχει αντ' αυτού συμπληρωμένες γραμμές HTML, χρησιμοποιήστε εξαγωγή τελικών σημείων ανά γραμμή αντί για αυτόν τον αναλυτή περιτυλιγμάτων JavaScript. Η εξαγωγή διεύθυνσης και θύρας δεν αποδεικνύει ότι το τελικό σημείο προσφέρει τώρα χρησιμοποιήσιμη υπηρεσία διακομιστή μεσολάβησης.

Σχετικά άρθρα