ცარიელი 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-ის მხოლოდ რეგულარული გამოსახულებით გარჩევის მცდელობას.

მაგალითის პორტის ველი ცხადად hex არის: C38 ნიშნავს ათობით 3128-ს. ნუ გამოიყენებთ 16-ის საფუძველს სხვა მომწოდებლის ათობით ველზე მხოლოდ იმიტომ, რომ ორივეს პორტი ჰქვია.

ეს არის მითითებული ფორმატის პარსერი და არა JavaScript ინტერპრეტატორი. ერთ ბრჭყალებში მოცემული ობიექტის ლიტერალები, გამოთვლილი მნიშვნელობები და სხვა JavaScript გამოსახულებები სხვა დოკუმენტირებულ მონაცემთა ინტერფეისს მოითხოვს. არ გაუშვათ გვერდის თვითნებური კოდი endpoint-ების სიის მისაღებად.

შეამოწმეთ წყაროს ხელშეკრულება და პროტოკოლის ველები ცალკე შეინახეთ. თუ წყაროს ნაცვლად შევსებული HTML სტრიქონები აქვს, გამოიყენეთ endpoint-ების ამოღება სტრიქონების მიხედვით ამ JavaScript გარსაცმის პარსერის ნაცვლად. მისამართისა და პორტის ამოღება არ ამტკიცებს, რომ endpoint ამჟამად გამოსადეგ პროქსი სერვისს გვთავაზობს.

დაკავშირებული სტატიები