在学习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文件
扫描二维码关注公众号,回复: 2868928 查看本文章 -
'''
-
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()
[python] view plain copy
- <code class="language-python">tushare软件包,trader/trader.py中,验证码图片地址的res语句中,因登录界面登录的是newetrader.csc108.com(不是另一个网站newetradersh.csc108.com),vs.DOMAINS['cscsh']必须改为vs.DOMAINS['CSC']。</code>
特别注意:
如果登录的是newetradersh.csc108.com,那么对应的验证码地址也是:newetradersh.csc108.com/commons/image.jsp