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数据的更多相关文章
- python获取Excel数据
Python中一般使用xlrd(excel read)来读取Excel文件,使用xlwt(excel write)来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用xlrd读取 ...
- 解决ImmediateDeprecationError 用Python获取Yahoo数据
最近正在看用 python 进行数据处理的内容,很多教程都会用 pandas 去抓取金融数据.我也尝试跑教程上的示例代码以抓取数据. 本文着重介绍遇到的问题以及解决方法. 注:我使用的是 Python ...
- 一个采用python获取股票数据的开源库,相当全,及一些量化投资策略库
tushare: http://tushare.waditu.com/index.html 为什么是Python? 就跟javascript在web领域无可撼动的地位一样,Python也已经在金融量化 ...
- python + docker, 实现天气数据 从FTP获取以及持久化(三)-- python获取FTP数据
前言 经过前面两个小节的介绍,我们已经完成了MySQL数据库的搭建和数据库操作的事宜. 在本小节中,我们需要完成的任务是:使用python从FTP服务其上面获取文本文件. 搭建测试FTP服务器 LZ的 ...
- Python学习笔记(十五)用Python获取本地数据
f1 = open(r'E:\Python\Data\data1.txt') #读取data1.txt文件,使用系统默认缓冲区大小, 为了读取快点,使用缓存吧! f = open(r'E:\Pytho ...
- python 获取excel数据 自动登陆
import xlrdimport timeimport unittestfrom selenium import webdriver class u8819(unittest.TestCase): ...
- Python获取爬虫数据, r.text 与 r.content 的区别
1.简单粗暴来讲: text 返回的是unicode 型的数据,一般是在网页的header中定义的编码形式. content返回的是bytes,二级制型的数据. 如果想要提取文本就用text 但是如果 ...
- python 获取进程数据
from multiprocessing import Process, Manager def func(dt, lt): ): key = 'arg' + str(i) dt[key] = i * ...
- 第十章用Python获取sqlite、MySQL、Excel、csv、json中的数据
目录 获取sqlite3中的数据 sqlite3库获取sqlite数据 pandas库获取sqlite数据 获取MySQL中的数据 pymsql库获取MySQL数据 pandas库获取mysql数据 ...
- 十一、React 获取服务器数据: axios插件、 fetch-jsonp插件的使用
react获取服务器APi接口的数据: react中没有提供专门的请求数据的模块.但是我们可以使用任何第三方请求数据模块实现请求数据 一.axios 获取Api数据 使用文档:https://www. ...
随机推荐
- ORACLE数据库通过DBLINK连接另一个数据库
ORACLE数据库通过DBLINK连接另一个数据库 亲测有效:create database link XXX --dblink名connect to 远程数据库用户名 identified by & ...
- 集群与iptables
Iptables 五链四表执行关系如图所示,容器环境最常用的就是filter和nat表 加上各种自定义的链插入到各个环节,拦截流量做各种控制 filter表:匹配数据包以进行过滤 nat表:修改数据包 ...
- 导出生成word
用XML做就很简单了.Word从2003开始支持XML格式,大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板(后缀为.ft ...
- python之pyqt5-第一个pyqt5程序-图像压缩工具-小记
(如想转载,请联系博主或贴上本博地址) 此为学习pyqt5的第一个程序,图像压缩工具. 因为比较简单,下面直接贴上代码. 效果图如下: # -*- coding: utf-8 -*- import s ...
- 3---java中的集合
集合是什么:表示一组元素的对象,有的是有序的,有的是无序的,有的是可重复的,有的是不可重复的. 首先根是:Collection 1:Set 没有重复元素 SortedSet 有序的Set 2:Lis ...
- Apache与tomcat区别--转水漫金山
Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行.Apache是Web服务器而Tomcat是Java应用服务器 Ap ...
- 通过k8s部署服务
一 使用docker运行fastapi程序(python封装http接口) 一 docker commit 1 下载python3的镜像 docker pull python:3.8-slim # s ...
- Vue插件开发,全局插件和按需加入插件
年前手下事情少,找了一个下午研究了一下Vue插件开发,首先要感谢B站的前端小野森森-2,借鉴了他的视频,自己也写了一下.把过程记录下来. 首先用vite建一个空项目. 然后新建modules文件夹,和 ...
- Mybatis数据库驱动
Mybatis数据库驱动 最近在学习mybatis的源码,有一个databaseIdProvider根据不同数据库执行不同sql的功能,我正好有一个mysql还有一个瀚高数据库,就去试了一下,使用如下 ...
- fpm模式下读取到is_cli为何为true
目录 问题出现和简单排查 排查 经过思考和猜测,严重怀疑是fpm读取到了cli下的opcache 原起 粗浅探索 测试代码 opcache配置 共享内存缓存与文件缓存 php-fpm下读取到is_cl ...