tushare报错——JSONDecodeError: Expecting value: line 1 column 1 (char 0)
运行以下代码
报出JSONDecodeError: Expecting value: line 1 column 1 (char 0),其原因主要是tushare的票房数据来源为EBOT艺恩票房智库,而艺恩票房智库的网站结构出现了变化,使得原码的爬虫出现了异常(无法获取数据)。于是我们可以修改源码中的爬虫部分。
这里我只做修改realtime_boxoffice()方法的示例,且第一到第三步为分析过程,读者可以直接跳到第四步直接修改源码。
第一,去到艺恩票房智库网站:http://www.endata.com.cn/BoxOffice/index.html
第二,单击右键—>查看元素—>切换到网络窗口
第三步,单击页面中的“票房”,就会拦截许多文件,这些文件就是浏览器和客户端的通信内容。刚才的单击动作是提交数据,所以看到post就选择来查看数据实体内容。
这样就获取了请求网址(http://www.endata.com.cn/API/GetData.ashx)和表单内容,可以重写源码的爬虫信息了,表单内容如下。
startDate:
MethodName:BoxOffice_GetHourBoxOffice
第四步,找到源码文件,在安装python路径的Lib\site-packages\tushare\internet目录下,打开boxoffice.py文件。
(一)在文件头部导入urllib包,即
import urllib
(二)在realtime_boxoffice()方法下找到以下内容,
request = Request(ct.MOVIE_BOX%(ct.P_TYPE['http'], ct.DOMAINS['mbox'],
ct.BOX, _random()))
lines = urlopen(request, timeout = 10).read()
换成
url='http://www.endata.com.cn/API/GetData.ashx'
data={}
data = {
'showDate':'',
'MethodName':'BoxOffice_GetHourBoxOffice'
}
data=urllib.parse.urlencode(data).encode('utf-8')
response=urllib.request.urlopen(url,data)
lines=response.read()
(三)再将
js = json.loads(lines.decode('utf-8') if ct.PY3 else lines)
df = pd.DataFrame(js['Data']['Table'])
df = df.drop(['MovieImg','mId'], axis=1)
df['time'] = du.get_now()
return df
换成
js = json.loads(lines.decode('utf-8') if ct.PY3 else lines)
df = pd.DataFrame(js['Data']['Table1'])
df = df.drop(['mId','larger_url','default_url','moblie_url','MovieImg'], axis=1)
df['time'] = du.get_now()
return df
然后保存即可。
最后,我们重启下程序
import tushare as ts
df = ts.realtime_boxoffice() #取实时的数据
df
好了,现在realtime_boxoffice()没有报错,也会有数据了。
其实,这个异常可以等tushare社区来更新tushare库的,我这里只是闲得无聊写下博文。