2026/4/17 2:37:56
网站建设
项目流程
网站建设和维护一年的费用,企业建网站得多少钱,wordpress设置先登录再进入,wordpress的豆瓣插件ChromeDriver执行JS脚本提取GLM网页动态内容
在视觉大模型日益普及的今天#xff0c;越来越多团队选择通过Web界面部署多模态模型以实现快速验证和交互式推理。智谱AI推出的 GLM-4.6V-Flash-WEB 正是这一趋势下的典型代表——它将强大的图文理解能力封装为轻量级Web服务…ChromeDriver执行JS脚本提取GLM网页动态内容在视觉大模型日益普及的今天越来越多团队选择通过Web界面部署多模态模型以实现快速验证和交互式推理。智谱AI推出的GLM-4.6V-Flash-WEB正是这一趋势下的典型代表——它将强大的图文理解能力封装为轻量级Web服务支持高并发、低延迟的图像问答任务尤其擅长中文语境下的复杂视觉推理。但问题也随之而来当需要批量测试模型表现、构建自动化评估流水线或集成到后台系统时仅靠手动点击浏览器显然不可持续。更棘手的是这类应用普遍采用前端JavaScript动态渲染输出结果传统的requests BeautifulSoup方式无法捕获真实响应内容。有没有一种方法既能绕过API缺失的限制又能精准抓取页面上由模型生成的动态文本答案是肯定的——借助ChromeDriver驱动无头浏览器并直接执行JavaScript脚本我们完全可以模拟人类操作全过程从输入提交到结果提取实现端到端自动化。为什么必须用 ChromeDriver要理解这个问题先得看清当前的技术瓶颈。很多开发者习惯使用requests库发送HTTP请求获取HTML再用解析工具提取信息。但对于像 GLM-4.6V-Flash-WEB 这样的现代Web应用来说初始返回的HTML几乎不包含任何有效数据。真正的模型输出是在用户上传图片并点击“提交”后由JavaScript异步插入DOM的。这意味着爬虫拿到的是“空壳页面”看不到最终结果即使你能构造出正确的POST请求也可能因缺少认证、会话状态或复杂的前端逻辑而失败模型本身运行在GPU服务器上输出需经过前端组件渲染才能展示。这时候只有能完整执行JavaScript并模拟真实用户行为的工具才可行。Selenium 配合 ChromeDriver 就是目前最成熟的选择。它不只是一个“高级爬虫”而是一个可编程的浏览器实例。你可以让它打开页面、填写表单、点击按钮、等待加载动画结束甚至注入自定义JS代码来读取内存变量或遍历DOM节点。这种能力对于没有开放API的服务而言几乎是唯一的自动化路径。如何让 ChromeDriver 精准提取 GLM 输出核心思路很清晰控制浏览器完成全流程交互然后通过execute_script()执行JavaScript直接读取目标元素的内容。下面这段Python代码展示了完整的实现流程from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 浏览器配置无头模式 性能优化 chrome_options Options() chrome_options.add_argument(--headless) chrome_options.add_argument(--no-sandbox) chrome_options.add_argument(--disable-dev-shm-usage) chrome_options.add_argument(--disable-gpu) chrome_options.add_argument(--disable-images) # 可选禁用图片提升速度 chrome_options.add_argument(--window-size1920,1080) driver webdriver.Chrome(optionschrome_options) try: # 访问本地部署的 GLM Web 页面 driver.get(http://localhost:8080) # 等待主输入框出现确保页面已加载 input_box WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, prompt-input)) ) input_box.send_keys(请描述这张图片的内容) # 点击提交按钮 submit_button driver.find_element(By.ID, submit-btn) submit_button.click() # 等待输出区域出现且有内容智能等待避免固定sleep wait WebDriverWait(driver, 15) output_element_present EC.presence_of_element_located((By.ID, response-output)) output_div wait.until(output_element_present) # 使用 execute_script 执行 JS 获取 innerText response_text driver.execute_script( const el document.getElementById(response-output); return el ? el.innerText.trim() : ; ) if response_text: print(✅ 模型输出成功提取) print(response_text) else: print(⚠️ 未检测到有效输出内容) except Exception as e: print(f❌ 自动化过程出错{str(e)}) finally: driver.quit() # 必须释放资源关键技术点解读1.execute_script()的威力相比反复调用find_element().text直接执行JavaScript有多个优势可访问Selenium无法定位的动态元素如临时弹窗、Shadow DOM能处理复杂的DOM查询逻辑比如查找最后一个.message-item支持返回对象、数组甚至函数执行结果绕过隐式等待机制更快获取状态。例如如果你想提取所有历史对话记录可以这样写all_texts driver.execute_script( return Array.from(document.querySelectorAll(.chat-history .message)) .map(el el.innerText); )2. 显式等待优于time.sleep()很多人图省事用time.sleep(5)等结果但这在生产环境中极不稳定。网络波动、GPU负载变化都会影响响应时间。更好的做法是使用WebDriverWait监听特定条件# 等待某个元素文本非空 wait.until(EC.text_to_be_present_in_element((By.ID, status), 完成)) # 或等待CSS类名变更如加载中 → 加载完成 wait.until(EC.attribute_contains((By.ID, loader), class, hidden))这不仅提高稳定性还能显著缩短平均等待时间。3. 定位策略的选择优先使用稳定的选择器✅ ID唯一性强推荐作为主要定位依据✅ Class Name / Tag Name适用于批量操作⚠️ XPath虽然强大但容易因前端结构调整失效❌ CSS Selector 层级过深如div div span:nth-child(2)极易断裂。建议与前端团队沟通在关键节点添加专用标识属性例如div idresponse-output>driver.find_element(By.CSS_SELECTOR, [data-auto-testmodel-response])进行定位既清晰又健壮。GLM-4.6V-Flash-WEB 到底适不适合自动化有些人可能会质疑为什么不直接调用API非要走浏览器这么迂回的方式其实这正是现实项目中的常见困境——很多团队为了快速上线演示系统只做了Web界面根本没有暴露REST接口。而你作为下游系统开发者不可能等到对方重构完再推进工作。幸运的是GLM-4.6V-Flash-WEB 的设计反而为自动化提供了便利它基于标准HTMLJS构建没有使用极端反爬手段页面结构清晰关键元素具备明确ID推理延迟控制在百毫秒级适合高频调用提供一键启动脚本本地部署极其简单。这意味着你可以快速搭建一个“影子集成”系统在不影响原有服务的前提下实现数据抓取。官方给出的部署方式也非常友好# 启动容器 docker run -it -p 8080:8080 --gpus all glm-4.6v-flash-web # 进入后运行预置脚本 cd /root bash 1键推理.sh几秒钟内就能看到Web界面跑起来。如果你还需要在Jupyter里做调试也可以通过Python发起HTTP请求import requests data { image: base64..., prompt: 图中有几个人 } resp requests.post(http://localhost:8080/infer, jsondata) print(resp.json()[result])但请注意这个API可能仅限内部使用文档也不完善。相比之下ChromeDriver方案虽然性能开销稍大但胜在零侵入、高兼容、无需依赖文档。实际应用场景远不止“抓文本”这套技术组合拳的价值远不止于提取一段回答。1. 模型质量监控你可以每天定时运行一批测试用例自动截图并记录模型输出形成回归测试报告。一旦发现某类问题识别准确率下降立即告警。2. 批量数据标注辅助面对海量图像数据集人工标注成本极高。可以用该方案批量输入图片让GLM先生成初步描述再由人工审核修正效率提升十倍以上。3. 教学演示自动化教师准备课程时常需录制一系列“提问→展示答案”的流程。手动操作费时且难以保证一致性。编写自动化脚本后一键生成全套演示素材。4. 第三方系统桥接某些老旧业务系统无法对接新模型API但允许嵌入Web视图。此时可通过ChromeDriver实现“UI层集成”充当临时的数据桥梁。工程实践中需要注意什么尽管方案可行但在真实环境中仍需注意以下几点内存与并发管理每个Chrome实例大约消耗100~300MB内存过多并发可能导致OOM。建议控制同时运行的driver实例数如最多5个使用上下文管理器确保quit()被调用在Docker中设置内存限制防止拖垮主机。异常处理要全面网络中断、元素找不到、超时、GPU过载等问题都可能发生。建议封装重试机制from tenacity import retry, stop_after_attempt, wait_fixed retry(stopstop_after_attempt(3), waitwait_fixed(2)) def safe_extract(): # 包含完整的 try-except 和等待逻辑 pass日志与追踪不可少保存每次请求的输入、截图、输出和耗时便于后续分析模型退化或性能瓶颈。安全边界要明确不要在公共服务器上暴露Chrome远程调试端口避免在脚本中硬编码敏感信息若用于生产环境建议升级为专用自动化平台如Playwright CI/CD。结语ChromeDriver 配合 JavaScript 脚本提取 GLM 动态内容表面看是一种“妥协方案”——毕竟谁不想直接调API呢但在实际工程中这种灵活性恰恰是最宝贵的。它让我们意识到即使没有完美的接口只要有可视化的输出就有办法实现自动化。这种能力在快速验证、临时集成、灰度发布等场景下尤为关键。随着“模型即服务”MaaS理念的普及未来会有更多AI能力以Web形式暴露出来。掌握这类浏览器自动化技巧不仅能帮你打通数据链路更能建立起连接前沿模型与传统系统的桥梁。当你下次面对一个只有界面没有API的神秘黑盒时不妨试试这条路让程序替你打开浏览器像人一样操作却比人更快、更准、永不疲倦。