Parsujte každý riadok proxy ako jeden celok. Ak sploštíte všetky zodpovedajúce td na stránke a výsledky zoskupíte podľa pevného počtu, adresa z jedného riadku sa môže spárovať s portom z nasledujúceho, keď chýba bunka alebo sa objaví iná tabuľka.

Pre HTML, ktoré aplikácia už získala, tabuľku, ktorej prvé dva stĺpce sú IP adresa a port, možno parsovať takto:

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 a table_selector sú vstupy aplikácie. Selektor a mapovanie stĺpcov vyberte podľa skutočného značkovania zdroja. Zoznam bezplatných proxy je jedným zdrojom záznamov o koncových bodoch, ale jeho riadky treba prezrieť pred voľbou tohto mapovania. Ani historické ID tabuľky, ani tvrdenie, že stránka obsahuje presne 300 záznamov, nie je trvalá schéma.

Množina odstraňuje duplicitné dvojice adresa-port a zachováva pritom prepojenie každej dvojice. Neočakávaný import s nulovým výsledkom však treba vyšetriť: tabuľka sa mohla zmeniť alebo stiahnutý dokument môže byť overovacia stránka namiesto zoznamu.

Ak sú dôležité, ponechajte pri koncovom bode aj uvedený protokol a polia času kontroly. Vytiahnutie vierohodnej IP a portu preukazuje len formát, nie to, že koncový bod práve teraz poskytuje funkčnú službu HTTP alebo SOCKS.

Riadky hlavičky alebo filtra nie sú koncové body. Riadok obsahujúci len bunky th sa preskakuje, zatiaľ čo prázdne alebo neadresné polia neprejdú validáciou. Nezahadzujte prvý a posledný riadok podľa pozície: po zmene rozloženia stránky môže byť ktorýkoľvek z nich skutočným koncovým bodom.

Súvisiace články