Tabel HTML kosong tidak selalu berarti respons tidak memuat catatan proxy. Beberapa daftar menaruh objek JSON di dalam panggilan JavaScript dan mengisi barisnya kemudian.

Untuk sumber yang sudah diperoleh dan memakai pembungkus khusus gp.insertPrx diikuti objek 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 adalah teks sumber, bukan objek peramban. Ekspresi reguler menemukan pembungkus yang dikenal; JSONDecoder menentukan di mana nilai JSON berakhir. Ini menghindari upaya mengurai JSON bersarang hanya dengan ekspresi reguler.

Bidang port pada contoh secara eksplisit heksadesimal: C38 berarti 3128 desimal. Jangan terapkan basis 16 pada bidang desimal penyedia lain hanya karena keduanya disebut port.

Ini pengurai untuk format yang disebutkan, bukan juru bahasa JavaScript. Literal objek dengan kutip tunggal, nilai terhitung, dan ekspresi JavaScript lain memerlukan antarmuka data terdokumentasi lain. Jangan jalankan kode halaman sembarangan untuk mendapatkan daftar endpoint.

Validasi kontrak sumber dan simpan bidang protokol secara terpisah. Jika sumber justru memiliki baris HTML terisi, gunakan ekstraksi endpoint per baris alih-alih pengurai pembungkus JavaScript ini. Mengekstrak alamat dan port tidak membuktikan bahwa endpoint saat ini menawarkan layanan proxy yang dapat dipakai.

Artikel terkait