खाली HTML तालिका का अर्थ हमेशा यह नहीं होता कि प्रतिक्रिया में कोई प्रॉक्सी रिकॉर्ड नहीं है। कुछ सूचियाँ JavaScript कॉल के भीतर JSON ऑब्जेक्ट रखती हैं और पंक्तियाँ बाद में भरती हैं।

पहले से प्राप्त स्रोत के लिए जो विशिष्ट रैपर 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 रैपर पार्सर के बजाय पंक्ति-आधारित एंडपॉइंट निष्कर्षण का उपयोग करें। पता और पोर्ट निकालना यह सिद्ध नहीं करता कि एंडपॉइंट अभी उपयोगी प्रॉक्सी सेवा दे रहा है।

संबंधित लेख