Node.js + Python 爬虫界的黄金搭档

写了一个工具叫去水印下载鸭,它的功能是解析某音、某红书等平台视频、图片,支持无水印下载。

在后端开发中,我选择了自己最为熟悉的 Node.js 技术。然而,在开发过程中,我遇到了一些棘手的问题,其中最令人头疼的就是某音的加密处理。 幸运的是,我在 GitHub 社区找到了一个开源仓库,它提供了相关的解决方案,但这个仓库是用 Python 实现的。我本想借助 AI 将其转换为 Node.js 代码,但转换后的代码运行报错。为了避免进一步的麻烦,我决定直接在 Node.js 项目中引入这个 Python 仓库,并且删减了其中我不需要的文件。

Node.js 集成 Python

在 Node.js 中使用 Python 简单又高效。我们先让 Python 程序输出结果,然后对结果稍作处理,用 /RESULT_START:结果:RESULT_END/ 这样的格式将其包裹起来。

python 复制代码
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 命令,具体如下所示:

jsx 复制代码
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 的配置,配置如下所示:

docker 复制代码
# 构建阶段
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的修改内容:

docker 复制代码
FROM node:24-alpine

RUN apt-get update && \
    apt-get install -y --no-install-recommends python3 python3-pip && \
    rm -rf /var/lib/apt/lists/*
 
 #省略...

然而,在构建镜像的过程中,我发现下载python3python3-pip等包的速度非常慢,并且在安装过程中还涉及到编译,这使得整个构建过程变得异常耗时。

经过一番思考,我决定调整策略:先基于Python镜像构建,再在其上添加Node.js环境。于是,我对Dockerfile进行了如下调整:

docker 复制代码
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 的情况,不妨参考本文的操作方法,或许能为你提供一些思路和帮助。

去水印下载鸭仅限于学习,请勿用于其他用途,否则后果自负,且软件没有进行任何店铺售卖,谨防受骗!

相关推荐
柯杰4 小时前
DNS劫持防护:从被动监测到主动防御
后端·dns
YaeZed4 小时前
Vue3-动态组件
前端·vue.js
墨守城规4 小时前
CompletableFuture 使用与分析
后端
单身的人上天堂4 小时前
开发中使用iconfont预览太麻烦?我开发了一款VSCode插件来提升效率
前端·javascript·visual studio code
鹏多多4 小时前
前端项目package.json与package-lock.json的详细指南
前端·vue.js·react.js
爱叫啥叫啥4 小时前
你都知道哪些嵌入式中的常用关键字
后端
爱吃大芒果4 小时前
Flutter 本地存储方案:SharedPreferences、SQFlite 与 Hive
开发语言·javascript·hive·hadoop·flutter·华为·harmonyos
敲代码的独角兽4 小时前
一文搞懂JavaScript事件循环 (Event Loop)
前端
yujunlong39194 小时前
Redux Toolkit (RTK) + TypeScript
前端·typescript·react
AI视觉网奇4 小时前
live2d 单图转模型 单图生成模型
java·前端·python