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