Разбирайте каждую строку прокси как отдельную единицу. Если «сплющить» все подходящие 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, пропускается, а пустые поля или поля, не являющиеся адресами, не проходят проверку. Не отбрасывайте первую и последнюю строки по положению: после изменения макета страницы любая из них может быть настоящей конечной точкой.

Похожие статьи