构建 Roboflow Universe 搜索代理:自动化 ML 模型发现

发布: (2026年1月6日 GMT+8 00:43)
6 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的文章正文内容,我会将其翻译成简体中文并保留原有的格式、Markdown 语法以及技术术语。代码块和 URL 将保持不变。

问题

作为机器学习爱好者,我经常在 Roboflow Universe 上浏览寻找预训练模型。
手动搜索、点击页面并复制 API 端点既繁琐又耗时。我希望能够:

  • 按关键字搜索模型
  • 提取详细信息(指标、类别、API 端点)
  • 获取可以编程使用的结构化数据

于是我构建了一个能够实现上述功能的 Python 网络爬虫!🚀

功能说明

  • ✅ 使用自定义关键字搜索 Roboflow Universe
  • ✅ 提取模型详情(标题、作者、指标、类别)
  • 使用多种提取策略查找 API 端点
  • ✅ 输出结构化 JSON 数据
  • ✅ 优雅地处理重试和错误

挑战:寻找 API 端点

最棘手的部分是可靠地提取 API 端点。Roboflow 在多个位置显示它们:

  • JavaScript 代码片段
  • 模型 ID 变量
  • 输入字段
  • 页面文字
  • 旧版端点格式

我需要一个稳健的解决方案,以免在网站结构变化时出现故障。

解决方案:多策略提取

与其依赖单一方法,我实现了 六种不同的提取策略 并配有回退机制。

策略 1:JavaScript 代码块

最可靠的来源——API 端点出现在代码片段中:

js_patterns = [
    r'url:\s*["\']https://serverless\.roboflow\.com/([^"\'?\s]+)["\']',
    r'"https://serverless\.roboflow\.com/([^"\'?\s]+)"',
    r'https://serverless\.roboflow\.com/([a-z0-9\-_]+/\d+)',
]

策略 2:模型 ID 模式

从 JavaScript 变量中提取:

model_id_patterns = [
    r'model_id["\']?\s*[:=]\s*["\']([a-z0-9\-_]+/\d+)["\']',
    r'MODEL_ENDPOINT["\']?\s*[:=]\s*["\']([a-z0-9\-_]+/\d+)["\']',
]

策略 3:输入字段和文本区域

检查表单元素和代码块:

input_selectors = [
    "input[value*='serverless.roboflow.com']",
    "textarea",
    "code",
]

策略 4:页面文本搜索

回退到页面上可见的文本。

策略 5:旧版端点

支持旧版端点格式:

  • detect.roboflow.com
  • classify.roboflow.com
  • segment.roboflow.com

策略 6:URL 构建

如果其他方法都失败,则根据页面 URL 结构构建端点。

这种多策略方法确保即使页面结构变化,也能找到 API 端点!

技术栈

  • Playwright – 浏览器自动化(相较于 requests 对动态内容更可靠)
  • Python 3.7+ – 核心语言
  • Regex – 用于提取的模式匹配

用法

基本示例

# Search for basketball detection models
SEARCH_KEYWORDS="basketball model object detection" \
MAX_PROJECTS=5 \
python roboflow_search_agent.py

JSON 输出

# Get structured JSON output
SEARCH_KEYWORDS="soccer ball instance segmentation" \
OUTPUT_JSON=true \
python roboflow_search_agent.py

示例输出

[
  {
    "project_title": "Basketball Detection",
    "url": "https://universe.roboflow.com/workspace/basketball-detection",
    "author": "John Doe",
    "project_type": "Object Detection",
    "has_model": true,
    "mAP": "85.2%",
    "precision": "87.1%",
    "recall": "83.5%",
    "training_images": "5000",
    "classes": ["basketball", "player"],
    "api_endpoint": "https://serverless.roboflow.com/basketball-detection/1",
    "model_identifier": "workspace/basketball-detection"
  }
]

关键特性

  1. 智能搜索 – 工具会自动应用 “Has a Model” 过滤器并处理关键字优先级。
  2. 全面数据提取 – 提取性能指标、训练数据信息、项目元数据以及难以获取的 API 端点。
  3. 强大的错误处理 – 自动重试(3 次)、优雅的失败处理以及超时管理。
  4. 灵活的输出 – 人类可读的控制台输出,供程序使用的 JSON 格式,可通过环境变量进行配置。

技术要点

使用 Playwright 进行浏览器自动化

def connect_browser(headless=True):
    playwright = sync_playwright().start()
    browser = playwright.chromium.launch(
        headless=headless,
        args=["--no-sandbox", "--disable-setuid-sandbox"]
    )
    context = browser.new_context(viewport={"width": 1440, "height": 900})
    page = context.new_page()
    return playwright, browser, context, page

智能滚动

与固定等待不同,爬虫会检测内容何时停止加载:

def scroll_page(page, max_scrolls=15):
    last_height = 0
    for _ in range(max_scrolls):
        page.evaluate("window.scrollBy(0, window.innerHeight)")
        page.wait_for_timeout(800)
        new_height = page.evaluate("document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height

Lessons Learned

  • Multiple Strategies > Single Strategy – 拥有备选方案可以让爬虫更加可靠。
  • Playwright > Requests – 对于动态网站,浏览器自动化是必不可少的。
  • Pattern Matching – 正则表达式模式需要使用真实数据进行仔细测试。
  • Error Handling – 网页抓取非常脆弱;务必加入重试逻辑。

用例

  • 研究 – 快速查找特定任务的模型。
  • API 发现 – 获取可直接使用的集成端点。
  • 自动化 – 将模型元数据输入到流水线或仪表板中。

祝爬取愉快!

📦 安装

# Clone the repository
git clone https://github.com/SumitS10/Roboflow-.git
cd roboflow

# Install dependencies
pip install -r requirements.txt

# Install Playwright browsers
playwright install chromium

🔧 功能

  • 模型比较 – 在多个模型之间比较指标。
  • 自动化 – 无缝集成到机器学习流水线中。

🚀 未来改进

  • 添加按指标过滤(例如 mAP > 80%)
  • 支持批量处理多个搜索
  • 将结果导出为 CSV/Excel
  • 添加高级模型比较功能
  • 缓存结果以避免重新抓取

🏁 结论

构建这个爬虫让我学到了很多关于网页抓取、浏览器自动化以及处理边缘情况的知识。多策略的 API 提取方法是确保其可靠性的关键。

如果你正在使用 Roboflow 模型或需要自动化模型发现,试一试吧!欢迎贡献和反馈。

🔗 链接

  • GitHub 仓库
  • Roboflow Universe
Back to Blog

相关文章

阅读更多 »

RGB LED 支线任务 💡

markdown !Jennifer Davishttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%...

Mendex:我为何构建

介绍 大家好。今天我想分享一下我是谁、我在构建什么以及为什么。 早期职业生涯与倦怠 我在 17 年前开始我的 developer 生涯……