多容器磁力解析系统部署示例(Docker Compose)


好的,我已经为您整理了关于磁力链接自动抓取机器人程序的整个技术方案,并准备了相应的 docker-compose.yml 内容。

由于我是一个文本AI,无法直接为您生成并提供文件下载链接。但是,您可以将下面提供的内容复制粘贴到一个文本编辑器中(如VS Code, Sublime Text, Notepad++等),然后将文件保存为 README.md 或其他您喜欢的 Markdown 文件名。


磁力链接自动抓取机器人程序 - Docker 化部署方案

本项目旨在构建一个多容器的磁力链接自动抓取与管理系统。通过将不同功能解耦为独立的 Docker 容器,实现环境隔离、部署一致性、可伸缩性及更好的资源管理。


1. 核心架构概述

本系统采用微服务架构,核心组件包括:

  • Redis: 作为消息队列,解耦爬虫与解析器。
  • PostgreSQL: 关系型数据库,用于持久化存储所有抓取和解析后的磁力链接数据。
  • qBittorrent: 核心服务,利用其强大的 P2P 网络(DHT/Tracker)连接能力,通过 Web UI API 获取磁力链接的元数据(文件名、大小等)。
  • Scrapy 抓取器: 网络爬虫,负责从指定网站抓取原始磁力链接。
  • Magnet 解析器: 处理抓取到的磁力链接,调用 qBittorrent API 获取元数据,并进行数据清洗和存储。
  • Web UI: 提供一个用户友好的网页界面,展示已处理的磁力链接信息。

2. 各容器职责与技术栈

2.1 Redis 容器 (Message Queue)

  • 职责: 提供高性能的消息队列服务,用于 Scrapy 抓取器和 Magnet 解析器之间的异步通信。Scrapy 将抓取到的原始磁力链接放入队列,解析器从队列中消费。
  • 镜像: redis:7-alpine (轻量级 Redis 镜像)
  • 持久化: 通过数据卷 /data 持久化 Redis 数据。

2.2 PostgreSQL 容器 (Database)

  • 职责: 存储所有抓取、解析并结构化后的磁力链接数据,包括标题、文件名、大小、图片 URL、来源 URL、抓取时间等。
  • 镜像: postgres:15-alpine (PostgreSQL 官方轻量级镜像)
  • 持久化: 通过数据卷 /var/lib/postgresql/data 持久化数据库数据。
  • 配置: 环境变量设置数据库名、用户名和密码。

2.3 qBittorrent 容器 (Magnet Metadata Resolver)

  • 职责: 作为核心元数据解析服务。它运行 qBittorrent 客户端,自动连接 P2P 网络获取磁力链接的元数据。其他容器通过调用其 Web UI API 获取这些信息。
  • 镜像: linuxserver/qbittorrent:latest (推荐,功能完善且维护良好)
  • API 接口: 提供 Web UI API,供 Magnet 解析器调用。
  • 配置: 环境变量设置 Web UI 端口、用户名、密码、用户 ID/组 ID (PUID/PGID) 等。
  • 持久化: 通过数据卷 /config 持久化配置,/downloads 作为 qBittorrent 的下载目录(即使不实际下载文件也需要)。

2.4 Scrapy 抓取容器 (Scraper)

  • 职责: 模拟用户行为访问目标网站,抓取页面内容,并从中提取原始磁力链接字符串以及页面上可见的相关信息(如标题、初步描述、页面图片 URL)。
  • 技术栈: Python, Scrapy 框架, requests, BeautifulSoup4 / lxml
  • 数据流: 将抓取到的原始数据推送到 Redis 消息队列。
  • 反爬: 可在内部实现 User-Agent 轮换、请求延迟等基本反爬策略。
  • 镜像: 需要您基于 Python 官方镜像 (python:3.x-slim-buster) 自行构建 Dockerfile。

2.5 Magnet 解析与处理容器 (Parser)

  • 职责: 从 Redis 消息队列中获取原始磁力链接,然后通过调用 qBittorrent 容器的 Web UI API,请求 qBittorrent 解析该磁力链接的元数据。一旦元数据获取成功(包含准确的文件名、大小、文件结构),将结构化数据存储到 PostgreSQL 数据库。
  • 技术栈: Python, requests (或更推荐的 qbittorrent-api,简化与 qBittorrent API 交互)。
  • 交互逻辑: 涉及向 qBittorrent API 添加磁力链接、轮询其解析状态、获取元数据后清理 qBittorrent 中的任务。
  • 镜像: 需要您基于 Python 官方镜像 (python:3.x-slim-buster) 自行构建 Dockerfile。

2.6 页面显示容器 (Web UI)

  • 职责: 提供一个用户友好的网页界面,展示 PostgreSQL 中存储的已抓取和解析的磁力链接数据,并可能提供搜索、过滤、排序等功能。
  • 技术栈: Python (Flask/Django), HTML/CSS/JavaScript (前端框架如 React/Vue 可选)。
  • 数据流: 从 PostgreSQL 数据库读取数据并渲染到 Web 页面。
  • 镜像: 需要您基于 Python 官方镜像 (python:3.x-slim-buster) 或其他 Web 服务器镜像(如 nginx + 您的前端静态文件)自行构建 Dockerfile。

3. docker-compose.yml 配置示例

以下是整个系统的 docker-compose.yml 文件内容。请将其保存为 docker-compose.yml 文件,并根据您的实际需求和敏感信息进行修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
version: '3.8'

services:
# 1. 消息队列 (Redis)
redis:
image: redis:7-alpine
container_name: magnet_redis
command: redis-server --appendonly yes
volumes:
- redis_data:/data
ports:
- "6379:6379" # 暴露 Redis 端口,如果其他应用需要从外部访问
restart: unless-stopped

# 2. 数据库 (PostgreSQL)
postgresql:
image: postgres:15-alpine
container_name: magnet_postgresql
environment:
POSTGRES_DB: magnet_db
POSTGRES_USER: user
POSTGRES_PASSWORD: your_strong_password # **请务必更改为强密码**
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432" # 暴露 PostgreSQL 端口,如果需要从外部连接数据库客户端
restart: unless-stopped

# 3. qBittorrent (磁力链接元数据解析核心)
qbittorrent:
image: linuxserver/qbittorrent:latest
container_name: magnet_qbittorrent
environment:
PUID: 1000 # 宿主机用户ID,用于文件权限,请根据您的宿主机用户ID调整
PGID: 1000 # 宿主机用户组ID,用于文件权限,请根据您的宿主机用户组ID调整
TZ: America/Denver # 设置时区,请根据您的实际时区调整
WEBUI_PORT: 8080 # qBittorrent Web UI 端口
QBITTORRENT_WEBUI_USERNAME: admin # Web UI 用户名,请更改
QBITTORRENT_WEBUI_PASSWORD: your_qb_password # Web UI 密码,**请务必更改为强密码**
# 如果在开发阶段遇到CSRF问题,可以暂时禁用CSRF(生产环境不推荐,或使用qBittorrent-api库处理)
# WEBUI_EXTRA_ARGUMENTS: --disable-csrf
volumes:
- qbittorrent_config:/config # qBittorrent 配置持久化
- qbittorrent_downloads:/downloads # 下载目录 (即便不下载文件,qBittorrent也需要这个目录)
ports:
- "8080:8080" # qBittorrent Web UI 端口
- "6881:6881" # BitTorrent TCP 端口
- "6881:6881/udp" # BitTorrent UDP 端口
restart: unless-stopped
# qBittorrent本身不直接依赖DB,但为了逻辑上的服务启动顺序,可以依赖DB
depends_on:
- postgresql

# 4. Scrapy 抓取容器
scraper:
# 你需要构建自己的Scrapy Docker镜像。
# 确保在 scraper 目录下有 Dockerfile 和 Scrapy 项目代码。
build:
context: ./scraper # 指定 Scrapy 应用的 Dockerfile 路径
dockerfile: Dockerfile
container_name: magnet_scraper
environment:
REDIS_HOST: redis
REDIS_PORT: 6379
# 可以在这里定义其他 Scrapy 配置,如代理设置、目标URL等
depends_on:
- redis # Scrapy 依赖 Redis 发送数据
restart: on-failure # 失败时尝试重启

# 5. Magnet 解析与处理容器
parser:
# 你需要构建自己的解析器 Docker 镜像。
# 确保在 parser 目录下有 Dockerfile 和解析器代码。
build:
context: ./parser # 指定解析器应用的 Dockerfile 路径
dockerfile: Dockerfile
container_name: magnet_parser
environment:
REDIS_HOST: redis
REDIS_PORT: 6379
DB_HOST: postgresql
DB_NAME: magnet_db
DB_USER: user
DB_PASSWORD: your_strong_password # **与 PostgreSQL 密码一致**
QBT_HOST: qbittorrent
QBT_PORT: 8080
QBT_USERNAME: admin # 与 qBittorrent 用户名一致
QBT_PASSWORD: your_qb_password # **与 qBittorrent 密码一致**
depends_on:
- redis # 解析器依赖 Redis 获取任务
- postgresql # 解析器依赖 PostgreSQL 存储数据
- qbittorrent # 解析器依赖 qBittorrent API 获取元数据
restart: on-failure

# 6. 页面显示容器 (Web UI)
web_ui:
# 你需要构建自己的 Web UI Docker 镜像。
# 确保在 web_ui 目录下有 Dockerfile 和 Web 应用代码。
build:
context: ./web_ui # 指定 Web UI 应用的 Dockerfile 路径
dockerfile: Dockerfile
container_name: magnet_web_ui
environment:
DB_HOST: postgresql
DB_NAME: magnet_db
DB_USER: user
DB_PASSWORD: your_strong_password # **与 PostgreSQL 密码一致**
# 其他Web UI相关的配置
ports:
- "80:80" # 暴露 Web UI 端口
depends_on:
- postgresql # Web UI 依赖 PostgreSQL 获取数据
restart: unless-stopped

# 数据卷定义,用于持久化数据
volumes:
redis_data:
postgres_data:
qbittorrent_config:
qbittorrent_downloads: # 用于qBittorrent的下载目录,即使不实际下载文件也需要

4. 如何部署

  1. 创建项目目录结构:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    my_magnet_project/
    ├── docker-compose.yml
    ├── scraper/
    │ └── Dockerfile
    │ └── (你的 Scrapy 项目代码)
    ├── parser/
    │ └── Dockerfile
    │ └── (你的 Python 解析器代码)
    ├── web_ui/
    │ └── Dockerfile
    │ └── (你的 Web 应用代码)
  2. 在各自的服务目录 (scraper, parser, web_ui) 中创建 Dockerfile: 这些文件将定义如何构建每个服务的 Docker 镜像。请根据您选择的技术栈和代码内容编写这些 Dockerfile
  3. docker-compose.yml 中替换占位符:
    • your_strong_password
    • your_qb_password
    • PUID, PGID, TZ
  4. 打开终端,导航到 my_magnet_project 目录:
  5. 运行 Docker Compose:
    1
    docker-compose up -d
    这会构建所有自定义镜像(如果它们不存在),然后启动并运行所有定义的容器。
  6. 访问应用: 一旦所有容器启动成功,您就可以通过浏览器访问 http://localhost:80 (Web UI 端口) 和 http://localhost:8080 (qBittorrent Web UI)。

这个多容器方案提供了一个强大且灵活的平台,用于构建您的磁力链接自动抓取机器人程序。

本文作者:Samjoe Yang

本文链接: https://need.uno/duo-rong-qi-ci-li-jie-xi-xi-tong-bu-shu-shi-li/

版权声明:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。

评论