جدول HTML خالی همیشه به این معنا نیست که پاسخ هیچ رکورد پروکسی ندارد. برخی فهرست‌ها اشیای JSON را داخل فراخوانی‌های JavaScript می‌گذارند و ردیف‌ها را بعداً پر می‌کنند.

برای منبعی که از قبل گرفته شده و از پوشش مشخص gp.insertPrx و سپس یک شیء JSON استفاده می‌کند:

import ipaddress
import json
import re

decoder = json.JSONDecoder()
endpoints = set()
for marker in re.finditer(r"gp[.]insertPrx\(\s*", html):
    try:
        row, end = decoder.raw_decode(html, marker.end())
        if not isinstance(row, dict):
            continue
        address = ipaddress.ip_address(row["PROXY_IP"])
        port = int(row["PROXY_PORT"], 16)
    except (ValueError, KeyError, TypeError):
        continue
    if 1 <= port <= 65535 and html[end:].lstrip().startswith(");"):
        endpoints.add((str(address), port))

‏html متن منبع است، نه شیء مرورگر. عبارت منظم پوشش شناخته‌شده را پیدا می‌کند؛ JSONDecoder تعیین می‌کند مقدار JSON کجا پایان می‌یابد. این کار از تلاش برای تجزیه JSON تودرتو فقط با یک عبارت منظم جلوگیری می‌کند.

فیلد پورت در مثال صریحاً هگزادسیمال است: C38 یعنی 3128 در مبنای ده. مبنای 16 را روی فیلد ده‌دهی ارائه‌دهنده‌ای دیگر اعمال نکنید فقط چون هر دو پورت نام دارند.

این یک تجزیه‌کننده برای قالب گفته‌شده است، نه مفسر JavaScript. لیترال‌های شیء با نقل‌قول تک، مقادیر محاسبه‌شده و دیگر عبارت‌های JavaScript به رابط داده مستند دیگری نیاز دارند. برای گرفتن فهرست نقاط پایانی کد دلخواه صفحه را اجرا نکنید.

قرارداد منبع را اعتبارسنجی کنید و فیلدهای پروتکل را جدا نگه دارید. اگر منبع به‌جای آن ردیف‌های HTML پر شده دارد، به‌جای این تجزیه‌کننده پوشش JavaScript از استخراج نقطه پایانی به‌ازای ردیف استفاده کنید. استخراج نشانی و پورت اثبات نمی‌کند که نقطه پایانی اکنون سرویس پروکسی قابل استفاده ارائه می‌دهد.

مقالات مرتبط