def readFundData(): funds = [] sum = 0 print("readFundData begin: " + time.strftime("%H:%M:%S")) with open(FUND_DATA_FILE) as file: while True: line = file.readline() if not line: log_write(FUND_DATA_FILE + "not data") break sum += 1 # if sum > 100: # break f = Fund('') date = '' val = 0.0 for i, v in enumerate(line.split()): if i == 0: f.setCode(v) elif i == 1: f.setName(v) else: if i % 2 == 0: date = v else: val = float(v) f.addValue(date, val) funds.append(f) print("readFundData end: " + time.strftime("%H:%M:%S")) return funds
def main(): log_write("start------------------------->") print(time.strftime("%H:%M:%S") + ":start...") #基金推荐 # history_datas = data_base.readHistoryDatas() # tmp = data_base.getCurrentData() # data_base.saveCurrentData(tmp) # cur_datas = data_base.readCurrentData() # funds = analysis.deleteErrData(history_datas, cur_datas, "2017-09-01") # analysis.fundRecommand(funds, 0.5) # 基金提醒 # time_thresh = datetime.datetime.strptime("22:00:00", "%H:%M:%S") # while True: # cur_time = datetime.datetime.strptime(time.strftime("%H:%M:%S"), "%H:%M:%S") # if cur_time > time_thresh: # cur_datas = data_base.getCurrentData() # # cur_datas = data_base.readCurrentData() # data_base.saveCurrentData(cur_datas) # usr_datas = data_base.readUsrData() # err, loss, sale = analysis.fundRemind(cur_datas, usr_datas) # content = analysis.formatText(err, loss, sale) # print(content) # sendEmail(content) # break # else: # time.sleep(60) # pass mysql_operate.insertCurrentData() mysql_operate.insertHistoryWorth() log_write("---------------------------->end") print(time.strftime("%H:%M:%S") + ":finish")
def insertHistoryWorth(): connection = pymysql.connect(host='127.0.0.1', port=3306, user='******', password='', db='fund_db', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor) cursor = connection.cursor() #查询总共有多少只基金 sql = "SELECT code FROM funds" cursor.execute(sql) codes = cursor.fetchall() print(time.strftime("%H:%M:%S") + ': ' + "start insert history data") number = 0 for c in codes: code = c['code'] number += 1 if number < 564: continue datas = data_base.getHistoryData(code) if len(datas) == 0: log_write('error code: ' + code) else: for j in range(len(datas)): day = datas[j][0] #日期 worth = float(datas[j][1]) #单位净值 total_worth = float(datas[j][2]) #累计净值 # 查询判断是否有存在 sql = "SELECT id FROM funds_info WHERE code='{}' AND day='{}'".format( code, day) cursor.execute(sql) # 插入数据 r = cursor.fetchone() if r: pass else: # 创建sql 语句,并执行 sql = "INSERT IGNORE INTO `funds_info` ( `code`, `day`, `worth`, `total_worth`, `create_time`) VALUES ('{}','{}', {}, {}, '{}')".format( code, day, worth, total_worth, time.strftime("%Y-%m-%d %H:%M:%S")) cursor.execute(sql) # 提交SQL connection.commit() print( time.strftime("%H:%M:%S") + ': ' + code + " number = " + str(number)) # 关闭数据连接 connection.close()
def saveHistoryDatas(cur_datas): for i in range(2495, len(cur_datas)): code = cur_datas[i][1] datas = getHistoryData(code) if len(datas) == 0: log_write('error code: ' + code) else: f = open(DATA_PATH + str(i + 1) + ".txt", 'a') for j in range(len(datas)): f.write(code + ' ') #基金代码 f.write(datas[j][0] + ' ') #日期 f.write(datas[j][1] + ' ') #单位净值 f.write(datas[j][2] + '\n') #累计净值 f.close() print(time.strftime("%H:%M:%S") + ': ' + str(i + 1)) time.sleep(0.1)
def readUsrData(): k = 0 datas = [] with open(USR_PURCHASE_FILE) as file: while True: line = file.readline() if not line: log_write(USR_PURCHASE_FILE + " not data") break k += 1 #["基金代码", "基金名称", "买入日期", "买入净值", "预设跌幅", "预设涨幅"] data = [' '] * 6 for i, v in enumerate(line.split()): data[i] = v if k > 1: datas.append(data) return datas
def fundRemind(cur_datas, usr_datas): # values = usr_datas.deepcopy() values = usr_datas.copy() for i in range(len(usr_datas)): code = usr_datas[i][0] flag = False for j in range(len(cur_datas)): if code == cur_datas[j][1]: values[i].append(cur_datas[j][3]) flag = True break if not flag: values[i].append("--") log_write(code + "can't find!") #数据分析 error = [] #出现错误 loss = [] #损失 sale = [] #可卖出 for i in range(len(values)): if values[i][6] == "--": values[i].append("--") error.append(values[i]) continue cur_value = float(values[i][6]) pre_value = float(values[i][3]) ratio = (cur_value - pre_value)/pre_value loss_ratio = float(values[i][4]) sale_ratio = float(values[i][5]) if ratio < loss_ratio: values[i].append(str(ratio)) loss.append(values[i]) if ratio > sale_ratio: values[i].append(str(ratio)) sale.append(values[i]) # ["基金代码", "基金名称", "买入日期", "买入净值", "预设跌幅", "预设涨幅", "当前涨跌幅度"] return error, loss, sale
def getHistoryData(code): datas = [] url = "http://info.chinafund.cn/fund/" + code + "/jjjz/" # r = requests.get(url) # #如果网址重定向 # if r.url != url or r.status_code != 200: # log_write("open " + url + " fail, status_code = " + str(r.status_code)) # print(r.status_code) # return datas # if r.encoding == 'ISO-8859-1': # encodings = requests.utils.get_encodings_from_content(r.text) # if encodings: # encoding = encodings[0] # else: # encoding = r.apparent_encoding # html_doc = r.content.decode(encoding, 'replace') #网站交互 # browser = webdriver.Chrome(abspath) browser = webdriver.Chrome(abspath, chrome_options=chrome_options) browser.implicitly_wait(30) try: browser.get(url) except TimeoutException: print(code + ": Time out") log_write(code + ": Time out") return datas error = False if browser.current_url != url: error = True print(url + "url redirection") else: try: date = browser.find_element_by_id("startdate") date.clear() date.send_keys("2017-01-01") browser.find_element_by_id("Button1").click() html_doc = browser.page_source except NoSuchElementException: error = True print("No element") log_write(code + ": No element") browser.quit() if error: return datas soup = BeautifulSoup(html_doc, 'lxml') trs = soup.find_all(id='lsjz') if len(trs) == 0: return datas else: tr = trs[0].find_all('tr') for i in range(1, len(tr)): tds = tr[i].find_all('td') data = [''] * 3 # 初始化data data[0] = tds[0].get_text() #日期 data[1] = tds[1].get_text() #单位净值 data[2] = tds[2].get_text() #累计净值 datas.append(data) # for i in range(len(tr)-1): # print(datas[i]) return datas