Python调用None.js + Express搭建的HTTP服务

想用 Python 来编写整个爬虫,可以使用 Node.js 将加密算法暴露成一个HTTP服务,Python 直接调用HTTP服务,通过发送 Request Body 来传递数据,加密参数通过HTTP的 Response 返回。Express 是 Node.js 最流行的HTTP服务框架

安装express

1
npm i express

官网地址:https://www.expressjs.com.cn/starter/installing.html

搭建HTTP服务

app.js 文件写入:

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
const express = require('express')

const port = 8081
const app = express()

app.use(express.json())


function sign(json) {
// 接收到的 Request Body
const { timestamp, token } = json
// 算法这里简单化了
encryptStr = timestamp + token
console.log(encryptStr)
return { 'encryptStr': encryptStr }
}

app.post('/sign', (req, res) => {
const data = req.body
res.send(sign(data))
})

app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})

然后在 app.js 所在目录运行:

1
node app.js

这时应该可以看到:

1
Example app listening on port 8081

说明服务搭建成功了,它接收一个post请求,然后返回 sign 函数的计算结果作为 Response 的内容

Python调用HTTP服务

main.py 文件写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
import time

import requests


url = 'http://localhost:8081/sign'
data = {
'timestamp': int(time.time()),
'token': 'abcdefg'
}

response = requests.post(url, json=data)
print(response.json())

运行结果:

1
{'encryptStr': '1662528134abcdefg'}

其他事项

一般来说请求头和加密算法都会用到 时间戳,那这个 时间戳 要么用 Python 生成的,要么用 Nonde.js 生成的。网站会根据请求头中的 时间戳 对加密参数进行验证,如果 时间戳 不一致可能会验证失败