构建 Roboflow Universe 搜索代理:自动化 ML 模型发现
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.comclassify.roboflow.comsegment.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"
}
]
关键特性
- 智能搜索 – 工具会自动应用 “Has a Model” 过滤器并处理关键字优先级。
- 全面数据提取 – 提取性能指标、训练数据信息、项目元数据以及难以获取的 API 端点。
- 强大的错误处理 – 自动重试(3 次)、优雅的失败处理以及超时管理。
- 灵活的输出 – 人类可读的控制台输出,供程序使用的 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: