Extraire les points de terminaison proxy une ligne de tableau à la fois
Gardez les adresses IP associées à leurs ports et validez les champs lors de l'analyse d'un tableau HTML de liste de proxies enregistré.
Analysez chaque ligne de proxy comme une unité. Si vous aplatissez tous les td correspondants de la page et regroupez les résultats par un nombre fixe, une adresse d'une ligne peut être appariée à un port de la suivante lorsqu'une cellule manque ou qu'un autre tableau apparaît.
Pour le HTML déjà obtenu par l'application, un tableau dont les deux premières colonnes sont l'adresse IP et le port peut être analysé ainsi :
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 et table_selector sont des entrées de l'application. Choisissez le sélecteur et le mappage des colonnes d'après le balisage réel de la source. La liste de proxies gratuits est une source d'enregistrements de points de terminaison, mais ses lignes doivent être inspectées avant de choisir ce mappage. Ni un ID de tableau historique ni l'affirmation qu'une page contient exactement 300 enregistrements ne constituent un schéma durable.
L'ensemble supprime les paires adresse-port en double tout en préservant l'association de chaque paire. Un import inattendu à zéro résultat doit tout de même être examiné : le tableau a peut-être changé ou le document récupéré peut être une page de défi plutôt que la liste.
Conservez tout protocole annoncé et les champs d'heure de vérification à côté du point de terminaison lorsqu'ils comptent. Extraire une IP et un port plausibles établit le format, pas le fait que le point de terminaison fournisse actuellement un service HTTP ou SOCKS fonctionnel.
Les lignes d'en-tête ou de filtre ne sont pas des points de terminaison. Une ligne ne contenant que des cellules th est ignorée, tandis que les champs vides ou non-adresses échouent à la validation. Ne rejetez pas la première et la dernière ligne selon leur position : l'une comme l'autre peut être un véritable point de terminaison après un changement de mise en page.