Python里的json.dumps()与JavaScript里的JSON.strstringify()有何不同之处? 在爬虫中我们应该注意什么?
Python里的json.dumps()与JavaScript里的JSON.strstringify()有何不同之处?
先看示例:
# Python代码
import json
aa = {
"name": "你好",
"id": "abc123..."
}
# 使用json.dumps()输出非 ASCII 字符时,会对非 ASCII 字符进行转换为 Unicode 转义序列进行输出
print(json.dumps(aa))
在python中使用json.dumps()输出非 ASCII 字符时,会对非 ASCII 字符进行转换为 Unicode 转义序列进行输出
// JavaScript代码
aa = {
"name": "你好",
"id": "abc123"
}
// JSON.stringify()则会直接输出ASCII字符和非ASCII字符,会直接输出原文字符,而不是输出Unicode 转义序列
console.log(JSON.stringify(aa));
在爬虫中我们应该注意什么?
在python里的requests模块里,当使用json参数时会先调用json.dumps()将你要传递的数据进行处理。
# requests 传json数据时 会调用json.dumps()
response = requests.post(url, headers=headers, json=data)
但json.dumps()会将非 ASCII 码字符转换为Unicode 转义序列,也就是会将中文转换为 \u4f60\u597d 这种Unicode 转义序列
所以我们应该在使用execjs模块里的call方法时将字符用json.dumps()给转换一下,如果没有进行转换,而是直接传递给js,那会发生以下情况:
原数据,没有经过json.dumps()转换的数据:
data = {
"SearchKeyword": "复试 仿真模拟",
"UniversityCode": "",
"MajorCode": "",
"PageIndex": 3,
"PageSize": 30
}
requests使用json参数后会调用json.dumps()处理数据,然后将传递给服务端,这是的数据是:
data = {"SearchKeyword": "\u590d\u8bd5 \u4eff\u771f\u6a21\u62df",
"UniversityCode": "",
"MajorCode": "",
"PageIndex": 3,
"PageSize": 30}
我们将原数据直接传递给js进行处理,不经过json.dumps()转换,在js中进行加密后得到的数据和经过json.dumps()转换的数据是不一样的。
总结:
只要记住在使用requests的json参数时,然后又要将json参数里的数据拿去给js加解密时记得对其json.dumps()
就和下面的代码一样,data是要传递给js函数get_timestamp_nonce_sign的实参,要在传递时进行json.dumps()转换。
body = js.call("get_timestamp_nonce_sign", json.dumps(data))