经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python获取jsonp数据
来源:cnblogs  作者:'Radio'  时间:2023/5/10 9:23:41  对本文有异议

使用python爬取数据时,有时候会遇到jsonp的数据格式,由于不是json的,所以不能直接使用json.loads()方法来解析,需要先将其转换为json格式,再进行解析。在前面讲了jsonp的原理 ,这里就略过一部分。

jsonp的格式

jsonp的内容一般是这样的:

  1. callback({
  2. "name":"zhangsan",
  3. "age":18
  4. })

也有有可能是这样的:

  1. callback(
  2. 'name',
  3. (function(a,b,c){
  4. return {
  5. name:a,
  6. age:b,
  7. gender:c
  8. }
  9. })('孙悟空',18,'男')
  10. )

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

这个函数名一般会包含在get请求的参数中,例如:

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

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

  1. cb({
  2. "name":"zhangsan",
  3. "age":18
  4. })
获取数据
方法一

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

  1. import requests
  2. requests.get('xxx.xxx?callback=')

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

方法二

通过字符串切片或者正则表达式来提取数据,例如:

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

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

  1. import requests
  2. import subprocess
  3. cb_data = requests.get('xxx.xxx?callback=cb').text
  4. # 定义一个函数
  5. js = '''
  6. function cb(data) {
  7. console.log(data);
  8. }
  9. '''
  10. # 将函数写入js文件
  11. with open('jsonp.js','w',encoding='utf-8') as f:
  12. f.write(js+cb_data)
  13. # 执行js文件的同时捕获打印信息
  14. result = subprocess.run('node jsonp.js',shell=True,stout=subprocess.PIPE)
  15. # 将结果转换为json
  16. json = json.loads(res.stdout.decode())
  17. """ json转换时可能会出错,因此可以在定义的函数中将console.log(data) 修改为 console.log( JSON.stringify(data)) """
  18. # 打印转换后的内容
  19. print(json)

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

原文链接:https://www.cnblogs.com/primice/p/17386065.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号