文章目录

    • Firecrawl 是什么?
    • 本地部署
    • 验证
    • mcp安装
    • palyground

🔥 5 分钟上手 Firecrawl

Firecrawl 是什么?

一句话:
开源版的 “最强网页爬虫 + 清洗引擎”
• 自动把任意网页 → 结构化 Markdown / JSON
• 支持递归整站抓取、JS 渲染、PDF 解析、图片 alt 自动生成
• 提供 REST API,LangChain / LlamaIndex 官方集成

官方网站

image.png

可以在playground中进行测试

image.png

点击Get Code可以获得调用模板代码

# Install with pip install firecrawl-py
import asyncio
from firecrawl import AsyncFirecrawlAppasync def main():app = AsyncFirecrawlApp(api_key='fc-d7310201c7684ec58408d62fac5d88b2')response = await app.scrape_url(url='https://blog.csdn.net/u012399690/article/details/149668148',		formats= [ 'markdown' ],only_main_content= Trueparse_pdf= True,max_age= 14400000)print(response)asyncio.run(main())

本地部署

官方提供500 credits免费额度,对于经常需要使用或者隐私要求高的用户可以选择本地部署。

第一步:拉取代码

git clone https://github.com/mendableai/firecrawl.git

第二步:修改配置

cp apps/api/.env.example .env

按需修改,为了简单,可以关闭验证
image.png

最小配置

NUM_WORKERS_PER_QUEUE=4
PORT=3002
HOST=0.0.0.0
REDIS_URL=redis://redis:6379
REDIS_RATE_LIMIT_URL=redis://redis:6379
PLAYWRIGHT_MICROSERVICE_URL=http://playwright-service:3000/html
USE_DB_AUTHENTICATION=false

🐳 启动

docker compose build   # 第一次拉镜像
docker compose up -d   # 后台跑

访问:

  • API:http://localhost:3002
  • 队列管理:http://localhost:3002/admin/@/queues

image.png

验证

cURL命令,可在终端中快速验证

curl -X POST http://localhost:3002/v0/scrape \-H 'Content-Type: application/json' \-d '{"url": "https://www.ithome.com/0/871/372.htm","formats": [ "markdown" ],"onlyMainContent": true,"parsePDF": true,"maxAge": 14400000}'

返回示例:

{"success": true,"data": {"content": "xxx","markdown": "xxx","linksOnPage": ["https://www.ithome.com/0/871/372.htm#","https://m.ithome.com/",],"metadata": {"ogImage": "https://img.ithome.com/m/images/logo.png","language": "zh","viewport": "width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no","description": "智谱发布新一代旗舰模型GLM-4.5,专为智能体应用打造,综合能力达到开源SOTA,实测国内最佳。采用混合专家架构,提供两种模式,高速低成本。API已上线开放平台BigModel.cn,也可在智谱清言和z.ai免费体验。#AI大模型# #智谱GLM4.5#","og:image": "https://img.ithome.com/m/images/logo.png","format-detection": "telephone=no","keywords": "智谱,GLM4.5,智能时代,人工智能","apple-itunes-app": "app-id=570610859, app-argument=ithome://news?id=871372&type=news","title": "智谱发布新一代旗舰开源模型 GLM-4.5,专为智能体应用打造 - IT之家","apple-mobile-web-app-status-bar-style": "white","apple-mobile-web-app-capable": "yes","theme-color": "#fff","favicon": "https://m.ithome.com/favicon.ico","scrapeId": "07988df7-f880-4d8e-85ee-c434a2a931c3","sourceURL": "https://www.ithome.com/0/871/372.htm","url": "https://www.ithome.com/0/871/372.htm","contentType": "text/html; charset=utf-8","proxyUsed": "basic","pageStatusCode": 200}},"returnCode": 200
}

示例

image.png

mcp安装

我们可以通过mcp客户端,和ai协同工作。以cheery studio为例
复制如下配置,或者在魔搭等mcp广场进行配置,然后一键同步。主要修改API_KEY

{"mcpServers": {"mcp-server-firecrawl": {"command": "npx","args": ["-y", "firecrawl-mcp"],"env": {"FIRECRAWL_API_KEY": "YOUR_API_KEY_HERE"}}}
}

如果需要配置为自建服务

{"mcpServers": {"mcp-server-firecrawl": {"command": "npx","args": ["-y", "firecrawl-mcp"],"env": {"FIRECRAWL_API_URL": "http://localhost:3002","FIRECRAWL_API_KEY": "optional-if-you-enable-auth"}}}
}

image.png

cherry studio中进行调用

image.png

palyground

开源版并没有提供playground,只能进行api或者mcp调用。这里提供一个简单的html页面。
image.png

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><title>Firecrawl 自建可视化 UI</title><meta name="viewport" content="width=device-width,initial-scale=1" /><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" /><link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" rel="stylesheet" /><style>body {padding-top: 70px;background: #f8f9fa;}.card {box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);}.result-area {max-height: 400px;overflow-y: auto;font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono","Courier New", monospace;font-size: 0.8rem;}.config-panel {transition: all 0.3s ease;}.collapse:not(.show) {display: none;}</style>
</head><body><nav class="navbar navbar-expand navbar-dark bg-primary fixed-top"><div class="container-fluid"><a class="navbar-brand fw-bold" href="#"><i class="bi bi-fire"></i> Firecrawl UI</a><button class="btn btn-outline-light btn-sm" data-bs-toggle="modal" data-bs-target="#configModal"><i class="bi bi-gear"></i> 配置</button></div></nav><div class="container"><!-- 功能区 --><div class="card mb-3"><div class="card-header"><ul class="nav nav-tabs card-header-tabs" id="mainTabs" role="tablist"><li class="nav-item" role="presentation"><button class="nav-link active" id="scrape-tab" data-bs-toggle="tab" data-bs-target="#scrape-pane"type="button" role="tab" aria-controls="scrape-pane" aria-selected="true">📥 单页抓取</button></li><li class="nav-item" role="presentation"><button class="nav-link" id="crawl-tab" data-bs-toggle="tab" data-bs-target="#crawl-pane" type="button"role="tab" aria-controls="crawl-pane" aria-selected="false">🕸️ 整站抓取</button></li></ul></div><div class="card-body"><div class="tab-content" id="mainTabContent"><!-- 单页抓取面板 --><div class="tab-pane fade show active" id="scrape-pane" role="tabpanel" aria-labelledby="scrape-tab"><div class="mb-3"><label for="scrapeUrl" class="form-label">网页地址</label><input type="url" class="form-control" id="scrapeUrl" placeholder="https://docs.firecrawl.dev" /><div class="form-text">输入要抓取的单个网页地址</div></div><button class="btn btn-primary" id="scrapeBtn" onclick="handleScrape()"><i class="bi bi-download"></i> 立即抓取</button></div><!-- 整站抓取面板 --><div class="tab-pane fade" id="crawl-pane" role="tabpanel" aria-labelledby="crawl-tab"><div class="mb-3"><label for="crawlUrl" class="form-label">网站地址</label><input type="url" class="form-control" id="crawlUrl" placeholder="https://docs.firecrawl.dev" /><div class="form-text">输入要爬取的网站根地址</div></div><div class="mb-3"><label for="maxPages" class="form-label">最大页数</label><input type="number" class="form-control" id="maxPages" placeholder="10" min="1" max="100" value="10" /><div class="form-text">限制爬取的最大页面数量 (1-100)</div></div><button class="btn btn-warning" id="crawlBtn" onclick="handleCrawl()"><i class="bi bi-globe"></i> 开始爬取</button></div></div></div></div><!-- 结果区 --><div class="card mb-3"><div class="card-header d-flex justify-content-between align-items-center"><span>📝 结果预览</span><button class="btn btn-sm btn-outline-secondary d-none" id="copyBtn" onclick="copyResult()"><i class="bi bi-clipboard"></i> 复制</button></div><div class="card-body"><pre class="result-area border p-2 bg-light" id="result">
等待结果...</pre></div></div></div><!-- 配置弹框 --><div class="modal fade" id="configModal" tabindex="-1" aria-labelledby="configModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><h5 class="modal-title" id="configModalLabel"><i class="bi bi-gear"></i> 服务配置</h5><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body"><div class="mb-3"><label for="baseUrl" class="form-label">Base URL</label><input type="url" class="form-control" id="baseUrl" placeholder="http://localhost:3002"value="http://localhost:3002" /><div class="form-text">Firecrawl 服务的基础地址</div></div><div class="mb-3"><label for="apiKey" class="form-label">API Key</label><input type="password" class="form-control" id="apiKey" placeholder="可选,无鉴权时留空" /><div class="form-text">如果服务需要鉴权,请输入 API Key</div></div></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button><button type="button" class="btn btn-primary" onclick="saveConfig()" data-bs-dismiss="modal">保存配置</button></div></div></div></div><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>""<script>const $ = (id) => document.getElementById(id);const base = () => $("baseUrl").value.replace(/\/$/, "");const key = () => $("apiKey").value;// 加载保存的配置document.addEventListener('DOMContentLoaded', function () {loadConfig();});function loadConfig() {const savedBaseUrl = localStorage.getItem('firecrawl_baseUrl');const savedApiKey = localStorage.getItem('firecrawl_apiKey');if (savedBaseUrl) $("baseUrl").value = savedBaseUrl;if (savedApiKey) $("apiKey").value = savedApiKey;}function saveConfig() {localStorage.setItem('firecrawl_baseUrl', $("baseUrl").value);localStorage.setItem('firecrawl_apiKey', $("apiKey").value);// 显示保存成功提示const toast = document.createElement('div');toast.className = 'toast align-items-center text-white bg-success border-0 position-fixed top-0 end-0 m-3';toast.style.zIndex = '9999';toast.innerHTML = `<div class="d-flex"><div class="toast-body"><i class="bi bi-check-circle"></i> 配置已保存</div><button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast"></button></div>`;document.body.appendChild(toast);const bsToast = new bootstrap.Toast(toast);bsToast.show();// 3秒后自动移除setTimeout(() => {if (toast.parentNode) {toast.parentNode.removeChild(toast);}}, 3000);}async function request(path, body) {const headers = { "Content-Type": "application/json" };if (key()) headers["Authorization"] = `Bearer ${key()}`;return fetch(`${base()}${path}`, {method: "POST",headers,body: JSON.stringify(body),}).then((r) => r.json());}async function handleScrape() {const url = $("scrapeUrl").value;if (!url) return alert("请输入网址");const scrapeBtn = $("scrapeBtn");// 禁用按钮但保持原有样式scrapeBtn.disabled = true;$("result").textContent = "抓取中...";$("copyBtn").classList.add("d-none");try {const res = await request("/v0/scrape", {url,pageOptions: { onlyMainContent: true },});$("result").textContent =res.data?.markdown || JSON.stringify(res, null, 2);$("copyBtn").classList.remove("d-none");window.lastResult = res;} catch (error) {$("result").textContent = `抓取失败: ${error.message}`;} finally {// 恢复按钮状态scrapeBtn.disabled = false;}}async function handleCrawl() {const url = $("crawlUrl").value;const limit = parseInt($("maxPages").value) || 10;if (!url) return alert("请输入网址");const crawlBtn = $("crawlBtn");// 禁用按钮但保持原有样式crawlBtn.disabled = true;$("result").textContent = "整站爬取中,请稍等...";$("copyBtn").classList.add("d-none");try {const job = await request("/v0/crawl", { url, limit });if (!job.jobId) {$("result").textContent = JSON.stringify(job, null, 2);crawlBtn.disabled = false;return;}const poll = setInterval(async () => {const headers = { "Content-Type": "application/json" };if (key()) headers["Authorization"] = `Bearer ${key()}`;const response = await fetch(`${base()}/v0/crawl/status/${job.jobId}`, {method: "GET",headers,});const status = await response.json();$("result").textContent = JSON.stringify(status, null, 2);if (status.status === "completed") {clearInterval(poll);window.lastResult = status;$("copyBtn").classList.remove("d-none");crawlBtn.disabled = false;}if (status.status === "failed") {clearInterval(poll);crawlBtn.disabled = false;}}, 2000);} catch (error) {$("result").textContent = `爬取失败: ${error.message}`;crawlBtn.disabled = false;}}async function copyResult() {try {const dataStr = JSON.stringify(window.lastResult, null, 2);await navigator.clipboard.writeText(dataStr);// 显示复制成功提示const toast = document.createElement('div');toast.className = 'toast align-items-center text-white bg-success border-0 position-fixed top-0 end-0 m-3';toast.style.zIndex = '9999';toast.innerHTML = `<div class="d-flex"><div class="toast-body"><i class="bi bi-check-circle"></i> 结果已复制到剪贴板</div><button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast"></button></div>`;document.body.appendChild(toast);const bsToast = new bootstrap.Toast(toast);bsToast.show();// 3秒后自动移除setTimeout(() => {if (toast.parentNode) {toast.parentNode.removeChild(toast);}}, 3000);} catch (error) {// 如果剪贴板 API 不可用,使用备用方法const textArea = document.createElement('textarea');textArea.value = JSON.stringify(window.lastResult, null, 2);document.body.appendChild(textArea);textArea.select();document.execCommand('copy');document.body.removeChild(textArea);alert('结果已复制到剪贴板');}}</script>
</body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916577.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916577.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916577.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法训练营day31 贪心算法⑤56. 合并区间、738.单调递增的数字 、968.监控二叉树

贪心算法的最后一篇博客&#xff01;前面两道题都是比较简单的思路&#xff0c;重点理解一下最后一道题即可。有一说一&#xff0c;进入到贪心算法这一章节之后&#xff0c;我的博客里和代码注释里的内容明显少了很多&#xff0c;因为很多贪心的题目我觉得不需要很复杂的文字说…

Jenkins流水线部署+webhook2.0

文章目录1. 环境2. 用到的插件3. 流水线部署脚本1. 环境 Centos7Jenkins2.5.0JDKopen17阿里云仓库 注意&#xff1a;这个版本兼容需要特别注意&#xff0c;要不然会很麻烦 2. 用到的插件 Generic Webhook Trigger 3. 流水线部署脚本 兼容钩子部署&#xff08;webhook&…

IDM下载失败排查

网络连接问题排查检查网络连接是否稳定&#xff0c;确保能够正常访问互联网 测试其他下载工具或浏览器是否能够正常下载 尝试关闭防火墙或杀毒软件&#xff0c;排除安全软件拦截的可能性代理和VPN设置检查确认IDM的代理设置是否正确&#xff0c;是否与系统代理一致 检查是否使用…

Anaconda安装时的几个操作

一、安装Anaconda 其实Anaconda的安装比较简单&#xff0c;点击next就好了。在安装中需要注意以下两点&#xff1a; 1、选择安装路径 在安装时&#xff0c;路径最好选择非C盘&#xff0c;且路径中不要出现中文&#xff0c;以免后期运行代码时出现不必要的错误。 我安装时&…

网易易盾、腾讯ACE等主流10款游戏反外挂系统对比

本文将深入对比10款游戏反外挂系统&#xff1a;1.网易易盾&#xff1b;2.Ricochet Anti‑Cheat&#xff1b;3.BattlEye&#xff1b;4.几维安全手游智能反外挂系统&#xff1b;5.伏魔AI反外挂&#xff1b;6.Riot Vanguard&#xff1b;7.Xigncode3&#xff1b;8.盛大GPK&#xff…

wpa_supplicant-2.10交叉编译

参考文章:https://blog.csdn.net/weixin_45783574/article/details/145810790 1、Openssl交叉编译 1.1 下载openssl-1.1.1t.tar.gz 下载网址: https://openssl-library.org/source/old/1.1.1/index.html1.2 编译 sudo tar xvf openssl-1.1.1t.tar.gz cd openssl-1.1

源码解读SpringCloudAlibaba Nacos2.x

Nacos 服务注册 Nacos 服务注册时&#xff0c;客户端会将自己的信息注册到Nicosserver上&#xff0c;形成key-value组合&#xff0c;其中key通常是服务名称&#xff0c;value是实例地址信息。在二点X版本中&#xff0c;客户端通过Spring Boot的扩展机制(例如web_initialized事件…

Windows 11 下 Anaconda 命令修复指南及常见问题解决

Windows 11 下 Anaconda 命令修复指南及常见问题解决 在使用 Anaconda 过程中&#xff0c;可能会遇到环境损坏、更新失败、包依赖冲突等问题。本文整理了一套通过命令行修复 Anaconda 的完整方案&#xff0c;适用于 Windows 11 系统&#xff0c;同时补充了权威参考链接供深入学…

安宝特案例丨全球连线!安宝特Vuzix与RodsCones共筑实时手术教育平台

安宝特Vuzix与合作伙伴Rods&Cones协作&#xff0c;为Rocamed在布拉格UROSANIT诊所举办的创新型实时手术直播研讨会提供技术赋能。 本次直播通过合作伙伴Rods&Cones软件平台搭载安宝特Vuzix智能眼镜&#xff0c;成功连接来自9国、3大洲、6个时区的27位医生&#xff0c;…

【Spring Boot 快速开发】一、入门

目录Spring Boot 简介Web 入门Spring Boot 快速入门HTTP 协议概述请求协议响应协议解析协议TomcatSpring Boot 简介 Spring Boot 是由 Pivotal 团队&#xff08;后被 VMware 收购&#xff09;开发的基于 Spring 框架的开源项目&#xff0c;于 2014 年首次发布。其核心目标是简…

laravel chunkById导出数据乱序问题

2025年7月28日17:47:29 这几天在做数据导出优化&#xff0c;使用xlswriter作为导出组件&#xff0c;但是发现在 使用 $base->chunkById(2000, function ($list) use ($writer, $sheet1) { 发现导出的数据是乱的&#xff0c;偶尔有些重复&#xff0c;偶尔有些少了&#xff0c…

Spring IOC与DI

spring的两大思想:IOC与AOP一、ioc的概念什么叫控制翻转?之前:对象的使用方,创建对象,对象的控制权,在对象的使用方手中.spring:对象的控制权交给了spring.举个例子:智能驾驶,之前车的使用权在人手中,而现在在ai手中,这就是控制反转.什么叫ioc:之前车企生产车需要做整个车,费事…

【图像处理基石】Segment Anything Model (SAM) 调研

Segment Anything Model (SAM) 是由 Meta AI 开发的革命性图像分割模型,它能够对图像中的任何物体进行分割,无需针对特定类别进行训练。SAM 具有以下特点: 通用性:可以分割任何视觉对象,无论是否见过该类别 灵活性:支持多种输入提示(点、框、掩码或文本) 实时性:在普通…

unisS5800XP-G交换机配置命令之端口篇

一、批量配置端口(1) 进入系统视图。system-view(2) 指定接口范围&#xff0c;并进入接口批量配置视图。¡ 指定一个不带别名的接口列表。interface range { interface-type interface-number [ to interface-type interface-number ] } &<1-24>¡…

MySQL中的 redolog

什么是redo log如果我们只在内存的 Bufer Pool中修改了页面&#xff0c;假设在事务提交后突然发生了某个故障导致内存中的数据都失效了&#xff0c;那么这个已经提交的事务在数据库中所做的更改也就跟着丢失了&#xff0c;这是我们所不能忍受的。那么&#xff0c;如何保证这个持…

数据结构之 【排序】(非递归实现快速排序)

目录 1.引入 2.非递归实现快排的思想 3.非递归实现快排图解 4.完整代码 1.引入 递归不可避免的话题就是防止栈溢出 所以程序员需要具备递归改非递归的能力 &#xff0c;一般来说&#xff0c;抓住递归中变化的量是关键 void QuickSort(int* a, int left, int right){if (left…

CLAP文本-音频基础模型: LEARNING AUDIO CONCEPTS FROM NATURAL LANGUAGE SUPERVISION

一、TL&#xff1b;DR 现在的做法有什么问题&#xff1f;主流范式是 “一个类别标签对应多个录音”&#xff0c;需要提前标注预测预先定义的类别&#xff0c;只能做闭集理解&#xff0c;失去灵活性 我们怎么做&#xff1f;通过两个编码器和对比学习机制建立语言与音频的关联&a…

Flink2.0学习笔记:Stream API 常用转换算子

EC0720/FLINKTASK-TEST-STREAM/demo at master stevensu1/EC0720 先看测试效果&#xff1a;控制台 测试效果&#xff1a;监控服务端 主要的转换算子包括&#xff1a; 转换算子 filter:过滤包含“Flink”的输入 转换算子 map: 将每行数据前添加“Processed: ”并转为大写 转…

一、Python环境、Jupyter与Pycharm

安装Python由于RAG项目中所需要的Python版本必须高于3.8&#xff0c;经过筛选&#xff0c;最终选择了3.10.11这个版本py --version Python 3.10.11安装过程略过&#xff0c;但对于几个基础的命令作个笔记记录where python找到python启动器的位置D:\>where python C:\Users\x…

Flink CEP 动态模板与规则动态修改实践完全手册

1. Flink CEP:从静态规则到动态江湖 Flink 的复杂事件处理(CEP)库就像一个武功高强的侠客,能从数据流中精准捕获特定模式,堪称流处理界的“降龙十八掌”。但问题来了:传统 CEP 规则通常是写死在代码里的,就像刻在石碑上的武功秘籍,改起来费劲不说,还得重启应用,简直…