Analizza ogni riga proxy come un'unità. Se appiattisci ogni td corrispondente nell'intera pagina e raggruppi i risultati per un conteggio fisso, un indirizzo di una riga può essere abbinato a una porta della riga successiva quando manca una cella o compare un'altra tabella.

Per l'HTML che l'applicazione ha già ottenuto, una tabella le cui prime due colonne sono indirizzo IP e porta può essere analizzata così:

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 e table_selector sono input dell'applicazione. Scegli il selettore e la mappatura delle colonne dal markup reale della fonte. L'elenco di proxy gratuiti è una fonte di record di endpoint, ma le sue righe vanno ispezionate prima di scegliere quella mappatura. Né un ID di tabella storico né l'affermazione che una pagina contenga esattamente 300 record sono uno schema duraturo.

L'insieme rimuove le coppie indirizzo-porta duplicate preservando l'associazione di ogni coppia. Un'importazione inattesa con zero risultati va comunque indagata: la tabella può essere cambiata o il documento scaricato può essere una pagina di verifica invece dell'elenco.

Conserva qualsiasi protocollo dichiarato e i campi dell'ora di verifica accanto all'endpoint quando contano. Estrarre un IP e una porta plausibili stabilisce il formato, non che l'endpoint fornisca ora un servizio HTTP o SOCKS funzionante.

Le righe di intestazione o di filtro non sono endpoint. Una riga che contiene solo celle th viene saltata, mentre i campi vuoti o non-address non superano la convalida. Non scartare la prima e l'ultima riga in base alla posizione: entrambe possono essere un endpoint reale dopo che il layout della pagina cambia.

Articoli correlati