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

  • 相关阅读:
    3D游戏建模师职业现状:大学生毕业就是失业,真的这么可怕吗
    Websocket集群解决方案
    java毕业设计毕业设计管理系统Mybatis+系统+数据库+调试部署
    Java学习笔记------常用API(二)
    1.网络空间搜素引擎
    java计算机毕业设计西宁市农副产品物流信息系统源码+系统+数据库+lw文档+mybatis+运行部署
    python之Numpy(三)
    Java实现整数互转罗马数字基本算法
    Golang协程-通道方向
    VueUse、View Transitions API实现暗黑模式主题动画切换效果
  • 原文地址:https://www.cnblogs.com/primice/p/17386065.html