Εξαγωγή τερματικών σημείων proxy μία γραμμή πίνακα τη φορά
Κρατήστε τις διευθύνσεις IP συνδεδεμένες με τις θύρες τους και επικυρώστε τα πεδία κατά την ανάλυση ενός αποθηκευμένου πίνακα HTML με λίστα proxy.
Αναλύστε κάθε γραμμή 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 παραλείπεται, ενώ κενά πεδία ή πεδία που δεν είναι διευθύνσεις αποτυγχάνουν στην επικύρωση. Μην απορρίπτετε την πρώτη και την τελευταία γραμμή με βάση τη θέση: οποιαδήποτε από τις δύο μπορεί να είναι πραγματικό τερματικό σημείο αφού αλλάξει η διάταξη της σελίδας.