Spaces:
Running
Running
File size: 7,521 Bytes
eba4f96 2e07b42 eba4f96 2e07b42 7fbacf2 2e07b42 256ee66 2e07b42 256ee66 6bd765e 256ee66 6bd765e 256ee66 1c62e5c 2e07b42 6bd765e 2e07b42 256ee66 2e07b42 8d4cd13 2e07b42 1c62e5c 2e07b42 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | import threading
import requests
import urllib.parse
import time
import random
from concurrent.futures import ThreadPoolExecutor
import gradio as gr
# --- Scraper setup ---
targetUrl = urllib.parse.quote("https://ntmtmp.xyz/prof.php")
geo_list = ["kr"]
normal_url_template = (
"http://api.scrape.do/?url=http://fmstarlive.com/newprof.php"
"&token=2c01f2b399ab4e72ac4f3b40d2190d467bce2197f48"
"&super=true&geoCode={geo}&sessionId={session}"
"&render=true&waitUntil=load&customWait=5000"
"&width=1920&height=1080&returnJSON=true&blockResources=false&screenShot=true"
"&playWithBrowser=%5B"
"%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A8000%7D,"
"%7B%22Action%22%3A%22ScreenShot%22%7D,"
"%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A1000%7D,"
"%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22%23ymg1%22%7D,"
"%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A2000%7D,"
"%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22%23ymg2%22%7D,"
"%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D,"
"%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22.mgline-inner%22%7D,"
"%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A30000%7D,"
"%7B%22Action%22%3A%22ScrollX%22%2C%22Value%22%3A500%7D,"
"%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22%23button_id123%22%7D,"
"%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D"
"%5D"
)
special_url_template = "http://api.scrape.do/?url=https%3A%2F%2Ffmstarlive.com%2Fnewprof.php&token=2c01f2b399ab4e72ac4f3b40d2190d467bce2197f48&super=true®ionalGeoCode={geo}&render=true&waitUntil=domcontentloaded&customWait=4000&width=1920&height=1080&returnJSON=true&blockResources=false&screenShot=true&playWithBrowser=%5B%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A1000%7D%2C%7B%22Action%22%3A%22ScreenShot%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3B+if+%28iframe%29+%7B+var+doc+%3D+iframe.contentDocument+%7C%7C+iframe.contentWindow.document%3B+var+el+%3D+doc.querySelector%28%27.wrapper%27%29%3B+if+%28el%29+%7B+el.click%28%29%3B+console.log%28%27clicked%27%29%3B+%7D+else+%7B+console.log%28%27wrapper+not+found%27%29%3B+%7D+%7D+else+%7B+console.log%28%27iframe+not+found%27%29%3B+%7D%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3B+var+result+%3D+%27init%27%3B+if+%28iframe%29+%7B+var+doc+%3D+iframe.contentDocument+%7C%7C+iframe.contentWindow.document%3B+var+el+%3D+doc.querySelector%28%27.wrapper%27%29%3B+if+%28el%29+%7B+el.click%28%29%3B+result+%3D+%27clicked%27%3B+%7D+else+%7B+result+%3D+%27wrapper+not+found%27%3B+%7D+%7D+else+%7B+result+%3D+%27iframe+not+found%27%3B+%7D+result%3B%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelectorAll%28%27iframe%27%29%5B1%5D%3B+if+%28iframe%29+%7B+var+doc+%3D+iframe.contentDocument+%7C%7C+iframe.contentWindow.document%3B+var+el+%3D+doc.querySelector%28%27.wrapper%27%29%3B+if+%28el%29+el.click%28%29%3B+%7D%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3B+if+%28iframe%29+%7B+var+doc+%3D+iframe.contentDocument+%7C%7C+iframe.contentWindow.document%3B+var+el+%3D+doc.querySelector%28%27.wrapper%27%29%3B+if+%28el%29+%7B+var+rect+%3D+el.getBoundingClientRect%28%29%3B+var+x+%3D+rect.left+%2B+rect.width%2F2%3B+var+y+%3D+rect.top+%2B+rect.height%2F2%3B+%5B%27mousedown%27%2C%27mouseup%27%2C%27click%27%5D.forEach%28function%28type%29%7B+var+evt+%3D+new+MouseEvent%28type%2C%7Bbubbles%3Atrue%2Ccancelable%3Atrue%2Cview%3Awindow%2CclientX%3Ax%2CclientY%3Ay%7D%29%3B+el.dispatchEvent%28evt%29%3B+%7D%29%3B+console.log%28%27dispatched%27%29%3B+%7D+%7D%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3B+if+%28iframe%29+%7B+iframe.click%28%29%3B+%7D%22%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22iframe%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3B+if+%28iframe%29+%7B+var+r+%3D+iframe.getBoundingClientRect%28%29%3B+var+x+%3D+r.left+%2B+r.width%2F2%3B+var+y+%3D+r.top+%2B+r.height%2F2%3B+var+el+%3D+document.elementFromPoint%28x%2Cy%29%3B+if%28el%29+el.click%28%29%3B+%7D%22%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22iframe%5Bsrcdoc%5D%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3F.click%28%29%22%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D%2C%7B%22Action%22%3A%22ScrollX%22%2C%22Value%22%3A174%7D%2C%7B%22Action%22%3A%22ScrollY%22%2C%22Value%22%3A145%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A5000%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22%23button_id%22%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A19000%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A1000%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22div%22%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D%2C%7B%22Action%22%3A%22ScrollX%22%2C%22Value%22%3A100%7D%2C%7B%22Action%22%3A%22ScrollY%22%2C%22Value%22%3A100%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22button%22%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22iframe%22%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D%5D"
# --- Control flag ---
running = False
# --- Function to send a single request ---
def send_request(counter):
session_id = random.randint(1000, 99999)
geo = random.choice(geo_list)
if counter % 2 == 0:
url = normal_url_template.format(geo=geo, session=session_id)
print(f"[{counter}] SPECIAL | geo={geo} | session={session_id}")
else:
url = normal_url_template.format(geo=geo, session=session_id)
print(f"[{counter}] NORMAL | geo={geo} | session={session_id}")
try:
response = requests.get(url, timeout=60)
print(f"Response {counter}:", response.status_code)
except Exception as e:
print(f"Error {counter}:", e)
# --- Main loop ---
def scraper_loop_concurrent():
global running
counter = 0
with ThreadPoolExecutor(max_workers=5) as executor:
while running:
counter += 1
futures = [executor.submit(send_request, counter + i) for i in range(5)]
for future in futures:
future.result()
print("Batch done, waiting 10 seconds...\n")
time.sleep(10)
# --- Start function (Gradio button) ---
def start_scraper():
global running
if running:
return "Already running"
running = True
thread = threading.Thread(target=scraper_loop_concurrent, daemon=True)
thread.start()
return "Scraper started"
# --- Stop function (optional but useful) ---
def stop_scraper():
global running
running = False
return "Scraper stopped"
# --- Gradio UI ---
with gr.Blocks() as demo:
gr.Markdown("## Scraper Control Panel")
start_btn = gr.Button("Start Scraper")
stop_btn = gr.Button("Stop Scraper")
output = gr.Textbox(label="Status")
start_btn.click(fn=start_scraper, outputs=output)
stop_btn.click(fn=stop_scraper, outputs=output)
# --- Launch UI ---
if __name__ == "__main__":
demo.launch() |