Փրոքսի IP-ների և hex պորտերի հանում ներկառուցված JSON-ից
Ապակոդավորեք հայտնի JSON բեռները փրոքսի ցուցակների սկրիպտ կանչերից և hex պորտը մեկնաբանեք միայն այն դեպքում, երբ աղբյուրի ձևաչափը դա հայտարարում է։
Դատարկ 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-ը միայն կանոնավոր արտահայտությամբ վերլուծելու փորձից։
Օրինակի պորտի դաշտը բացահայտ hex է՝ C38 նշանակում է տասնորդական 3128։ Մի կիրառեք 16 հիմքը այլ մատակարարի տասնորդական դաշտի վրա միայն այն պատճառով, որ երկուսն էլ կոչվում են պորտ։
Սա նշված ձևաչափի վերլուծիչ է, ոչ JavaScript ինտերպրետատոր։ Մեկ չակերտով օբյեկտային լիտերալները, հաշվարկված արժեքները և այլ JavaScript արտահայտություններ պահանջում են մեկ այլ փաստաթղթավորված տվյալների ինտերֆեյս։ Մի կատարեք կամայական էջի կոդ՝ վերջնակետերի ցուցակ ստանալու համար։
Ստուգեք աղբյուրի պայմանագիրը և պրոտոկոլի դաշտերը պահեք առանձին։ Եթե աղբյուրում փոխարենը լրացված HTML տողեր կան, օգտագործեք տողով վերջնակետերի հանում այս JavaScript փաթաթայի վերլուծիչի փոխարեն։ Հասցե և պորտ հանելը չի ապացուցում, որ վերջնակետը ներկայումս առաջարկում է օգտագործելի փրոքսի ծառայություն։