diff --git a/spider/main.py b/spider/main.py index d652597..997fa9d 100644 --- a/spider/main.py +++ b/spider/main.py @@ -152,7 +152,7 @@ class Auto: # 刷新网页 self.tab.refresh() self.tab.wait(1.5) - + bol = self.tab.ele( 't:h2@text()=You are being rate limited', timeout=1) if bol: @@ -484,14 +484,31 @@ def get_random_proxy() -> list[str] | None: list[str] | None: 代理参数列表 `[host, port, user, pwd]`;无可用代理返回 None """ proxy_list = [ - "us.novproxy.io:1000:ozua8623-region-CA:6wdcv4gq", - "us.novproxy.io:1000:ozua8623-region-US:6wdcv4gq", + "us.novproxy.io:1000:zhiyu111-region-CA:zhiyu111", + "us.novproxy.io:1000:zhiyu111-region-US:zhiyu111", + "us.novproxy.io:1000:zhiyu222-region-CA:zhiyu222", + "us.novproxy.io:1000:zhiyu222-region-US:zhiyu222", ] try: return random.choice(proxy_list).split(':') except Exception: return None +def get_all_proxies() -> list[list[str]]: + """ + 返回固定代理列表(与提供的代理一一对应) + + 返回值: + list[list[str]]: 每个元素为 `[host, port, user, pwd]` + """ + proxy_list = [ + "us.novproxy.io:1000:zhiyu111-region-CA:zhiyu111", + "us.novproxy.io:1000:zhiyu111-region-US:zhiyu111", + "us.novproxy.io:1000:zhiyu222-region-CA:zhiyu222", + "us.novproxy.io:1000:zhiyu222-region-US:zhiyu222", + ] + return [p.split(":") for p in proxy_list] + """指纹浏览器操作""" # 创建指纹浏览器 @@ -631,7 +648,87 @@ def run_random_ips_concurrently(num: int): logger.info("随机 IP 并发流程执行完成") +def create_fingerprint_browser_with_proxy(proxy: list[str]): + """ + 使用指定代理创建指纹浏览器并执行一次流程(一一对应) + + 参数: + proxy (list[str]): `[host, port, user, pwd]` + """ + browser_id = None + try: + if not proxy or len(proxy) < 4: + logger.error("代理参数不完整,结束该线程") + return + browser_id = bit_browser.bit_browser_create( + remark=f"{proxy[2]}", + host=proxy[0], + port=proxy[1], + proxy_user=proxy[2], + proxy_pwd=proxy[3], + proxy_type='socks5' + ) + http = bit_browser.bit_browser_open(browser_id) + auto = Auto(http) + auto.open_url( + "https://veritaconnect.ca/canadianbreadsettlement/en-us/Claimant/UnknownClaimForm") + bol = auto.wait_home() + if not bol: + logger.error("进入首页失败,结束该线程") + return + bol = auto.click_continue() + if not bol: + logger.error("点击 Continue 失败,结束该线程") + return + auto.fill_questionnaire() + finally: + if browser_id: + try: + bit_browser.bit_browser_close(browser_id) + except Exception as e: + logger.error(f"关闭浏览器异常: {e}") + try: + bit_browser.bit_browser_delete(browser_id) + except Exception as e: + logger.error(f"删除浏览器异常: {e}") + + +def run_proxies_forever(proxy: list[str]): + """ + 持续使用指定代理执行流程:完成后关闭并删除浏览器再重建 + + 参数: + proxy (list[str]): `[host, port, user, pwd]` + """ + while True: + try: + create_fingerprint_browser_with_proxy(proxy) + except Exception as e: + logger.error(f"固定代理流程异常: {e}") + time.sleep(2) + + +def run_all_proxies_concurrently(): + """ + 按固定代理列表一一创建并发浏览器 + """ + import threading + proxies = get_all_proxies() + if not proxies: + logger.warning("未找到可用代理,结束执行") + return + threads = [] + for i, proxy in enumerate(proxies): + t = threading.Thread(target=run_proxies_forever, args=(proxy,), name=f"proxy-thread-{i}") + t.start() + threads.append(t) + logger.info(f"固定代理线程 {i} 已启动: {proxy[0]}:{proxy[1]} @ {proxy[2]}") + for t in threads: + t.join() + logger.info("固定代理并发流程执行完成") + + if __name__ == "__main__": # auto = Auto() # auto.get_random_food('a') - run_all_cities_concurrently(1) + run_all_proxies_concurrently()