Python获取jsonp数据

科技资讯 投稿 11500 0 评论

Python获取jsonp数据

jsonp的格式

jsonp的内容一般是这样的:

callback({
    "name":"zhangsan",
    "age":18
}

也有有可能是这样的:

callback(
    'name',
    (function(a,b,c{
        return {
            name:a,
            age:b,
            gender:c
        }
    }('孙悟空',18,'男'

这里的callback就是一个函数名,这个函数名是由后端返回的,我们需要将这个函数名提取出来,然后将其替换为一个我们自己定义的函数名,然后再将其转换为json格式,再进行解析。

<script src="xxx.xxx?callback=cb"></script>

在这个url中,callback=cb是我们传给服务器的参数,我们可以理解为告诉服务器我们需要将数据传入cb这个函数中,然后服务器返回的数据就会以cb(data的形式返回,例如:

cb({
    "name":"zhangsan",
    "age":18
}
获取数据
方法一

通常情况下服务器返回的数据调用哪个函数由传递的callback参数决定,如果我们将callback的参数改为我们自己定义的函数名,那么服务器就会返回这个函数名。
因此,我们也可以尝试将callback参数填写为空,例如:

import requests
requests.get('xxx.xxx?callback='

这样服务器就会直接返回数据而不是用函数包裹

方法二


import requests
import re
res = requests.get('xxx.xxx?callback=cb'
# 正则表达式提取
data = re.search('cb\((.*?\',res.group(1
# 字符串切片提取
data = res[3:-1] 
方法三

使用subprocess库执行js代码,但是jsonp返回的数据中只有一个调用函数的代码,因此我们需要提前定义一个函数,并将内容写入js文件后执行,例如:

import requests
import subprocess

cb_data = requests.get('xxx.xxx?callback=cb'.text
# 定义一个函数
js = '''   
function cb(data {
    console.log(data;
}
'''
# 将函数写入js文件
with open('jsonp.js','w',encoding='utf-8' as f:
    f.write(js+cb_data

# 执行js文件的同时捕获打印信息
result = subprocess.run('node jsonp.js',shell=True,stout=subprocess.PIPE
# 将结果转换为json
json = json.loads(res.stdout.decode(
""" json转换时可能会出错,因此可以在定义的函数中将console.log(data 修改为 console.log( JSON.stringify(data """
# 打印转换后的内容
print(json

以上,简单的介绍了三种获取jsonp数据的方式,如果有错误或不足之处欢迎指正

编程笔记 » Python获取jsonp数据

赞同 (49) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽