【Python】Selenium辅助海量基金数据获取

今天主要给大家介绍一下Selenium测试工具,它是一款浏览器测试专用的工具,能够模拟用户对浏览器进行鼠标点击、页面滑动等功能。一方面能够用于网页测试,另一方面能够辅助网页内容爬取(例如通过滑动页面置底通过Ajax自动加载的页面内容,或通过点击Button才能下载的内容等)。

本文主要介绍Selenium辅助海量基金数据的获取。以腾讯证券为例进行说明(网址:http://stockhtm.finance.qq.com/fund/jzzx/index.htm),对应页面如下所示:

通过上图可以看到,我们需要在页面输入历史数据对应的时间,以及按键“输出到EXCEL”才能导出对应的历史数据。需要使用Selenium,(1)找到历史数据的context控件,输入对应的时间;(2)找到“输出到EXCEL”的Button控件名,并按下Button控件。

  1. HTML页面查看,找到各控件名称(Context对应"textfield",Button对应"Submit02")
  1. 获取2017年3-8月半年的基金数据。得到各日期,针对每一天进行输入日期、导出数据到Excel操作。
    elem = driver.find_element_by_name("textfield") #通过id找到日期输入框的
    elem.clear() #内容清空
    elem.send_keys(date) #date是输入的日期
    elem1 = driver.find_element_by_name("Submit01") #确定输入的日期
    action1 = ActionChains(driver).move_to_element(elem1)
    action1.click(elem1)
    action1.perform()
    elem2 = driver.find_element_by_name("Submit02") #导出数据到excel
    action2 = ActionChains(driver).move_to_element(elem2)
    action2.click(elem2)
    action2.perform()

3. 数据可视化,通过使用baidu的echart工具,对获取的数据进行可视化展示。

(1)所有基金增长每日总量的变化趋势图:可以看出八月份(最后三十天)基金大幅度增长

(2)每天增长的基金数量占所有基金比例的变化趋势,可以看出80-144天时超过半数的基金在涨。

(3)每天所有基金价格增长的总和如下:

代码附录:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
dates = []
Stri = "20170"
Mon = [1,3,5,7,8]
for i in range(3,9):
    if i in Mon:
        N = 31
    else:
        N = 30
    for j in range(1,N+1):
        if j <10:
            tmpS = '0'+str(j)
        else:
            tmpS = str(j)
        dates.append(Stri+str(i)+tmpS)
driver = webdriver.Chrome()
driver.get("http://stockhtm.finance.qq.com/fund/jzzx/index.htm")
elem = driver.find_element_by_name("textfield")
for dat in dates:
    elem.clear()
    elem.send_keys(dat)
    elem1 = driver.find_element_by_name("Submit01")
    action1 = ActionChains(driver).move_to_element(elem1)
    action1.click(elem1)
    action1.perform()
    elem2 = driver.find_element_by_name("Submit02")
    action2 = ActionChains(driver).move_to_element(elem2)
    action2.click(elem2)
    action2.perform()
# -*- coding: utf-8 -*-
import os
import numpy as np
import pandas as pd
from pyecharts import Line
def Getfile(dirName):
    '''
    获取文件夹数据
    '''
    files = os.listdir(dirName)
    return files
def ReName(path,files):
    '''
    文件重命名
    '''
    for f in files:
        os.rename(dirName+f,dirName+f[9:])
def PlotLine(line,datx,daty,Marker):
    '''
    绘制线型图像
    '''
    #line = Line(Title)
    line.add(Marker,datx,daty, mark_point=["average","max"])
    #return line
    #line.show_config()
    #line.render()
def CalIncRate(NewFiles):
    '''
    计算每日增长基金占比
    '''
    dayInc = []
    dayIncVal = []
    mk = 0
    for f in NewFiles:
        mk += 1
        print mk
        data = pd.read_html(dirName+f)
        Inc = data[0][5][1:]
        IncVal = map(float,data[0][4][1:])
        dayIncVal.append(sum(IncVal))
        cnt = 0
        for rate in Inc:
            if float(rate) > 0:
                cnt += 1
        dayInc.append(cnt/float(len(Inc)))
    return dayInc,dayIncVal,np.cumsum(dayIncVal)
def CalIncNum(NewFiles):
    '''
    计算每日总基金增长点
    '''
    dayIncNum = []
    return dayIncNum
dirName = u'./股票型基金/'
NewFiles = Getfile(dirName)
dayInc,dayIncVal,dayIncCum = CalIncRate(NewFiles)
line = Line("每日增长基金占比","3月-8月")
PlotLine(line,range(len(dayInc)),dayInc,"比例")
line.show_config()
line.render('h1.html')
line = Line("每日基金增长总量","3月-8月")
PlotLine(line,range(len(dayInc)),dayIncVal,"增长量")
line.show_config()
line.render('h2.html')
line = Line("基金累计增长总量","3月-8月")
PlotLine(line,range(len(dayInc)),list(dayIncCum),"增长累积量")
line.show_config()
line.render('h3.html')

原文发布于微信公众号 - CodeInHand(CodeInHand)

原文发表时间:2018-01-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程微刊

如何获取公众号里面的歌曲

2.2K4
来自专栏腾讯社交用户体验设计

那些年苹果做错的设计

1303
来自专栏web前端教室

零基础想要学好前端开发,必须先“学好切图做静态页面”

开头第一句,这个文章针对的是零基础学员。 WEB前端开发,是用JS来操作DOM和DATA,响应用户的操作,实现前端的交互,包括更新view和ui以及更多。 Do...

2306
来自专栏跟着阿笨一起玩NET

简单实现ToolStripMenuItem(菜单栏)的单选效果

这几天在写又拍云的客户端,老实说确实学到了不少东西!接下来的几天我会把一些技巧或者原来没有接触过的一些东西发上来,算是复习吧!

1782
来自专栏逍遥剑客的游戏开发

Valve: The Lab Renderer for Unity

4647
来自专栏问天丶天问

Jquery使用echarts饼图

1581
来自专栏java一日一条

为Web开发者准备的10个最新工具

Web开发设计是一个很有前途的职业。然而,这其中也有许多挑战。现在的企业和品牌正在朝网络进军。这给了web开发者非常多的机会来展示他们的技能,并在他们的职业上取...

1423
来自专栏针针小站

【Zhen】针针小站App – Powered by Fusion App

2445
来自专栏Android先生

Android手机 全面屏(18:9屏幕)适配指南

从小米MIX 1发布以来,越来越多所谓“全面屏”手机发布,如三星S8,小米MIX2,VIVO X20,Google Pixel2等等...2017年下半年开始,...

4061
来自专栏无原型不设计

给你灵感的23个优秀线框原型图示例

如何在产品初始阶段以最快的方式展示设计思路?我想大多数的UX/UI设计人员都会倾向于快速构建一个线框原型图。这的确是一个非常明智的选择。那么问题来了,设计师如何...

8066

扫码关注云+社区

领取腾讯云代金券