【无标题】

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))
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值