Docker 部署 - Crawl4AI 文档 (v0.5.x)

Docker 部署 - Crawl4AI 文档 (v0.5.x)

快速入门 🚀

拉取并运行基础版本:

# 不带安全性的基本运行
docker pull unclecode/crawl4ai:basic
docker run -p 11235:11235 unclecode/crawl4ai:basic# 带有 API 安全性启用的运行
docker run -p 11235:11235 -e CRAWL4AI_API_TOKEN=your_secret_token unclecode/crawl4ai:basic

使用 Docker Compose 运行 🐳

从本地 Dockerfile 或 Docker Hub 使用 Docker Compose

Crawl4AI 提供灵活的 Docker Compose 选项,用于管理你的容器化服务。你可以使用提供的 Dockerfile 本地构建镜像,也可以使用 Docker Hub 上的预构建镜像。

选项 1:使用 Docker Compose 本地构建

如果你希望本地构建镜像,请使用提供的 docker-compose.local.yml 文件。

docker-compose -f docker-compose.local.yml up -d

这将:
1. 从提供的 Dockerfile 构建 Docker 镜像。
2. 启动容器并将其暴露在 http://localhost:11235


选项 2:使用 Docker Compose 从 Hub 获取预构建镜像

如果你更倾向于使用 Docker Hub 上的预构建镜像,请使用 docker-compose.hub.yml 文件。

docker-compose -f docker-compose.hub.yml up -d

这将:
1. 拉取预构建镜像 unclecode/crawl4ai:basic(或根据你的配置选择 all)。
2. 启动容器并将其暴露在 http://localhost:11235


停止正在运行的服务

要停止通过 Docker Compose 启动的服务,可以使用:

docker-compose -f docker-compose.local.yml down
# 或者
docker-compose -f docker-compose.hub.yml down

如果容器无法停止且应用仍在运行,请检查正在运行的容器:

找到正在运行的服务的 CONTAINER ID 并强制停止它:

docker stop <CONTAINER_ID>

使用 Docker Compose 调试

  • 查看日志:要查看容器日志:
docker-compose -f docker-compose.local.yml logs -f
  • 移除孤立容器:如果服务仍在意外运行:
docker-compose -f docker-compose.local.yml down --remove-orphans
  • 手动移除网络:如果网络仍在使用中:
docker network ls
docker network rm crawl4ai_default

为什么使用 Docker Compose?

Docker Compose 是部署 Crawl4AI 的推荐方式,因为:
1. 它简化了多容器设置。
2. 允许你在单个文件中定义环境变量、资源和端口。
3. 使在本地开发和生产镜像之间切换变得更容易。

例如,你的 docker-compose.yml 可以包含 API 密钥、令牌设置和内存限制,使部署快速且一致。

API 安全性 🔒

了解 CRAWL4AI_API_TOKEN

CRAWL4AI_API_TOKEN 为你的 Crawl4AI 实例提供可选的安全性:

  • 如果设置了 CRAWL4AI_API_TOKEN:所有 API 端点(除了 /health)都需要认证。
  • 如果没有设置 CRAWL4AI_API_TOKEN:API 将公开可用。
# 安全实例
docker run -p 11235:11235 -e CRAWL4AI_API_TOKEN=your_secret_token unclecode/crawl4ai:all# 未受保护实例
docker run -p 11235:11235 unclecode/crawl4ai:all

进行 API 调用

对于受保护的实例,在所有请求中包含令牌:

import requests# 设置标头(如果使用了令牌)
api_token = "your_secret_token"  # 与 CRAWL4AI_API_TOKEN 中设置的令牌相同
headers = {"Authorization": f"Bearer {api_token}"} if api_token else {}# 发起认证请求
response = requests.post("http://localhost:11235/crawl",headers=headers,json={"urls": "https://example.com","priority": 10}
)# 检查任务状态
task_id = response.json()["task_id"]
status = requests.get(f"http://localhost:11235/task/{task_id}",headers=headers
)

与 Docker Compose 一起使用

在你的 docker-compose.yml 中:

services:crawl4ai:image: unclecode/crawl4ai:allenvironment:- CRAWL4AI_API_TOKEN=${CRAWL4AI_API_TOKEN:-}  # 可选# ... 其他配置

然后可以:
1. 在 .env 文件中设置:

CRAWL4AI_API_TOKEN=your_secret_token

或者在命令行中设置:

CRAWL4AI_API_TOKEN=your_secret_token docker-compose up

安全提示:如果你启用了 API 令牌,请确保保持其安全性,不要将其提交到版本控制中。除了健康检查端点(/health)外,所有 API 端点都需要该令牌。

配置选项 🔧

环境变量

你可以使用环境变量来配置服务:

# 基本配置
docker run -p 11235:11235 \-e MAX_CONCURRENT_TASKS=5 \unclecode/crawl4ai:all# 启用安全性和 LLM 支持
docker run -p 11235:11235 \-e CRAWL4AI_API_TOKEN=your_secret_token \-e OPENAI_API_KEY=sk-... \-e ANTHROPIC_API_KEY=sk-ant-... \unclecode/crawl4ai:all

使用 Docker Compose(推荐) 🐳

创建一个 docker-compose.yml 文件:

version: '3.8'services:crawl4ai:image: unclecode/crawl4ai:allports:- "11235:11235"environment:- CRAWL4AI_API_TOKEN=${CRAWL4AI_API_TOKEN:-}  # 可选 API 安全性- MAX_CONCURRENT_TASKS=5# LLM 提供商密钥- OPENAI_API_KEY=${OPENAI_API_KEY:-}- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}volumes:- /dev/shm:/dev/shmdeploy:resources:limits:memory: 4Greservations:memory: 1G

你可以通过两种方式运行它:

  1. 直接使用环境变量:
CRAWL4AI_API_TOKEN=secret123 OPENAI_API_KEY=sk-... docker-compose up
  1. 使用 .env 文件(推荐):
    在同一目录下创建一个 .env 文件:
# API 安全性(可选)
CRAWL4AI_API_TOKEN=your_secret_token# LLM 提供商密钥
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...# 其他配置
MAX_CONCURRENT_TASKS=5

然后只需运行:

测试部署 🧪

import requests# 对于未受保护的实例
def test_unsecured():# 健康检查health = requests.get("http://localhost:11235/health")print("健康检查:", health.json())# 基本爬取response = requests.post("http://localhost:11235/crawl",json={"urls": "https://www.nbcnews.com/business","priority": 10})task_id = response.json()["task_id"]print("任务 ID:", task_id)# 对于受保护的实例
def test_secured(api_token):headers = {"Authorization": f"Bearer {api_token}"}# 带认证的基本爬取response = requests.post("http://localhost:11235/crawl",headers=headers,json={"urls": "https://www.nbcnews.com/business","priority": 10})task_id = response.json()["task_id"]print("任务 ID:", task_id)

当你配置了 LLM 提供商密钥(通过环境变量或 .env 文件),你可以使用 LLM 提取:

request = {"urls": "https://example.com","extraction_config": {"type": "llm","params": {"provider": "openai/gpt-4","instruction": "从页面中提取主要主题"}}
}# 发起请求(如果使用 API 安全性,请添加标头)
response = requests.post("http://localhost:11235/crawl", json=request)

提示:记得将 .env 添加到 .gitignore 中,以确保你的 API 密钥安全!

使用示例 📝

基本爬取

request = {"urls": "https://www.nbcnews.com/business","priority": 10
}response = requests.post("http://localhost:11235/crawl", json=request)
task_id = response.json()["task_id"]# 获取结果
result = requests.get(f"http://localhost:11235/task/{task_id}")
schema = {"name": "加密货币价格","baseSelector": ".cds-tableRow-t45thuk","fields": [{"name": "加密货币","selector": "td:nth-child(1) h2","type": "text",},{"name": "价格","selector": "td:nth-child(2)","type": "text",}],
}request = {"urls": "https://www.coinbase.com/explore","extraction_config": {"type": "json_css","params": {"schema": schema}}
}

处理动态内容

request = {"urls": "https://www.nbcnews.com/business","js_code": ["const loadMoreButton = Array.from(document.querySelectorAll('button')).find(button => button.textContent.includes('Load More')); loadMoreButton && loadMoreButton.click();"],"wait_for": "article.tease-card:nth-child(10)"
}
request = {"urls": "https://www.nbcnews.com/business","extraction_config": {"type": "cosine","params": {"semantic_filter": "商业 财务 经济","word_count_threshold": 10,"max_dist": 0.2,"top_k": 3}}
}

平台特定指令 💻

macOS

docker pull unclecode/crawl4ai:basic
docker run -p 11235:11235 unclecode/crawl4ai:basic

Ubuntu

# 基础版本
docker pull unclecode/crawl4ai:basic
docker run -p 11235:11235 unclecode/crawl4ai:basic# 带 GPU 支持
docker pull unclecode/crawl4ai:gpu
docker run --gpus all -p 11235:11235 unclecode/crawl4ai:gpu

Windows(PowerShell)

docker pull unclecode/crawl4ai:basic
docker run -p 11235:11235 unclecode/crawl4ai:basic

测试 🧪

将以下内容保存为 test_docker.py

import requests
import json
import time
import sysclass Crawl4AiTester:def __init__(self, base_url: str = "http://localhost:11235"):self.base_url = base_urldef submit_and_wait(self, request_data: dict, timeout: int = 300) -> dict:# 提交爬取任务response = requests.post(f"{self.base_url}/crawl", json=request_data)task_id = response.json()["task_id"]print(f"任务 ID:{task_id}")# 轮询结果start_time = time.time()while True:if time.time() - start_time > timeout:raise TimeoutError(f"任务 {task_id} 超时")result = requests.get(f"{self.base_url}/task/{task_id}")status = result.json()if status["status"] == "completed":return statustime.sleep(2)def test_deployment():tester = Crawl4AiTester()# 测试基本爬取request = {"urls": "https://www.nbcnews.com/business","priority": 10}result = tester.submit_and_wait(request)print("基本爬取成功!")print(f"内容长度:{len(result['result']['markdown'])}")if __name__ == "__main__":test_deployment()

高级配置 ⚙️

爬虫参数

crawler_params 字段允许你配置浏览器实例和爬取行为。以下是你可以使用的关键参数:

request = {"urls": "https://example.com","crawler_params": {# 浏览器配置"headless": True,                    # 以无头模式运行"browser_type": "chromium",          # chromium/firefox/webkit"user_agent": "custom-agent",        # 自定义用户代理"proxy": "http://proxy:8080",        # 代理配置# 性能与行为"page_timeout": 30000,               # 页面加载超时(毫秒)"verbose": True,                     # 启用详细日志"semaphore_count": 5,               # 并发请求限制# 防检测功能"simulate_user": True,               # 模拟人类行为"magic": True,                       # 高级防检测"override_navigator": True,          # 覆盖导航器属性# 会话管理"user_data_dir": "./browser-data",   # 浏览器配置文件位置"use_managed_browser": True,         # 使用持久浏览器}
}

extra 字段允许直接将额外参数传递给爬虫的 arun 函数:

request = {"urls": "https://example.com","extra": {"word_count_threshold": 10,          # 每个区块的最小字数"only_text": True,                   # 仅提取文本"bypass_cache": True,                # 强制刷新爬取"process_iframes": True,             # 包含 iframe 内容}
}

完整示例

  1. 高级新闻爬取
request = {"urls": "https://www.nbcnews.com/business","crawler_params": {"headless": True,"page_timeout": 30000,"remove_overlay_elements": True      # 移除弹出窗口},"extra": {"word_count_threshold": 50,          # 更长的内容区块"bypass_cache": True                 # 刷新内容},"css_selector": ".article-body"
}
  1. 防检测配置
request = {"urls": "https://example.com","crawler_params": {"simulate_user": True,"magic": True,"override_navigator": True,"user_agent": "Mozilla/5.0 ...","headers": {"Accept-Language": "en-US,en;q=0.9"}}
}
  1. 带有自定义参数的 LLM 提取
request = {"urls": "https://openai.com/pricing","extraction_config": {"type": "llm","params": {"provider": "openai/gpt-4","schema": pricing_schema}},"crawler_params": {"verbose": True,"page_timeout": 60000},"extra": {"word_count_threshold": 1,"only_text": True}
}
  1. 基于会话的动态内容
request = {"urls": "https://example.com","crawler_params": {"session_id": "dynamic_session","headless": False,"page_timeout": 60000},"js_code": ["window.scrollTo(0, document.body.scrollHeight);"],"wait_for": "js:() => document.querySelectorAll('.item').length > 10","extra": {"delay_before_return_html": 2.0}
}
  1. 带自定义时间的截图
request = {"urls": "https://example.com","screenshot": True,"crawler_params": {"headless": True,"screenshot_wait_for": ".main-content"},"extra": {"delay_before_return_html": 3.0}
}

参数参考表

分类参数类型描述
浏览器headless布尔值以无头模式运行浏览器
浏览器browser_type字符串浏览器引擎选择
浏览器user_agent字符串自定义用户代理字符串
网络proxy字符串代理服务器 URL
网络headers字典自定义 HTTP 标头
定时page_timeout整数页面加载超时(毫秒)
定时delay_before_return_html浮点数捕获前等待时间
防检测simulate_user布尔值模拟人类行为
防检测magic布尔值高级保护
会话session_id字符串浏览器会话 ID
会话user_data_dir字符串配置文件目录
内容word_count_threshold整数每个区块的最小字数
内容only_text布尔值仅提取文本
内容process_iframes布尔值包含 iframe 内容
调试verbose布尔值详细日志
调试log_console布尔值浏览器控制台日志

故障排除 🔍

常见问题

  1. 连接拒绝
错误:连接被 localhost:11235 拒绝

解决方案:确保容器正在运行且端口映射正确。

  1. 资源限制
错误:没有可用插槽

解决方案:增加 MAX_CONCURRENT_TASKS 或容器资源。

  1. GPU 访问

解决方案:确保安装了正确的 NVIDIA 驱动程序并使用 --gpus all 标志。

调试模式

访问容器进行调试:

docker run -it --entrypoint /bin/bash unclecode/crawl4ai:all

查看容器日志:

docker logs [container_id]

最佳实践 🌟

  1. 资源管理
    - 设置适当的内存和 CPU 限制
    - 通过健康端点监控资源使用情况
    - 对于简单爬取任务使用基础版本

  2. 扩展
    - 对于高负载使用多个容器
    - 实施适当的负载均衡
    - 监控性能指标

  3. 安全性
    - 使用环境变量存储敏感数据
    - 实施适当的网络隔离
    - 定期进行安全更新

API 参考 📚

健康检查

提交爬取任务

POST /crawl
Content-Type: application/json{"urls": "字符串或数组","extraction_config": {"type": "basic|llm|cosine|json_css","params": {}},"priority": 1-10,"ttl": 3600
}

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

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

相关文章

开发工具分享: Web前端编码常用的在线编译器

1.OneCompiler 工具网址&#xff1a;https://onecompiler.com/ OneCompiler支持60多种编程语言&#xff0c;在全球有超过1280万用户&#xff0c;让开发者可以轻易实现代码的编写、运行和共享。 OneCompiler的线上调试功能完全免费&#xff0c;对编程语言的覆盖也很全&#x…

Docker-配置私有仓库(Harbor)

配置私有仓库&#xff08;Harbor&#xff09; 一、环境准备安装 Docker 三、安装docker-compose四、准备Harbor五、配置证书六、部署配置Harbor七、配置启动服务八、定制本地仓库九、测试本地仓库 Harbor(港湾)&#xff0c;是一个用于 存储 和 分发 Docker 镜像的企业级 Regi…

关于高并发GIS数据处理的一点经验分享

1、背景介绍 笔者过去几年在参与某个大型央企的项目开发过程中,遇到了十分棘手的难题。其与我们平常接触的项目性质完全不同。在一般的项目中,客户一般只要求我们能够通过桌面软件对原始数据进行加工处理,将各类地理信息数据加工处理成地图/场景和工作空间,然后再将工作空…

使用 DMM 测试 TDR

TDR&#xff08;时域反射计&#xff09;可能是实验室中上升时间最快的仪器&#xff0c;但您可以使用直流欧姆表测试其准确性。 TDR 测量什么 在所有高速通道中&#xff0c;反射都很糟糕。我们尝试设计一个通道来减少反射&#xff0c;这些反射都会导致符号间干扰 &#xff08;…

可视化图解算法37:序列化二叉树-II

1. 题目 描述 请实现两个函数&#xff0c;分别用来序列化和反序列化二叉树&#xff0c;不对序列化之后的字符串进行约束&#xff0c;但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。 二叉树的序列化(Serialize)是指&#xff1a;把一棵二叉树按照某种遍…

【Python】Python常用数据类型详解

Python常用数据类型详解:增删改查全掌握 Python作为一门简洁高效的编程语言,其丰富的数据类型是构建程序的基础。本文将详细介绍数字、字符串、列表、元组、字典、集合这六种核心数据类型的特点及增删改查操作,并附代码示例,助你全面掌握数据操作技巧。 一、数字(Number)…

模板引用、组件基础

#### 组件基础 1. 定义和使用简单组件 - ![alt text](./img/image-2.png) vue <!-- 在App.vue里 --> <script setup>import HelloWorld from ./components/HelloWorld.vue </script> <template><HelloWorld></HelloWorld></temp…

深入探索 RKNN 模型转换之旅

在人工智能蓬勃发展的当下&#xff0c;边缘计算领域的应用愈发广泛。瑞芯微的 RKNN 技术在这一领域大放异彩&#xff0c;它能让深度学习模型在其芯片平台上高效运行。而在整个应用流程中&#xff0c;模型转换是极为关键的一环&#xff0c;今天就让我们一同深入这个神奇的 RKNN …

iframe嵌套网站的安全机制实现

背景&#xff1a; 公司内部有一套系统A部署在内网&#xff0c;这套系统嵌套了B网站&#xff08;也是内网&#xff09;&#xff0c;只有内网才能访问。现在需要将这个A系统暴露到公网。B系统的安全策略比较低&#xff0c;想快速上线并提高B系统的安全性。 通过 Nginx 代理层 设置…

青少年编程与数学 02-019 Rust 编程基础 08课题、字面量、运算符和表达式

青少年编程与数学 02-019 Rust 编程基础 08课题、字面量、运算符和表达式 一、字面量1. 字面量的分类1.1 整数字面量1.2 浮点数字面量1.3 字符字面量1.4 字符串字面量1.5 布尔字面量1.6 字节数组字面量 2. 字面量的类型推断3. 字面量的用途4. 字面量的限制字面量总结 二、运算符…

危化品安全员职业发展方向的优劣对比

以下是危化品安全员不同职业发展方向的优劣对比&#xff1a; 纵向晋升 优势 职业路径清晰&#xff1a;从危化品安全员逐步晋升为安全主管、安全经理、安全总监等管理职位&#xff0c;层级明确&#xff0c;有较为清晰的上升通道。管理能力提升&#xff1a;随着职位上升&#x…

谈AI/OT 的融合

过去的十几年间&#xff0c;工业界讨论最多的话题之一就是IT/OT 融合&#xff0c;现在&#xff0c;我们不仅要实现IT/OT 的融合&#xff0c;更要面向AI/OT 的融合。看起来不太靠谱&#xff0c;却留给我们无限的想象空间。OT 领域的专家们不要再当“九斤老太”&#xff0c;指责这…

计算机网络核心技术解析:从基础架构到应用实践

计算机网络作为现代信息社会的基石&#xff0c;承载着全球数据交换与资源共享的核心功能。本文将从网络基础架构、核心协议、分层模型到实际应用场景&#xff0c;全面解析计算机网络的核心技术&#xff0c;并结合行业最新趋势&#xff0c;为读者构建系统的知识体系。 一、计算机…

大规模数据并行排序策略(Parallel Sample Sort)

大规模数据并行排序策略 对于上亿条大型记录的并行排序&#xff0c;基于MPI的多节点环境&#xff0c;可以采用以下策略来充分利用内存和网络资源&#xff1a; 推荐算法&#xff1a;样本排序(Sample Sort) 样本排序是大规模并行排序的高效算法&#xff0c;特别适合MPI环境&am…

o.redisson.client.handler.CommandsQueue : Exception occured. Channel

1&#xff0c; 版本 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>2.15.2</version> </dependency>2&#xff0c;问题 2025-05-12 10:46:47.436 ERROR 27780 --- [sson-netty-5-…

Kotlin跨平台Compose Multiplatform实战指南

Kotlin Multiplatform&#xff08;KMP&#xff09;结合 Compose Multiplatform 正在成为跨平台开发的热门选择&#xff0c;它允许开发者用一套代码构建 Android、iOS、桌面&#xff08;Windows/macOS/Linux&#xff09;和 Web 应用。以下是一个实战指南&#xff0c;涵盖核心概念…

【Jenkins简单自动化部署案例:基于Docker和Harbor的自动化部署流程记录】

摘要 本文记录了作者使用Jenkins时搭建的一个简单自动化部署案例&#xff0c;涵盖Jenkins的Docker化安装、Harbor私有仓库配置、Ansible远程部署等核心步骤。通过一个SpringBoot项目 (RuoYi) 的完整流程演示&#xff0c;从代码提交到镜像构建、推送、滚动更新&#xff0c;逐步实…

【Git】GitHub上传图片遇到的问题

一开始我直接在网页上拖拽上传&#xff0c;会说“网页无法正常运作”。 采用git push上去&#xff1a; git clone https://github.com/your-username/your-repo-name.git cd your-repo-name git add . git commit -m "Add large images" git push origin main报错&…

【落羽的落羽 C++】stack和queue、deque、priority_queue、仿函数

文章目录 一、stack和queue1. 概述2. 使用3. 模拟实现 二、deque三、priority_queue1. 概述和使用2. 模拟实现 四、仿函数 一、stack和queue 1. 概述 我们之前学习的vector和list&#xff0c;以及下面要认识的deque&#xff0c;都属于STL的容器&#xff08;containers&#x…

用生活例子通俗理解 Python OOP 四大特性

让我们用最生活化的方式&#xff0c;结合Python代码&#xff0c;来理解面向对象编程的四大特性。 1. 封装&#xff1a;像使用自动售货机 生活比喻&#xff1a; 你只需要投币、按按钮&#xff0c;就能拿到饮料 不需要知道机器内部如何计算找零、如何运送饮料 如果直接打开机…