Розбирайте кожен рядок проксі як окрему одиницю. Якщо «сплющити» всі відповідні 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 — вхідні дані застосунку. Вибирайте селектор і зіставлення стовпців за фактичною розміткою джерела. Безкоштовний список проксі — одне з джерел записів про кінцеві точки, але його рядки варто оглянути, перш ніж вибирати це зіставлення. Ні історичний ID таблиці, ні твердження, що сторінка містить рівно 300 записів, не є довговічною схемою.

Множина видаляє повторювані пари «адреса — порт», зберігаючи зв'язок кожної пари. Водночас несподіваний імпорт із нульовим результатом варто розслідувати: таблиця могла змінитися, а отриманий документ може бути сторінкою перевірки, а не списком.

Якщо це важливо, зберігайте оголошений протокол і поля часу перевірки поруч із кінцевою точкою. Видобування правдоподібних IP і порту підтверджує лише формат, а не те, що кінцева точка зараз надає робочу службу HTTP або SOCKS.

Рядки заголовка або фільтра не є кінцевими точками. Рядок, що містить лише клітинки th, пропускається, а порожні поля або поля, що не є адресами, не проходять перевірку. Не відкидайте перший і останній рядки за позицією: після зміни макета сторінки будь-який із них може бути справжньою кінцевою точкою.

Схожі статті