在学习tushare的用法中:发现无法登录实盘。主要由以下两种原因造成:
1、tushare中现有函数无法识别验证码
tushare/trader/utils.py模块中的get_vcode函数,是zxjt网站交易登录界面验证码识别函数。但由于网站改版等原因,该函数中的vcode=pytessoract.image_to_string(img),对zxjt登录界面的验证码并不能很好的识别。
建立svm机器学习识别验证模块(我创建的pdsi包,包含此模块).
引入该模块函数:from pdsi import cropimage,clrfiles,get_feature, svm_model_test,在get_vcode函数加入相应语句即可识别。见下面:
2、验证码与对应登录网站的地址不一致。
zxjt有两个交易登录界面:newetrade.csc108.com、https://newetradesh.csc108.com,分别对应两个验证码地址。现有的tushare中trade.py模块错位了:将https://newetrade.csc108.com登录界面,使用的却是https://newetradesh.csc108.com/commons/image.jsp的验证码。
以下语句中红色部分为改进代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#--------------------这个是改后的tushare/trader/utils.py文件
'''
Created on 2016年10月1日
@author: Jimmy Liu
@group : waditu
@contact: [email protected]
'''
import sys
sys.path.append(r"d:/pdsi")
from pdsi import cropimage,clrfiles,get_feature, svm_model_test
import os
import json
import time
import six
from tushare.trader import vars as vs
import pandas as pd
def nowtime_str():
return time.time() * 1000
def get_jdata(txtdata):
txtdata = txtdata.content
if six.PY3:
txtdata = txtdata.decode('utf-8')
jsonobj = json.loads(txtdata)
return jsonobj
def get_vcode(broker, res):
from PIL import Image
import pytesseract as pt
import io
if broker == 'csc':
imgdata = res.content
img = Image.open(io.BytesIO(imgdata)).convert("1")
img.save(r'd:/pdsi/img/imgs/0image.png')
#print(type(img),img)
#vcode = pt.image_to_string(img)
#print("vcodetype",vcode)
clrfiles(r'./img/img_split/')
cropimage(img,0,4)
df_a=pd.DataFrame()
for imgname in os.listdir('d:/pdsi/img/img_split/'):
aa=get_feature(Image.open('d:/pdsi/img/img_split/'+str(imgname)))
aa.insert(0,"2")
df_a=df_a.append([aa])
df_a.to_csv(r'./img/last_test_pix_xy_new.txt', index=False, sep=r' ', header=False)
aaa=svm_model_test()
print('验证码类型', type(aaa), aaa)
vcode=aaa
return vcode
另外:tushare/trader/trader.py文件中也有误,
def login(self):
self.s.headers.update(vs.AGENT)
self.s.get(vs.CSC_PREFIX % (vs.P_TYPE['https'], vs.DOMAINS['csc'],
vs.PAGES['csclogin']))
res = self.s.get(vs.V_CODE_URL%(vs.P_TYPE['https'],
vs.DOMAINS['csc'],#原来的是cscsh,登录的是:newetrader.csc108.com网站,但取的图片却是newetrade.csc108sh.com页面的验证码,造成不能登录。
vs.PAGES['vimg']))
if self._login(utils.get_vcode('csc', res)) is False:
print('请确认账号或密码是否正确 ,或券商服务器是否处于维护中。 ')
self.keepalive()
tushare软件包,trader/trader.py中,验证码图片地址的res语句中,因登录界面登录的是newetrader.csc108.com(不是另一个网站newetradersh.csc108.com),vs.DOMAINS['cscsh']必须改为vs.DOMAINS['CSC']。
特别注意:
如果登录的是newetradersh.csc108.com,那么对应的验证码地址也是:newetradersh.csc108.com/commons/image.jsp
http://blog.sina.com.cn/s/blog_512d07ad0102wwbn.html