Αναλύστε κάθε γραμμή proxy ως μία μονάδα. Αν ισοπεδώσετε κάθε ταιριαστό td σε όλη τη σελίδα και ομαδοποιήσετε τα αποτελέσματα με σταθερό πλήθος, μια διεύθυνση από μία γραμμή μπορεί να συνδυαστεί με θύρα από την επόμενη όταν λείπει ένα κελί ή εμφανιστεί άλλος πίνακας.

Για HTML που έχει ήδη λάβει η εφαρμογή, ένας πίνακας του οποίου οι δύο πρώτες στήλες είναι διεύθυνση IP και θύρα μπορεί να αναλυθεί ως εξής:

import ipaddress
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")
table = soup.select_one(table_selector)
if table is None:
    raise ValueError("Expected proxy table was not found")

endpoints = set()
for row in table.select("tbody tr"):
    cells = row.find_all("td", recursive=False)
    if len(cells) < 2:
        continue
    try:
        address = ipaddress.ip_address(cells[0].get_text(strip=True))
        port = int(cells[1].get_text(strip=True))
    except ValueError:
        continue
    if 1 <= port <= 65535:
        endpoints.add((str(address), port))

Τα html και table_selector είναι είσοδοι της εφαρμογής. Επιλέξτε τον επιλογέα και την αντιστοίχιση στηλών από την πραγματική σήμανση της πηγής. Η δωρεάν λίστα proxy είναι μία πηγή εγγραφών τερματικών σημείων, αλλά οι γραμμές της πρέπει να εξεταστούν πριν επιλεγεί αυτή η αντιστοίχιση. Ούτε ένα παλιό ID πίνακα ούτε ο ισχυρισμός ότι μια σελίδα περιέχει ακριβώς 300 εγγραφές αποτελούν διαρκές σχήμα.

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

Κρατήστε τυχόν δηλωμένο πρωτόκολλο και πεδία χρόνου ελέγχου δίπλα στο τερματικό σημείο όταν έχουν σημασία. Η εξαγωγή μιας εύλογης IP και θύρας τεκμηριώνει τη μορφή, όχι ότι το τερματικό σημείο παρέχει τώρα λειτουργική υπηρεσία HTTP ή SOCKS.

Οι γραμμές κεφαλίδας ή φίλτρου δεν είναι τερματικά σημεία. Μια γραμμή με μόνο κελιά th παραλείπεται, ενώ κενά πεδία ή πεδία που δεν είναι διευθύνσεις αποτυγχάνουν στην επικύρωση. Μην απορρίπτετε την πρώτη και την τελευταία γραμμή με βάση τη θέση: οποιαδήποτε από τις δύο μπορεί να είναι πραγματικό τερματικό σημείο αφού αλλάξει η διάταξη της σελίδας.

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