프록시 엔드포인트를 표 한 행씩 추출하기
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개의 레코드가 있다는 주장도 오래가는 스키마가 아닙니다.
이 집합은 중복된 주소-포트 쌍을 제거하면서 각 쌍의 연관을 유지합니다. 그래도 예상치 못한 0건 가져오기는 조사해야 합니다. 표가 바뀌었거나 가져온 문서가 목록이 아니라 챌린지 페이지일 수 있습니다.
중요하다면 공개된 프로토콜과 검사 시각 필드를 엔드포인트와 함께 보관하세요. 그럴듯한 IP와 포트를 추출하는 것은 형식을 확인할 뿐, 그 엔드포인트가 지금 동작하는 HTTP 또는 SOCKS 서비스를 제공한다는 뜻은 아닙니다.
머리글 행이나 필터 행은 엔드포인트가 아닙니다. th 셀만 있는 행은 건너뛰고, 비어 있거나 주소가 아닌 필드는 검증에서 실패합니다. 첫 행과 마지막 행을 위치만 보고 버리지 마세요. 페이지 레이아웃이 바뀌면 둘 중 어느 것이든 실제 엔드포인트일 수 있습니다.