Bảng HTML trống không phải lúc nào cũng có nghĩa là phản hồi không chứa bản ghi proxy. Một số danh sách đặt đối tượng JSON bên trong lời gọi JavaScript và điền các hàng sau đó.

Đối với nguồn đã lấy được dùng trình bao bọc cụ thể gp.insertPrx theo sau là một đối tượng 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 là văn bản nguồn, không phải đối tượng trình duyệt. Biểu thức chính quy tìm thấy trình bao bọc đã biết; JSONDecoder xác định nơi giá trị JSON kết thúc. Cách này tránh việc chỉ dùng biểu thức chính quy để phân tích JSON lồng nhau.

Trường cổng trong ví dụ là hex rõ ràng: C38 nghĩa là 3128 thập phân. Đừng áp dụng cơ số 16 cho trường thập phân của nhà cung cấp khác chỉ vì cả hai đều được gọi là cổng.

Đây là bộ phân tích cho định dạng đã nêu, không phải trình thông dịch JavaScript. Các literal đối tượng dùng nháy đơn, giá trị được tính toán và các biểu thức JavaScript khác cần một giao diện dữ liệu có tài liệu khác. Đừng chạy mã trang tùy ý để lấy danh sách điểm cuối.

Hãy xác thực hợp đồng của nguồn và giữ riêng các trường giao thức. Nếu nguồn thay vào đó có các hàng HTML đã điền, hãy dùng trích xuất điểm cuối theo hàng thay cho bộ phân tích trình bao bọc JavaScript này. Việc trích xuất địa chỉ và cổng không chứng minh rằng điểm cuối hiện cung cấp dịch vụ proxy dùng được.

Bài viết liên quan