首页 > 编程语言 >Python获取jsonp数据

Python获取jsonp数据

时间:2023-05-09 21:03:24浏览次数:47  
标签:函数 callback Python cb 获取 json jsonp data

使用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数据的方式,如果有错误或不足之处欢迎指正

标签:函数,callback,Python,cb,获取,json,jsonp,data
From: https://www.cnblogs.com/primice/p/17386065.html

相关文章

  • 数据结构(python版)—— 1、前期知识和综述
    前言为了提高代码质量和后续处理需求的能力,有必要再复习下算法和数据结构,为后续ESP32项目和数据处理打下坚实基础。故根据所学整理此系列文章。文章分为:1、概述:计算理论2、算法分析3、基本结构(线性表、链表、栈和队列)4、递归(递归算法和分治策略)5、排序与查找6、树及其算法......
  • python 中 re.match 和 re.search用法
     001、re.match>>>re.match("ab","abcdefgab")##在字符串abcdefgab中查找字符串ab,返回索引<re.Matchobject;span=(0,2),match='ab'>>>>re.match("xy","abcdefgab")##如果查找字符串不存在,返回none&g......
  • Python多线程(multithreading)
    1.threading模块Python3线程中常用的两个模块为:_thread,threading(推荐使用).thread模块已被废弃,为了兼容性,Python3将thread重命名为_thread,即通过标准库_thread和threading提供对线程的支持。_thread提供了低级别的、原始的线程以及一个简单的锁,它相比于threading模块的功能还......
  • python中strip和split的用法
    strip()用法str.strip()作用是删除字符串(str)的头和尾的空格,以及位于头尾的\n,\t等。不抓取字符串中间的空格,只抓头尾示例1:str="ABCABCABC\n"print(str)#输出原始字符串str,'\n'会空格一行print(str.strip())#删除头部空格,以及尾部的\nprint(str.ls......
  • 2020-07-30-python-multithreading&multiprocessing
    注:参考Python多线程多进程那些事儿看这篇就够了~~进程、线程进程和线程简单举例:对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程。有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要......
  • php获取未解码之前的原始接口请求参数
    前言目前的几个项目,业务方基本都使用POST方式请求接口,我们本机磁盘会保留一份请求的原始参数用于请求分析和问题排查使用,一般有问题,也会基于seqid(请求唯一id)捞到日志,copy参数模拟请求看是否复现,但一直有个比较蛋疼的问题,PHP的$_POST,$_GET,$_REQUEST这些获取参数的方法获取到的......
  • citect使用CitectVBA脚本获取本机IP地址
    这是我在新浪写过的一个笔记,在这里也记录一遍。新浪博客地址citect使用CitectVBA脚本获取本机IP地址_来自金沙江的小鱼_新浪博客(sina.com.cn)最近现场计算机上需要获取IP地址来做一些功能,简单得查询了一下网络,还是很好实现的。新建一个citectVBA函数FunctionGetIPAddress()......
  • 分享一个提高运维效率的 Python 脚本
    哈喽大家好我是咸鱼,今天给大家分享一个能够提升运维效率的python脚本咸鱼平常在工作当中通常会接触到下面类似的场景:容灾切换的时候批量对机器上的配置文件内容进行修改替换对机器批量替换某个文件中的字段对于Linux机器,咸鱼可以写个shell脚本或者直接批量使用sed命......
  • 力扣 724. 寻找数组的中心下标 --python
    给你一个整数数组 nums,请计算数组的中心下标。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为0,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个......
  • Python中的文件操作
    我们的当前工作路径为:E:\\Miniconda\\envs\\Practice_env\\d2l-zh\\python中的文件操作1.从文件中读取数据1.使用file_object.read()读取整个文件的内容。其中file_object是一个表示文件的对象: 要以任何方式使用文件,哪怕是仅仅打印其内容,都要先打开这个文件。函数open()用......