Tuščia HTML lentelė ne visada reiškia, kad atsakyme nėra proxy įrašų. Kai kurie sąrašai deda JSON objektus į JavaScript kvietimus ir eilutes užpildo vėliau.

Jei jau gautas šaltinis naudoja konkretų apvalkalą gp.insertPrx, po kurio eina JSON objektas:

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 yra šaltinio tekstas, o ne naršyklės objektas. Reguliarusis reiškinys randa žinomą apvalkalą; JSONDecoder nustato, kur baigiasi JSON reikšmė. Taip išvengiama bandymo analizuoti įterptą JSON vien tik reguliariuoju reiškiniu.

Pavyzdžio prievado laukas yra aiškiai šešioliktainis: C38 reiškia dešimtainį 3128. Netikėkite 16 pagrindo kito teikėjo dešimtainiam laukui vien todėl, kad abu vadinami prievadu.

Tai nurodyto formato analizatorius, o ne JavaScript interpretatorius. Objektų literalai su viengubomis kabutėmis, apskaičiuotos reikšmės ir kiti JavaScript reiškiniai reikalauja kitos dokumentuotos duomenų sąsajos. Nevykdykite savavališko puslapio kodo, kad gautumėte galinių taškų sąrašą.

Patikrinkite šaltinio sutartį ir protokolo laukus laikykite atskirai. Jei šaltinyje vietoj to yra užpildytos HTML eilutės, naudokite galinių taškų išgavimą pagal eilutes, o ne šį JavaScript apvalkalo analizatorių. Adreso ir prievado išgavimas neįrodo, kad galinis taškas šiuo metu siūlo naudojamą proxy paslaugą.

Susiję straipsniai