爬虫工程师也应该会的 NodeJS 知识(三)- 快速抛弃 execjs
时间:2022-07-24
本文章向大家介绍爬虫工程师也应该会的 NodeJS 知识(三)- 快速抛弃 execjs,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
什么是 Express ?
Express 是一个基于 NodeJS 的 Web Server 开发框架,能够帮助我们快速的搭建 Web 服务器
为什么需要 Express ?
1、不使用框架,使用原生的 NodeJS 开发 Web 服务器,我们需要处理很多繁琐且没有技术含量的内容,例如:获取路由,处理路由等等
2、 不使用框架,使用原生的 NodeJS 开发 Web 服务器,需要解析 get、post 参数解析,使用 Express 可以使用现成的插件实现上面的功能,只要关心核心的业务逻辑即可
3、Python 中的 execjs 库已经停止更新,存在很多未知 bug,使用 express 不管从性能上还是易用性上都要高出一筹
如何使用 Express ?
手动安装
npm install express
简单使用
const express = require("express")
const app = express()
app.get('/',function(req,res){
res.send('hello,express')
})
app.listen(3000,()=>{
console.log("监听端口3000成功")
})
返回静态资源
const express = require("express")
const path = require("path")
const app = express()
app.get('/',function(req,res){
res.send('hello,express')
})
// 这里的 pathname 是存放静态资源的路径
app.use(express.static(path.join(__dirname,'pathname')));
app.listen(3000,()=>{
console.log("监听端口3000成功")
})
获取 get 请求参数
const express = require("express")
const app = express()
app.get('/',function(req,res){
res.send(req.query)
})
app.listen(3000,()=>{
console.log("监听端口3000成功")
})
获取 get 请求参数测试结果
获取 post 请求参数
安装
npm install body-parser
例子
const express = require("express");
const bodyParser = require('body-parser');
const app = express();
// app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended : false}));
app.post('/',function(req,res){
res.send(req.body['name'])
});
app.listen(3000,()=>{
console.log("监听端口3000成功")
});
获取 post 请求参数截图
Express 在 Js 逆向中的应用
通过上面的两个例子已经可以学会关于 express 是如何处理请求参数的了,现在就把它应用到 Js 逆向中
在之前我们处理 Js 加密使用的是 python
的 execjs
这个包已经很久没有更新了,经常会出现一些未知的bug
,所以我们今天就要放弃execjs
使用express
来处理加密的 js
直接上一段之前文章的测试代码
Python 爬虫进阶必备 | 某视频数据分析平台加密参数分析
Python + execjs 版本:
import requests
import execjs
# 用 postman 直接生成的,勿喷
url = "https://xd.newrank.cn/xdnphb/nr/cloud/douyin/rank/hotAccountAllRankList"
# 这里的 crack_xd.js 就是 js 加密逻辑
with open('crack_xd.js',"r") as f:
js_data = f.read()
js_data = execjs.compile(js_data)
params = js_data.call("get_params","/xdnphb/nr/cloud/douyin/rank/hotAccountAllRankList")
print(params)
payload = "{"date":"2020-08-16","date_type":"days","type":"娱乐","start":1,"size":20}"
headers = {
'authority': "xd.newrank.cn",
'pragma': "no-cache",
'cache-control': "no-cache,no-cache",
'accept': "application/json, text/plain, */*",
'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
'content-type': "application/json;charset=UTF-8",
'origin': "https://xd.newrank.cn",
'sec-fetch-site': "same-origin",
'sec-fetch-mode': "cors",
'sec-fetch-dest': "empty",
'referer': "https://xd.newrank.cn/data/tiktok/rank/overall",
'accept-language': "zh-CN,zh;q=0.9,en;q=0.8",
'cookie': "Hm_lvt_e20c9ff085f402c8cfc53a441378ca86=1597660797; Hm_lpvt_e20c9ff085f402c8cfc53a441378ca86=1597660859; token=62621CBEE73B4CF98CAA79A77958EA9D",
'Postman-Token': "30dbcaa8-0e0e-44f0-b3ad-b6ddf9c90921"
}
response = requests.request("POST", url, data=payload.encode(), headers=headers, params=params)
print(response.text)
Python + express 版本:
import requests
import execjs
url = "https://xd.newrank.cn/xdnphb/nr/cloud/douyin/rank/hotAccountAllRankList"
def get_params():
params_url = "http://localhost:3000"
headers = {
'Connection': "keep-alive",
'Accept-Language': "zh-CN,zh;q=0.9,en;q=0.8",
'Content-Type': "application/x-www-form-urlencoded",
'cache-control': "no-cache",
}
payload = "callback=u_params('/xdnphb/nr/cloud/douyin/rank/hotAccountAllRankList')"
response = requests.post(params_url, headers=headers, data=payload)
return response.text
params = get_params()
payload = "{"date":"2020-08-16","date_type":"days","type":"娱乐","start":1,"size":20}"
headers = {
'authority': "xd.newrank.cn",
'pragma': "no-cache",
'cache-control': "no-cache,no-cache",
'accept': "application/json, text/plain, */*",
'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
'content-type': "application/json;charset=UTF-8",
'origin': "https://xd.newrank.cn",
'sec-fetch-site': "same-origin",
'sec-fetch-mode': "cors",
'sec-fetch-dest': "empty",
'referer': "https://xd.newrank.cn/data/tiktok/rank/overall",
'accept-language': "zh-CN,zh;q=0.9,en;q=0.8",
'cookie': "token=62621CBEE73B4CF98CAA79A77958EA9D; Hm_lvt_e20c9ff085f402c8cfc53a441378ca86=1597660797,1598777678; Hm_lpvt_e20c9ff085f402c8cfc53a441378ca86=1598777678; _uab_collina=159877767862449280501573",
'Postman-Token': "30dbcaa8-0e0e-44f0-b3ad-b6ddf9c90921"
}
response = requests.request("POST", url, data=payload.encode(), headers=headers, params=params)
print(response.text)
express 代码样例:
const express = require("express");
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.urlencoded({extended : false}));
/*
中间省略加密的逻辑代码
*/
app.post('/',function(req,res){
let params = req.body['callback'];
console.log(params)
let value = eval(params);
res.send(value)
});
app.listen(3000,()=>{
console.log("监听端口3000成功")
});
代码运行结果
以上就是这次的全部内容了,咱们下次再会 ~
Love&Share
[ 完 ]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL 8.0新特性 — 不可见索引
- 【小白学PyTorch】9.tensor数据结构与存储结构
- 【Python相关】jupyter平台最强插件没有之一
- 基于 OpenCV 的图像分割
- 再见,可视化!你好,Pandas!
- 40000字 Matplotlib 实操干货,真的全!
- Python自动化(二十) | 聊聊 Python 操作PDF的几种方法(合并、拆分、水印、加密)
- C语言发展史的点点滴滴
- 我写了一个R包,简化芯片的差异分析
- 【收藏】万字解析Scipy的使用技巧!
- Python 如何使用 HttpRunner 做接口自动化测试
- Python 爬虫时,高版本 App 如何进行抓包?
- 使用 shell-operator 实现 Operator
- 我们是如何用 K8S 搞定1000个应用的测试环境
- 关于Python 3.9,那些你不知道的事