WaterCrawl:强大的网页抓取与数据提取工具
在当今数字化的时代,数据就如同宝藏一般,而如何有效地从海量的网页中抓取和提取相关数据,成为了许多人关注的问题。WaterCrawl 就是这样一款强大的网页应用程序,它利用 Python、Django、Scrapy 和 Celery 等技术,能够帮助我们高效地完成网页抓取和数据提取的任务。接下来,我们就来详细了解一下 WaterCrawl 的相关内容。
一、WaterCrawl 简介
WaterCrawl 是一个功能强大的网页应用程序,它就像是一个勤劳的小蜘蛛,能够在互联网的海洋中快速地爬行,抓取网页并提取出我们需要的相关数据。这个程序结合了 Python、Django、Scrapy 和 Celery 等多种技术,为我们提供了一个高效、稳定的网页抓取和数据提取解决方案。
1.1 产品优势
WaterCrawl 具有很多令人瞩目的优势,让我们一起来看看:
-
先进的网页抓取与数据提取:它可以对网站进行深度抓取,并且提供了高度可定制的选项,我们可以根据自己的需求灵活调整抓取的深度、速度,还能精确地定位到我们想要的特定内容。 -
强大的搜索引擎:提供了多种搜索深度选项,包括基本、高级和终极搜索,能够帮助我们在广阔的网络世界中快速找到相关内容。 -
多语言支持:支持多种语言,我们可以使用不同的语言进行搜索和抓取,并且还能进行国家特定的内容定位,满足不同地区和语言的需求。 -
异步处理:通过 Server – Sent Events(SSE)技术,我们可以实时监控抓取和搜索的进度,就像看着小蜘蛛在网页上忙碌的身影一样,一切都在我们的掌控之中。 -
全面的 REST API:拥有详细的文档和客户端库,方便开发者进行集成和二次开发,无论是与其他系统对接还是开发新的应用,都变得非常轻松。 -
丰富的生态系统:与 Dify、N8N 等 AI/自动化平台进行了集成,还提供了多种插件,如 WaterCrawl 插件和 OpenAI 插件,为我们的使用提供了更多的可能性。 -
自托管与开源:我们可以完全掌控自己的数据,并且它提供了简单的部署选项,让我们能够轻松地将其部署到自己的服务器上。 -
高级结果处理:支持下载和处理搜索结果,并且可以根据我们的需求自定义参数,方便我们对数据进行进一步的分析和利用。
1.2 客户端 SDK 和集成情况
WaterCrawl 提供了多种客户端 SDK,方便不同编程语言的开发者使用:
-
Python 客户端:是一个功能齐全的 SDK,支持所有 API 端点,对于 Python 开发者来说,使用起来非常方便。 -
Node.js 客户端:实现了完整的 JavaScript/TypeScript 集成,让 Node.js 开发者也能轻松地使用 WaterCrawl 的功能。 -
Go 客户端:同样是功能强大的 SDK,支持所有 API 端点,满足 Go 语言开发者的需求。 -
PHP 客户端:为 PHP 开发者提供了支持,让他们也能利用 WaterCrawl 进行网页抓取和数据提取。 -
Rust 客户端:虽然还在开发中,但值得期待,相信未来会为 Rust 开发者带来便利。
此外,WaterCrawl 还与多个平台进行了集成:
-
Dify 插件:可以在 Dify 平台上使用,其源代码也公开在 GitHub 上,方便开发者进行查看和修改。 -
N8N 工作流节点:在 N8N 平台上有对应的工作流节点,并且也公开了源代码,便于开发者进行定制。 -
Dify 知识库:与 Dify 的知识库进行了集成,为我们提供了更多的知识支持。 -
Langflow:目前有相关的 Pull Request,但还未合并。 -
Flowise:即将推出相关集成,值得期待。
二、WaterCrawl 的快速启动
2.1 本地 Docker 环境下的快速启动
如果你想在本地的 Docker 环境下快速启动 WaterCrawl,可以按照以下步骤进行操作:
-
克隆仓库:打开终端,运行以下命令克隆 WaterCrawl 的仓库:
git clone https://github.com/watercrawl/watercrawl.git
cd watercrawl
这一步就像是把 WaterCrawl 的代码从云端搬运到了我们的本地电脑上。
-
构建和运行 Docker 容器:继续在终端中执行以下命令:
cd docker
cp .env.example .env
docker compose up -d
这里的 cp .env.example .env
是将示例环境文件复制为实际使用的环境文件,而 docker compose up -d
则是启动 Docker 容器,让 WaterCrawl 开始运行。
-
访问应用程序:打开浏览器,访问 http://localhost,就可以看到 WaterCrawl 的界面啦。
2.2 重要提示
如果你不是在本地的 localhost
环境下部署,而是在其他域名或 IP 地址上部署,那么一定要更新 .env
文件中的 MinIO 配置:
# Change this from 'localhost' to your actual domain or IP
MINIO_EXTERNAL_ENDPOINT=your - domain.com
# Also update these URLs accordingly
MINIO_BROWSER_REDIRECT_URL=http://your - domain.com/minio - console/
MINIO_SERVER_URL=http://your - domain.com/
如果不更新这些设置,文件的上传和下载功能可能会出现问题。更多详细信息可以参考 DEPLOYMENT.md。
在部署到生产环境之前,我们还需要确保更新 .env
文件中的配置值,并且设置和配置好数据库、MinIO 等所需的服务。具体的操作可以阅读 Deployment Guide。
三、WaterCrawl 的部署指南
3.1 部署前的准备工作
在部署 WaterCrawl 之前,我们需要确保已经安装了以下软件:
-
Docker Engine(20.10.0+):Docker 是一种容器化技术,能够帮助我们快速部署和管理应用程序。 -
Docker Compose(2.0.0+):Docker Compose 可以让我们通过一个配置文件来定义和运行多个 Docker 容器,方便我们进行应用程序的部署。 -
Git:用于克隆 WaterCrawl 的代码仓库。
3.2 环境配置
WaterCrawl 使用环境变量来进行配置,所有的变量在 docker - compose.yml
中都有默认值,但我们也可以在 .env
文件中进行覆盖。下面我们来详细了解一下不同方面的环境配置。
3.2.1 通用设置
通用设置主要控制基本的 Docker 和版本信息,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
VERSION |
应用程序版本 | v0.8.0 |
否 |
NGINX_PORT |
Nginx 服务的端口 | 80 |
否 |
设置步骤如下:
-
首先确定我们要将应用程序暴露在哪个端口上。 -
如果端口 80 已经被其他程序占用,可以将 NGINX_PORT
修改为其他值,比如 8080。
3.2.2 Django 核心设置
这些设置主要控制 Django 后端应用程序,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
SECRET_KEY |
Django 安全密钥 | 长字符串 | 生产环境必需 |
API_ENCRYPTION_KEY |
API 加密密钥 | 长字符串 | 生产环境必需 |
DEBUG |
调试模式(生产环境设置为 False) | True |
否 |
ALLOWED_HOSTS |
允许的主机列表,用逗号分隔 | * |
否 |
LANGUAGE_CODE |
语言代码 | en - us |
否 |
TIME_ZONE |
时区 | UTC |
否 |
USE_I18N |
启用国际化 | True |
否 |
USE_TZ |
启用时区支持 | True |
否 |
STATIC_ROOT |
静态文件目录 | storage/static/ |
否 |
MEDIA_ROOT |
媒体文件目录 | storage/media/ |
否 |
LOG_LEVEL |
日志级别 | INFO |
否 |
FRONTEND_URL |
前端 URL,用于 CORS 和重定向 | http://localhost |
否 |
设置步骤如下:
-
在生产环境中,我们需要生成一个安全的随机 SECRET_KEY
,可以使用以下命令:
openssl rand -base64 32
-
将 DEBUG
设置为False
,以提高生产环境的安全性。 -
将 ALLOWED_HOSTS
设置为我们的域名,例如example.com,www.example.com
。 -
根据我们所在的地区,将 TIME_ZONE
设置为本地时区,比如Europe/Berlin
。 -
将 FRONTEND_URL
设置为我们的前端域名,用于电子邮件链接和重定向。
3.2.3 数据库设置
数据库设置主要控制 PostgreSQL 数据库,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
POSTGRES_HOST |
PostgreSQL 主机 | db |
否 |
POSTGRES_PORT |
PostgreSQL 端口 | 5432 |
否 |
POSTGRES_PASSWORD |
PostgreSQL 密码 | postgres |
生产环境必需 |
POSTGRES_USER |
PostgreSQL 用户名 | postgres |
否 |
POSTGRES_DB |
PostgreSQL 数据库名称 | postgres |
否 |
设置步骤如下:
-
在生产环境中,我们需要设置一个强密码作为 POSTGRES_PASSWORD
,以保证数据库的安全性。 -
默认值已经配置好,可以与包含的 PostgreSQL 容器一起工作。
3.2.4 Redis 设置
Redis 设置主要控制 Redis 用于缓存和任务队列,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
CELERY_BROKER_URL |
Celery 代理的 Redis URL | redis://redis:6379/0 |
否 |
REDIS_LOCKER_URL |
Django 缓存/锁的 Redis URL | redis://redis:6379/3 |
否 |
CELERY_RESULT_BACKEND |
Celery 结果后端 | django - db |
否 |
设置步骤如下:
-
默认值与捆绑的 Redis 服务配合良好。 -
只有在使用外部 Redis 服务器时,才需要更改这些设置。
3.2.5 JWT 设置
JWT 设置主要控制 JSON Web Token 认证,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
ACCESS_TOKEN_LIFETIME_MINUTES |
JWT 访问令牌的有效期(分钟) | 5 |
否 |
REFRESH_TOKEN_LIFETIME_DAYS |
JWT 刷新令牌的有效期(天) | 30 |
否 |
设置步骤如下:
-
根据我们的安全需求,调整令牌的有效期。 -
在更安全的环境中,可以考虑缩短令牌的有效期。
3.2.6 MinIO 设置
MinIO 设置主要控制 MinIO 对象存储(S3 兼容),具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
MINIO_ENDPOINT |
Django 的 MinIO 端点 | minio:9000 |
否 |
MINIO_EXTERNAL_ENDPOINT |
外部 MinIO 端点 | localhost |
生产环境必需 |
MINIO_REGION |
MinIO 区域(可选) | us - east - 1 |
否 |
MINIO_ACCESS_KEY |
MinIO 访问密钥(用户名) | minio |
生产环境必需 |
MINIO_SECRET_KEY |
MinIO 秘密密钥(密码) | minio123 |
生产环境必需 |
MINIO_USE_HTTPS |
是否使用 HTTPS 访问 MinIO | False |
否 |
MINIO_EXTERNAL_ENDPOINT_USE_HTTPS |
外部端点是否使用 HTTPS | False |
否 |
MINIO_URL_EXPIRY_HOURS |
MinIO URL 的有效期(小时) | 7 |
否 |
MINIO_CONSISTENCY_CHECK_ON_START |
启动时是否检查一致性 | True |
否 |
MINIO_PRIVATE_BUCKET |
私有存储桶名称 | private |
否 |
MINIO_PUBLIC_BUCKET |
公共存储桶名称 | public |
否 |
MINIO_BUCKET_CHECK_ON_SAVE |
保存时是否检查存储桶存在性 | False |
否 |
MINIO_BROWSER_REDIRECT_URL |
MinIO 浏览器重定向 URL | http://localhost/minio - console/ |
否 |
MINIO_SERVER_URL |
MinIO 服务器 URL | http://localhost/ |
否 |
设置步骤如下:
-
在生产环境中,设置强密码作为 MINIO_ACCESS_KEY
和MINIO_SECRET_KEY
。 -
当部署到非 localhost
的域名时,必须将MINIO_EXTERNAL_ENDPOINT
更改为我们的域名,例如example.com
,因为这个变量控制着文件下载/上传的预签名 URL 的生成。 -
如果使用 HTTPS,将 MINIO_USE_HTTPS
和MINIO_EXTERNAL_ENDPOINT_USE_HTTPS
设置为True
。 -
更新 MINIO_BROWSER_REDIRECT_URL
和MINIO_SERVER_URL
以匹配我们的域名。
3.2.7 CORS 设置
CORS 设置主要控制跨源资源共享,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
CSRF_TRUSTED_ORIGINS |
CSRF 信任的来源 | 空 | 否 |
CORS_ALLOWED_ORIGINS |
CORS 允许的来源 | 空 | 否 |
CORS_ALLOWED_ORIGIN_REGEXES |
CORS 来源的正则表达式 | 空 | 否 |
CORS_ALLOW_ALL_ORIGINS |
是否允许所有来源 | False |
否 |
设置步骤如下:
-
在生产环境中,将我们的域名添加到 CSRF_TRUSTED_ORIGINS
和CORS_ALLOWED_ORIGINS
中,例如CSRF_TRUSTED_ORIGINS=https://example.com,https://www.example.com
。 -
避免在生产环境中将 CORS_ALLOW_ALL_ORIGINS
设置为True
,以保证安全性。
3.2.8 认证设置
认证设置主要控制用户认证,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
IS_ENTERPRISE_MODE_ACTIVE |
是否启用企业模式 | False |
否 |
IS_LOGIN_ACTIVE |
是否启用登录功能 | True |
否 |
IS_SIGNUP_ACTIVE |
是否启用注册功能 | False |
否 |
IS_GITHUB_LOGIN_ACTIVE |
是否启用 GitHub 登录 | False |
否 |
IS_GOOGLE_LOGIN_ACTIVE |
是否启用 Google 登录 | False |
否 |
GITHUB_CLIENT_ID |
GitHub OAuth 客户端 ID | 空 | GitHub 登录必需 |
GITHUB_CLIENT_SECRET |
GitHub OAuth 客户端秘密 | 空 | GitHub 登录必需 |
GOOGLE_CLIENT_ID |
Google OAuth 客户端 ID | 空 | Google 登录必需 |
GOOGLE_CLIENT_SECRET |
Google OAuth 客户端秘密 | 空 | Google 登录必需 |
设置步骤如下:
-
默认情况下,注册功能是禁用的( IS_SIGNUP_ACTIVE=False
)。 -
社交登录功能默认也是禁用的。 -
如果要启用 GitHub 社交登录: -
在 https://github.com/settings/developers 创建一个 OAuth 应用。 -
将回调 URL 设置为 http://your - domain.com/api/auth/github/callback/
。 -
将客户端 ID 和秘密添加到环境变量中。
-
-
如果要启用 Google 社交登录: -
在 https://console.developers.google.com 创建凭证。 -
将授权重定向 URI 设置为 http://your - domain.com/api/auth/google/callback/
。 -
将客户端 ID 和秘密添加到环境变量中。
-
3.2.9 邮件设置
邮件设置主要控制邮件发送,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
EMAIL_BACKEND |
邮件后端 | Django SMTP Backend | 否 |
EMAIL_HOST |
SMTP 主机 | 空 | 邮件功能必需 |
EMAIL_PORT |
SMTP 端口 | 587 |
否 |
EMAIL_USE_TLS |
是否使用 TLS 进行 SMTP 连接 | True |
否 |
EMAIL_HOST_USER |
SMTP 用户名 | 空 | 邮件功能必需 |
EMAIL_HOST_PASSWORD |
SMTP 密码 | 空 | 邮件功能必需 |
DEFAULT_FROM_EMAIL |
默认发件人邮箱 | 空 | 邮件功能必需 |
设置步骤如下:
-
在生产环境中,设置一个合适的邮件服务。 -
对于测试,可以使用 Mailhog 或内置的 Postfix 容器等服务。 -
如果使用 Gmail,需要生成一个应用密码。
3.2.10 Scrapy 设置
Scrapy 设置主要控制使用 Scrapy 进行网页抓取,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
SCRAPY_USER_AGENT |
抓取时使用的用户代理 | WaterCrawl/0.5.0 (+https://github.com/watercrawl/watercrawl) |
否 |
SCRAPY_ROBOTSTXT_OBEY |
是否遵守 robots.txt 规则 | True |
否 |
SCRAPY_CONCURRENT_REQUESTS |
并发请求数 | 16 |
否 |
SCRAPY_DOWNLOAD_DELAY |
下载延迟(秒) | 0 |
否 |
SCRAPY_CONCURRENT_REQUESTS_PER_DOMAIN |
每个域名的并发请求数 | 4 |
否 |
SCRAPY_CONCURRENT_REQUESTS_PER_IP |
每个 IP 的并发请求数 | 4 |
否 |
SCRAPY_COOKIES_ENABLED |
是否启用 cookies | False |
否 |
SCRAPY_HTTPCACHE_ENABLED |
是否启用 HTTP 缓存 | True |
否 |
SCRAPY_HTTPCACHE_EXPIRATION_SECS |
HTTP 缓存的过期时间(秒) | 3600 |
否 |
SCRAPY_HTTPCACHE_DIR |
HTTP 缓存目录 | httpcache |
否 |
SCRAPY_LOG_LEVEL |
Scrapy 日志级别 | ERROR |
否 |
设置步骤如下:
-
根据我们的抓取需求调整这些设置。 -
如果需要更激进的抓取,可以增加并发请求数,但要注意遵守网站的规则。 -
如果要进行更礼貌的抓取,可以添加下载延迟。
3.2.11 Playwright 设置
Playwright 设置主要控制使用 Playwright 进行浏览器自动化,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
PLAYWRIGHT_SERVER |
Playwright 服务器 URL | http://playwright:8000 |
否 |
PLAYWRIGHT_API_KEY |
Playwright API 密钥 | your - secret - api - key |
生产环境必需 |
PORT |
Playwright 服务端口 | 8000 |
否 |
HOST |
Playwright 服务主机 | 0.0.0.0 |
否 |
设置步骤如下:
-
在生产环境中,设置一个强密码作为 PLAYWRIGHT_API_KEY
,用于服务之间的认证。
3.2.12 集成设置
集成设置主要控制第三方集成,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
OPENAI_API_KEY |
OpenAI API 密钥 | 空 | AI 功能必需 |
STRIPE_SECRET_KEY |
Stripe 秘密密钥 | 空 | 支付功能必需 |
STRIPE_WEBHOOK_SECRET |
Stripe 网络钩子秘密 | 空 | Stripe 网络钩子必需 |
GOOGLE_ANALYTICS_ID |
Google Analytics ID | 空 | 可选 |
设置步骤如下:
-
如果需要使用 AI 功能,从 OpenAI 获取 API 密钥。 -
如果需要进行支付处理,设置一个 Stripe 账户。 -
如果需要使用 Stripe 网络钩子,在 Stripe 仪表板中配置网络钩子端点。
3.2.13 功能标志设置
功能标志设置主要控制功能的可用性,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
MAX_CRAWL_DEPTH |
最大抓取深度 | -1 (无限制) |
否 |
CAPTURE_USAGE_HISTORY |
是否捕获使用历史记录 | True |
否 |
设置步骤如下:
-
如果要限制抓取深度,可以设置一个正整数。 -
如果要禁用使用跟踪,将 CAPTURE_USAGE_HISTORY
设置为False
。
3.2.14 前端设置
前端设置主要控制 React 前端,具体如下:
变量 | 描述 | 默认值 | 是否必需 |
---|---|---|---|
API_BASE_URL |
前端使用的 API 基础 URL | /api |
否 |
设置步骤如下:
-
默认值 /api
与 Nginx 配置配合良好。 -
我们也可以使用绝对 URL(例如 http://localhost/api
)或相对 URL(例如/api
)。
3.3 部署步骤
按照以下步骤可以部署 WaterCrawl:
-
克隆仓库:
git clone https://github.com/watercrawl/watercrawl.git
cd watercrawl
这一步就像是把 WaterCrawl 的代码从云端下载到本地。
-
创建环境文件:
cp docker/.env.example docker/.env
将示例环境文件复制为实际使用的环境文件。
-
编辑环境文件:设置必需的变量,例如:
# At minimum for production, set these:
SECRET_KEY="your - generated - secret - key"
API_ENCRYPTION_KEY="your - generated - api - encryption - key" # Generate a new one using `python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"`
DEBUG=False
ALLOWED_HOSTS=your - domain.com
POSTGRES_PASSWORD=your - strong - password
MINIO_ACCESS_KEY=your - minio - username
MINIO_SECRET_KEY=your - minio - password
MINIO_EXTERNAL_ENDPOINT=your - domain.com # CRITICAL: Set to your domain
PLAYWRIGHT_API_KEY=your - strong - api - key
这里需要注意的是,SECRET_KEY
和 API_ENCRYPTION_KEY
需要生成安全的随机值,POSTGRES_PASSWORD
、MINIO_ACCESS_KEY
、MINIO_SECRET_KEY
和 PLAYWRIGHT_API_KEY
要设置为强密码。
-
启动服务:
cd docker
docker - compose up -d
启动 Docker 容器,让 WaterCrawl 开始运行。
-
初始化数据库(首次运行时):
docker - compose exec app python manage.py migrate
docker - compose exec app python manage.py createsuperuser
python manage.py migrate
用于创建数据库表,python manage.py createsuperuser
用于创建超级用户,方便我们进行管理。
-
访问应用程序:
部署完成后,我们可以通过以下 URL 访问不同的服务:
-
前端:http://your – domain.com -
API:http://your – domain.com/api -
MinIO 控制台:http://your – domain.com/minio – console
四、常见问题解答
4.1 连接问题
-
无法连接到服务:可以使用 docker - compose logs <service - name>
命令查看 Docker 日志,了解具体的错误信息。 -
数据库连接错误:使用 docker - compose ps
命令确保 PostgreSQL 正在运行。 -
前端无法加载:在浏览器控制台检查 JavaScript 错误,找出问题所在。
4.2 数据持久化问题
-
重启后数据丢失:确保 Docker 卷已经正确配置,这样数据才能在容器重启后得到保留。 -
无法上传文件:检查 MinIO 的凭证和存储桶配置,确保配置正确。
4.3 性能问题
-
响应时间慢:使用 docker stats
命令检查资源使用情况,找出性能瓶颈。 -
内存问题:可以调整 MinIO 的 JVM 设置或 Gunicorn 的工作线程数,以优化内存使用。
如果遇到其他问题,可以在 GitHub 仓库中提交 issue,寻求更多的帮助。
五、总结
WaterCrawl 是一款功能强大、易于部署的网页抓取和数据提取工具,它提供了丰富的功能和可定制的选项,能够满足不同用户的需求。通过本文的介绍,我们了解了 WaterCrawl 的特点、快速启动方法、部署指南以及常见问题的解决方法。希望大家能够根据自己的需求,合理地使用 WaterCrawl,挖掘出更多有价值的数据。
在使用 WaterCrawl 的过程中,要注意根据不同的环境和需求,正确地配置环境变量,确保服务的安全和稳定运行。同时,如果遇到问题,不要慌张,可以通过查看日志、检查配置等方法来解决问题,也可以在社区中寻求帮助。相信 WaterCrawl 会成为你数据抓取和分析的得力助手。
– END –