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