Извличане на прокси крайни точки ред по ред от таблица
Пазете 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 са входни данни на приложението. Изберете селектора и разпределението на колоните според действителния markup на източника. Безплатният списък с проксита е един източник на записи за крайни точки, но редовете му трябва да се прегледат, преди да изберете това разпределение. Нито исторически ID на таблица, нито твърдението, че страницата съдържа точно 300 записа, е трайна схема.
Множеството премахва дублираните двойки адрес-порт, като запазва връзката на всяка двойка. Неочакван импорт с нулев резултат все пак трябва да се разследва: таблицата може да се е променила или изтегленият документ да е страница за проверка, а не списъкът.
Пазете обявения протокол и полетата за време на проверка заедно с крайната точка, когато имат значение. Извличането на правдоподобен IP и порт установява само формата, а не че крайната точка в момента предоставя работеща HTTP или SOCKS услуга.
Редовете на заглавката или филтъра не са крайни точки. Ред само с th клетки се пропуска, а празните или неадресни полета не преминават валидацията. Не изхвърляйте първия и последния ред по позиция: всеки от тях може да е истинска крайна точка след промяна на оформлението на страницата.