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