แยกวิเคราะห์แต่ละแถวพร็อกซีเป็นหน่วยเดียว หากทำให้ 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 จะถูกข้าม ในขณะที่ฟิลด์ว่างหรือไม่ใช่ที่อยู่จะไม่ผ่านการตรวจสอบ อย่าทิ้งแถวแรกและแถวสุดท้ายตามตำแหน่ง เพราะทั้งสองแถวอาจเป็นปลายทางจริงหลังเลย์เอาต์ของหน้าเปลี่ยนไป

บทความที่เกี่ยวข้อง