Tukša HTML tabula ne vienmēr nozīmē, ka atbildē nav prokšu ierakstu. Daži saraksti ievieto JSON objektus JavaScript izsaukumos un rindas aizpilda vēlāk.

Jau iegūtam avotam, kas izmanto konkrēto ietvaru gp.insertPrx un pēc tā JSON objektu:

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 ir avota teksts, nevis pārlūka objekts. Regulārā izteiksme atrod zināmu ietvaru; JSONDecoder nosaka, kur beidzas JSON vērtība. Tā tiek izvairīties no mēģinājuma parsēt iegultu JSON tikai ar regulāro izteiksmi.

Piemēra porta lauks ir nepārprotami heksadecimāls: C38 nozīmē decimālo 3128. Neattieciniet 16. bāzi uz cita pakalpojumu sniedzēja decimālo lauku tikai tāpēc, ka abi tiek saukti par portu.

Šis ir parsētājs norādītajam formātam, nevis JavaScript interpretators. Objektu literāļi ar vienkāršām pēdiņām, aprēķinātas vērtības un citas JavaScript izteiksmes prasa citu dokumentētu datu saskarni. Neizpildiet patvaļīgu lapas kodu, lai iegūtu galapunktu sarakstu.

Validējiet avota līgumu un turiet protokola laukus atsevišķi. Ja avotā tā vietā ir aizpildītas HTML rindas, izmantojiet galapunktu izguvi pa rindām, nevis šo JavaScript ietvara parsētāju. Adreses un porta izguve neapstiprina, ka galapunkts pašlaik piedāvā lietojamu prokšu pakalpojumu.

Saistītie raksti