Извличане на прокси 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 обвивки. Извличането на адрес и порт не доказва, че крайната точка в момента предлага използваема прокси услуга.