แยก IP พร็อกซีและพอร์ตฐานสิบหกจาก JSON ที่ฝังอยู่
ถอดรหัสเพย์โหลด JSON ที่รู้จักจากการเรียกสคริปต์ของรายการพร็อกซี และตีความพอร์ตฐานสิบหกเฉพาะเมื่อรูปแบบต้นทางระบุไว้เท่านั้น
ตาราง 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 ที่ซ้อนกันด้วยนิพจน์ปกติเพียงอย่างเดียว
ฟิลด์พอร์ตในตัวอย่างเป็นฐานสิบหกอย่างชัดเจน: C38 หมายถึง 3128 ฐานสิบ อย่านำฐาน 16 ไปใช้กับฟิลด์ฐานสิบของผู้ให้บริการรายอื่นเพียงเพราะทั้งคู่เรียกว่าพอร์ต
นี่คือตัวแยกวิเคราะห์สำหรับรูปแบบที่ระบุ ไม่ใช่ตัวแปลภาษา JavaScript วัตถุลิเทอรัลที่ใช้เครื่องหมายคำพูดเดี่ยว ค่าที่คำนวณ และนิพจน์ JavaScript อื่น ๆ ต้องใช้อินเทอร์เฟซข้อมูลที่มีเอกสารอื่น ไม่ควรเรียกใช้โค้ดหน้าเว็บตามอำเภอใจเพื่อให้ได้รายการปลายทาง
ตรวจสอบสัญญาของต้นทางและเก็บฟิลด์โปรโตคอลแยกไว้ หากต้นทางมีแถว HTML ที่เติมแล้วแทน ให้ใช้การแยกปลายทางตามแถวแทนตัวแยกวิเคราะห์ตัวห่อ JavaScript นี้ การแยกที่อยู่และพอร์ตไม่ได้ยืนยันว่าปลายทางนั้นให้บริการพร็อกซีที่ใช้งานได้ในปัจจุบัน