കാലിയായ 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 റാപ്പർ പാഴ്സറിന് പകരം വരിവഴി എൻഡ്പോയിന്റ് വേർതിരിച്ചെടുക്കൽ ഉപയോഗിക്കുക. വിലാസവും പോർട്ടും വേർതിരിച്ചെടുക്കുന്നത് എൻഡ്പോയിന്റ് ഇപ്പോൾ ഉപയോഗയോഗ്യമായ പ്രോക്സി സേവനം നൽകുന്നു എന്ന് തെളിയിക്കുന്നില്ല.

അനുബന്ധ ലേഖനങ്ങൾ