fromseleniumimportwebdriverfromselenium.webdriver.common.keysimportKeysimporttimeimportrefrombs4importBeautifulSoupasbsimportpickleimportrequestsimportopenpyxlfromopenpyxlimportload_workbookfromselenium.webdriver.common.action_chainsimportActionChainsfromPILimportImageimportjsonimportosfromselenium.webdriver.chrome.optionsimportOptionsimportrandom options=webdriver.ChromeOptions()# 1. 解决证书错误(你的核心需求)options.add_argument('--ignore-certificate-errors')options.add_argument('--allow-running-insecure-content')# 2. 隐藏自动化特征(让网站难以检测是 Selenium)#options.add_experimental_option("excludeSwitches", ["enable-automation", "enable-logging"]) # 合并两个开关 这个打关闭cmd 不会关闭浏览器options.add_experimental_option('useAutomationExtension',False)options.add_argument('--disable-blink-features=AutomationControlled')# ========== 2. 基础窗口与语言(你原有的) ==========options.add_argument('--window-size=1920,1080')options.add_argument('--lang=zh-CN')options.add_argument('--log-level=3')# 只显示 FATAL 日志# ========== 3. 【新增】内存与进程“保命”配置(防止32GB爆满死机) ==========options.add_argument('--js-flags="--max-old-space-size=1536"')# ② 限制浏览器最多同时存在的渲染进程数量为 15 个(防止意外开太多)options.add_argument('--renderer-process-limit=15')# ③ 彻底禁用 GPU 硬件加速(视频解码泄漏的元凶)options.add_argument('--disable-gpu')options.add_argument('--disable-software-rasterizer')# ④ 禁用后台网络请求和预加载(减少突发内存申请)options.add_argument('--disable-background-networking')options.add_argument('--disable-sync')options.add_argument('--disable-default-apps')options.add_argument('--disable-component-update')# ⑥ 关闭 zygote 进程,避免 Selenium 长期运行时的内存碎片堆积options.add_argument('--no-zygote')browser=webdriver.Chrome(options=options)#Chrome浏览器驱动browser.get('https://baidu.com')#打开网页defc():browser.switch_to.default_content()bo=browser.find_element_by_id('frame')browser.switch_to.frame(bo)js="var q=document.documentElement.scrollLeft=1000"#左右js="var q=document.documentElement.scrollTop=100"browser.execute_script(js)js='var child=document.getElementById("link");child.parentNode.removeChild(child[115]);'js='var child=document.getElementsByClassName("pv-ask-modal-wrap")[0];child.remove();'try:#清零视频播放时间js='var child=document.getElementsByTagName("video");return child[0].currentTime = 0;'browser.execute_script(js)except:passbrowser.execute_script("arguments[0].scrollIntoView(true);",i)browser.execute_script("arguments[0].scrollIntoView(true); window.scrollBy(0, -100);",i)browser.execute_script("arguments[0].click();",dd)foriinrange(1):a=open("data.txt",encoding='utf-8')a=a.read()aa=json.loads(a)加载超时设置
browser.set_page_load_timeout(5)
# 二进制转16进制a='00000000'hex(int(a,2))滑动元素 browser.execute_script("arguments[0].scrollIntoView(true);",i)fromseleniumimportwebdriverimporttimefromselenium.webdriver.common.action_chainsimportActionChainsimportrefromselenium.webdriver.common.keysimportKeysfrombs4importBeautifulSoupasbsimportpickle options=webdriver.ChromeOptions()options.add_experimental_option("excludeSwitches",["enable-logging"])browser=webdriver.Chrome(options=options)#browser = webdriver.Chrome()#Chrome浏览器驱动js='window.open("https://www.baidu.com");'browser.execute_script(js)browser.get('https://www.taobao.com/')#打开网页defdian(s,w):xx=browser.find_elements_by_css_selector(s)foriinxx:ifw==i.text:print(i.text)i.click()time.sleep(1)breakelse:passhandles=browser.window_handles browser.switch_to.window(handles[0])js="var q=document.getElementById('id').scrollTop=10000"browser.execute_script(js) js="var q=document.documentElement.scrollTop=100"browser.execute_script(js)js='myVid=document.querySelector("video");alert(myVid.duration);'# 这里是获取第一个video标签browser.execute_script(js)#取得一个视频长度js='myVid=document.getElementById("videoSource");alert(myVid.duration);'browser.execute_script(js)try:alert=browser.switch_to.alert con=alert.textprint(con)t=int(float(con)/60)+1print(t)alert.accept()except:t=30js="var q=document.getElementsByClassName('content')[0].scrollTop = 10000"#可指定元素滑动defc():bo=browser.find_element_by_xpath('//*[@id="task-content-iframe"]')browser.switch_to.frame(bo)browser.switch_to.default_content()html=bo.get_attribute('innerHTML')js='videoList(10108325)'browser.execute_script(ji)try:alert=browser.switch_to.alert con=alert.textprint(con)alert.accept()except:pass#元素截图s=browser.find_element_by_id('safecode')s.screenshot('1.png')#。。。。。。。。。。。。。。。。。。。。。。。。。。。defc():#滑动元素foriinrange(1):browser.switch_to.default_content()bo=browser.find_element_by_id('baxia-dialog-content')browser.switch_to.frame(bo)d=browser.find_element_by_id('nc_1_n1z')ActionChains(browser).click_and_hold(d).perform()xx=300whilexx>0:x=random.randint(50,80)xx=xx-xprint(x)ActionChains(browser).move_by_offset(xoffset=x,yoffset=0).perform()ActionChains(browser).release(d).perform()# selenium 4.0#idx=browser.find_element(By.ID,'kw')#id#namex=browser.find_element(By.NAME,'wd')#id#classx=browser.find_element(By.CLASS_NAME,'cos-pc')#id#TAG p div span ul lix=browser.find_element(By.TAG_NAME,'body')#id#By.LINK_TEXT表示全部匹配linktext定位找到元素x=browser.find_element(By.LINK_TEXT,'百度首页')#id#By.PARTIAL_LINK_TEXT表示模糊匹配linktext定位找到元素x=browser.find_element(By.PARTIAL_LINK_TEXT,'百度首页')x=browser.execute_script(js)defma():defsss():importddddocr ocr=ddddocr.DdddOcr()withopen('1.png','rb')asf:img_bytes=f.read()res=ocr.classification(img_bytes)#print(res)returnresforiinrange(10):u=browser.find_element_by_id('checkcode')#验证码u.screenshot('1.png')m=sss()print(m)iflen(m)==4:returnmelse:u.click()time.sleep(1)defdeng():foriinrange(1):n=''m=''browser.get('http://lzjtu.lllnet.cn/')time.sleep(5)nn=browser.find_element_by_id('loginName')mm=browser.find_element_by_id('password')num=browser.find_element_by_id('randNum')nn.clear()mm.clear()num.clear()a=ma()nn.send_keys(n)mm.send_keys(m)num.send_keys(a)time.sleep(1)browser.find_element_by_class_name('l_btn1').click()time.sleep(5)defvo():#获取当前播放时间,如果两次时间没变就表示暂停了就点播放foriinrange(1):try:js='myVid=document.getElementById("videoMedia");alert(myVid.currentTime);'browser.execute_script(js)time.sleep(1)except:passtry:alert=browser.switch_to.alert con=alert.text t=float(con)alert.accept()except:t=0time.sleep(6)try:js='myVid=document.getElementById("videoMedia");alert(myVid.currentTime);'browser.execute_script(js)time.sleep(1)except:passtry:alert=browser.switch_to.alert con=alert.text tt=float(con)alert.accept()except:tt=0ift==tt:try:browser.find_element_by_id('videoMedia').click()except:passelse:passMicrosoft Edge
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/?form=MA13LH
chromedriver驱动下载地址:
最新下载链接:
https://googlechromelabs.github.io/chrome-for-testing/http://chromedriver.storage.googleapis.com/index.html
国内镜像:https://registry.npmmirror.com/binary.html?path=chromedriver/
同时提供geckodriver和iedriverserver的下载地址:
geckodriver:
https://github.com/mozilla/geckodriver/releases
iedriverserver:
http://selenium-release.storage.googleapis.com/index.html
————————————————
def open_html(d):
for i in range(1): url =http://www.gongxukexuexi.com/ headers ={} headers["Accept"]='*/*' headers["Accept-Encoding"]='gzip, deflate, br, zstd' headers["Accept-Language"]='zh-CN,zh;q=0.9' headers["Connection"]='keep-alive' headers["Content-Length"]='293' headers["Content-Type"]='application/x-www-form-urlencoded; charset=UTF-8' headers["Cookie"]='.sdlpalearnauth=D2BC9CF1F6C6507F915A3EA5E94F44C42A72042A387DFDFEC82C9F535C20467ECF46D00857E816DA9C6ADA1A66A7826D40F8B683DB7CE22A0EB5400419657AAD1A80791B2829F23D491F573826A7610D291ABC04E9FD4BA6F10631A3C03D0E0C492F3DB7EB605D7662BAE4E0F5E87F603F9A1163857901B063CE3A4FA7F2BE5244967516' headers["Host"]='sdutcm.sdlpa.org.cn' headers["Origin"]='https://sdutcm.sdlpa.org.cn' headers["Referer"]='https://sdutcm.sdlpa.org.cn/home/Exam/17?cId=512' headers["Sec-Fetch-Dest"]='empty' headers["Sec-Fetch-Mode"]='cors' headers["Sec-Fetch-Site"]='same-origin' headers["User-Agent"]='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36' headers["X-Requested-With"]='XMLHttpRequest' headers["sec-ch-ua"]='"Chromium";v="128", "Not;A=Brand";v="24", "Google Chrome";v="128"' headers["sec-ch-ua-mobile"]='?0' headers["sec-ch-ua-platform"]='"Windows"' data ='classId=17&endJson=%5B%7B%22id%22%3A21913%2C%22answer%22%3A%22A%22%7D%2C%7B%22id%22%3A21932%2C%22answer%22%3A%22A%22%7D%2C%7B%22id%22%3A21955%2C%22answer%22%3A%22A%22%7D%2C%7B%22id%22%3A21918%2C%22answer%22%3A%22A%22%7D%2C%7B%22id%22%3A21943%2C%22answer%22%3A%22A%22%7D%5D&cid=512&pid=18249788'defkan2(current_time=0,browser=browser):foriinrange(1):js='var child=document.getElementsByTagName("video");return child[0].currentTime = 0;'#清零视频播放时间js='var child=document.getElementsByTagName("video");return child[0].playbackRate = 1.0;'#视频倍数js='var child=document.getElementsByTagName("video");return child[0].duration'#获取视频总长度#duration = browser.execute_script(js)duration=browser.run_js(js)t=int(duration/60)+2print(duration,t)""" 模拟视频播放,匹配原始视频时间 Args: browser: Selenium WebDriver 实例 duration: 视频总时长(秒),默认60 current_time: 当前播放时间(秒),默认0 """js=f""" (function() {{ const videoDuration ={duration}; let videoCurrentTime ={current_time}; const startTime = Date.now() / 1000 - videoCurrentTime; function createFakeVideoStream() {{ const canvas = document.createElement('canvas'); canvas.width = 2; canvas.height = 2; const ctx = canvas.getContext('2d'); let frame = 0; function drawFrame() {{ frame++; const color = 10 + (frame % 5); ctx.fillStyle = `rgb(${{color}},${{color}},${{color}})`; ctx.fillRect(0, 0, 2, 2); requestAnimationFrame(drawFrame); }} drawFrame(); return canvas.captureStream(30); }} const fakeStream = createFakeVideoStream(); function replaceVideos() {{ document.querySelectorAll('video').forEach(v => {{ if (v.src || v.querySelector('source[src]') || (v.srcObject && !v.srcObject._isFake)) {{ if (v.srcObject) {{ v.srcObject.getTracks().forEach(t => t.stop()); }} v.removeAttribute('src'); v.querySelectorAll('source').forEach(s => s.remove()); v.srcObject = fakeStream; fakeStream._isFake = true; // 重写时间相关属性 Object.defineProperty(v, 'duration', {{ get: () => videoDuration, configurable: true }}); Object.defineProperty(v, 'currentTime', {{ get: () => {{ const elapsed = Date.now() / 1000 - startTime; return Math.min(elapsed, videoDuration); }}, set: (val) => {{ videoCurrentTime = val; }}, configurable: true }}); Object.defineProperty(v, 'paused', {{ get: () => false }}); Object.defineProperty(v, 'ended', {{ get: () => Date.now() / 1000 - startTime >= videoDuration }}); try {{ var __p = v.play(); if (__p && typeof __p.catch === 'function') __p.catch(function(){{}}); }} catch (e) {{}} v.muted = true; console.log('✅ 视频已替换,时长:' + videoDuration + 's, 当前:' + videoCurrentTime + 's'); }} }}); }} replaceVideos(); setInterval(replaceVideos, 2000); console.log('✅ 视频欺骗已注入'); }})(); """#browser.execute_script(js)browser.run_js(js)print(f"✅ 假视频流已注入 (总时长:{duration}s, 已播放:{current_time}s)")