Python获取jsonp数据
2023/5/10 1:22:17
本文主要是介绍Python获取jsonp数据,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
使用python爬取数据时,有时候会遇到jsonp的数据格式,由于不是json的,所以不能直接使用json.loads()方法来解析,需要先将其转换为json格式,再进行解析。在前面讲了jsonp的原理 ,这里就略过一部分。
jsonp的格式
jsonp的内容一般是这样的:
callback({ "name":"zhangsan", "age":18 })
也有有可能是这样的:
callback( 'name', (function(a,b,c){ return { name:a, age:b, gender:c } })('孙悟空',18,'男') )
这里的callback就是一个函数名,这个函数名是由后端返回的,我们需要将这个函数名提取出来,然后将其替换为一个我们自己定义的函数名,然后再将其转换为json格式,再进行解析。
这个函数名一般会包含在get请求的参数中,例如:
<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数据的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-26React入门教程:从零开始搭建你的第一个React应用
- 2024-12-25Vue2入门教程:轻松掌握前端开发基础
- 2024-12-25Vue3入门指南:快速搭建你的第一个Vue3项目
- 2024-12-25JS基础知识入门教程
- 2024-12-25React基础知识详解:从入门到初级应用
- 2024-12-25Vue3基础知识详解与实战指南
- 2024-12-25Vue3学习:从入门到初步掌握
- 2024-12-25Vue3入门:新手必读的简单教程
- 2024-12-23【JS逆向百例】爱疯官网登录逆向分析
- 2024-12-21Vue3教程:新手入门到实践应用