استخراج نقاط نهاية البروكسي صفًّا واحدًا من الجدول في كل مرة
أبقِ عناوين 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 مدخلان من التطبيق. اختر المحدد وتوزيع الأعمدة من الترميز الفعلي للمصدر. قائمة البروكسي المجانية أحد مصادر سجلات نقاط النهاية، لكن ينبغي فحص صفوفها قبل اختيار هذا التوزيع. لا معرّف الجدول التاريخي ولا الادعاء بأن الصفحة تحتوي على 300 سجل بالضبط مخطط دائم.
تزيل المجموعة أزواج العنوان والمنفذ المكررة مع الحفاظ على ارتباط كل زوج. ومع ذلك يجب التحقيق في استيراد غير متوقع بنتيجة صفرية: فقد يكون الجدول قد تغير أو قد تكون الوثيقة المجلوبة صفحة تحدٍّ بدلًا من القائمة.
احتفظ بأي حقول بروتوكول معلن ووقت فحص إلى جانب نقطة النهاية عندما تكون مهمة. استخراج IP ومنفذ معقولين يثبت التنسيق فقط، لا أن نقطة النهاية تقدم حاليًا خدمة HTTP أو SOCKS عاملة.
صفوف الرؤوس أو التصفية ليست نقاط نهاية. يُتخطى الصف الذي يحتوي على خلايا th فقط، بينما تفشل الحقول الفارغة أو غير العناوين في التحقق. لا تحذف الصف الأول والأخير بحسب الموضع: قد يكون أي منهما نقطة نهاية حقيقية بعد تغير تخطيط الصفحة.