Node.js + Python 爬虫界的黄金搭档
写了一个工具叫去水印下载鸭,它的功能是解析某音、某红书等平台视频、图片,支持无水印下载。
![]()
在后端开发中,我选择了自己最为熟悉的 Node.js 技术。然而,在开发过程中,我遇到了一些棘手的问题,其中最令人头疼的就是某音的加密处理。 幸运的是,我在 GitHub 社区找到了一个开源仓库,它提供了相关的解决方案,但这个仓库是用 Python 实现的。我本想借助 AI 将其转换为 Node.js 代码,但转换后的代码运行报错。为了避免进一步的麻烦,我决定直接在 Node.js 项目中引入这个 Python 仓库,并且删减了其中我不需要的文件。
Node.js 集成 Python
在 Node.js 中使用 Python 简单又高效。我们先让 Python 程序输出结果,然后对结果稍作处理,用 /RESULT_START:结果:RESULT_END/ 这样的格式将其包裹起来。
async def fetch_one_video(url):
"""
Fetches a single video by aweme_id.
"""
hybird_crawler = HybridCrawler()
data = await hybird_crawler.hybrid_parsing_single_video(url,False)
# 只输出结果数据,使用特定标记包裹
print(f"RESULT_START:{json.dumps(data)}:RESULT_END")
随后,在 Node.js 端,我们借助 exec 方法来运行一条 Python 命令,具体如下所示:
new Promise((resolve, reject) => {
const src = path.join(__dirname, '../script/start.py');
exec(`python ${src} ${url}`, (error, stdout, stderr) => {
if (error) {
console.error(`Error executing Python script: ${error}`);
reject(null)
return;
}
if (stderr) {
reject(null)
return;
}
// 使用正则表达式捕获 RESULT_START 和 RESULT_END 之间的内容
const regex = /RESULT_START:(.*?):RESULT_END/;
const match = stdout.match(regex);
if (match && match[1]) {
try {
// 解析捕获到的 JSON 数据
const jsonData = JSON.parse(match[1]);
resolve(jsonData);
} catch (parseError) {
reject(null)
}
} else {
reject(null)
}
})
})
当调用 exec 方法时,Node.js 会调用操作系统的相关功能来创建一个新的子进程。这个子进程会独立于父进程运行。
这样,Node.js环境中使用Python就搞定了。
Docker 部署 Node.js+Python
若想在 Docker 容器中运行 Node.js 与 Python,打包时需确保容器内同时具备 Node.js 和 Python 的运行环境。
最初,Dockerfile 仅包含 Node.js 的配置,配置如下所示:
# 构建阶段
FROM node:24-alpine
WORKDIR /app
# 复制 package 文件
COPY package*.json ./
# 复制源代码
COPY . .
RUN npm i -g pnpm && pnpm i
# 暴露端口
EXPOSE 3000
# 启动应用
CMD [ "npm", "start" ]
为了在Docker镜像中引入Python,我在Dockerfile中加入了对Python3的支持,以确保容器内同时具备Node.js和Python的运行环境。以下是Dockerfile的修改内容:
FROM node:24-alpine
RUN apt-get update && \
apt-get install -y --no-install-recommends python3 python3-pip && \
rm -rf /var/lib/apt/lists/*
#省略...
然而,在构建镜像的过程中,我发现下载python3和python3-pip等包的速度非常慢,并且在安装过程中还涉及到编译,这使得整个构建过程变得异常耗时。
经过一番思考,我决定调整策略:先基于Python镜像构建,再在其上添加Node.js环境。于是,我对Dockerfile进行了如下调整:
FROM python:3.11-slim-bookworm
RUN sed -i 's|http://deb.debian.org|https://mirrors.aliyun.com|g' \
/etc/apt/sources.list.d/debian.sources && \
sed -i 's|http://security.debian.org|https://mirrors.aliyun.com|g' \
/etc/apt/sources.list.d/debian.sources
RUN apt-get update && apt-get install -y --no-install-recommends nodejs npm \
&& rm -rf /var/lib/apt/lists/* \
&& npm config set registry https://registry.npmmirror.com/
#省略...
这样完成解决Docker部署问题。
最后
如果你也遇到了需要在项目中同时使用 Node.js 和 Python 的情况,不妨参考本文的操作方法,或许能为你提供一些思路和帮助。
去水印下载鸭仅限于学习,请勿用于其他用途,否则后果自负,且软件没有进行任何店铺售卖,谨防受骗!