一、安装selenium

基于Window操作系统

1.selenium库的安装

(需要先安装python3,这里就不详细说明)

  • 可在cmd上运行pip install selenium
  • 也可在pycharm工程目录下添加selenium库

2.下载对应的浏览器驱动

各大浏览器webdriver地址可参见:https://docs.seleniumhq.org/download/

浏览器

webdriver地址

Firefox

https://github.com/mozilla/geckodriver/releases/

Chrome

https://sites.google.com/a/chromium.org/chromedriver/ 或者 http://chromedriver.storage.googleapis.com/index.html

IE

http://selenium-release.storage.googleapis.com/index.html

3.webdriver的安装路径

  • (1)将下载解压后驱动文件放到python安装路径
    (若不知安装路径,可用where python命令查询)
  • (2)也可放到pycharm工程中的venv->Scripts中

(本人配置的是python3,
浏览器:火狐66.03(最新)
驱动:geckodriver-v0.24.0-win64.zip)

二、selenium的简单操作

天天基金网址: http://fund.eastmoney.com/

1. 基于firefox浏览器驱动打开天天基金网站;

待页面“基金排行”出现后,点击“基金排行”,进入排行页面。

python 天天基金获取净值数据 python天天基金自动交易_html

from selenium import webdriver

d = webdriver.Firefox()  #打开浏览器
d.get('http://fund.eastmoney.com/') #进入网页

# #点击基金排行
d.find_element_by_xpath("//li[@class='ph']/a").click()  #通过xpath元素定位
# click()方法模仿人工点击

为什么xpath是 “//li[@class=‘ph’]/a”
让我们来分析一下

python 天天基金获取净值数据 python天天基金自动交易_python_02

关于xpath的学习可参考 (转)python+selenium基础之XPATH定位(第一篇)

2. 进入排行页面后,在基金搜索框输入:00,并在弹出的下拉框中选择第四条基金,点击进入基金详情页面。

python 天天基金获取净值数据 python天天基金自动交易_selenium_03

d.switch_to.window(d.window_handles[1])  #切换句柄到当前页面
d.find_element_by_xpath("//input[@id='search-input']").clear()
d.find_element_by_xpath("//input[@id='search-input']").send_keys("00") #send_keys("00")模仿人工输入
# d.refresh()  #刷新页面
time.sleep(3)
#click()点击下拉菜单第四条信息
d.find_element_by_xpath("//tr[@data-submenu='590008']/td[@class='seaCol2']").click()

3.获取基金详情页面红框内容,并存入mysql数据库

python 天天基金获取净值数据 python天天基金自动交易_selenium_04

d.switch_to.window(d.window_handles[2])
#获取网页内容,并
bs = BeautifulSoup(d.page_source,'html.parser')
# 创建一个列表,将数据存储进去
InfoList = []
#获取基金代码
code = bs.find("span",{"class":"ui-num"}).text
# 获取基本基金信息
div = bs.find('div',{'class':'fundInfoItem'})
InfoList.append(code) # 将基金代码添加到列表中
dls = div.find_all('dl')
for dl in dls:
    dds = dl.find_all('dd')
    for i,dd in enumerate(dds):
        # print(dd)
        """
        dd 的内容如下:
        dd[0]  <dd class="dataNums"><dl class="floatleft">...... id="gz_gszzl">+0.15%</span></dl></dd>
        dd[1]  <dd><span>近1月:</span><span class="ui-font-middle ui-color-green ui-num">-4.45%</span></dd>
        dd[2]  <dd><span>近1年:</span><span class="ui-font-middle ui-color-green ui-num">-4.76%</span></dd>
        因为只有二、三才是我们所需的数据
        """
        if i == 1:
            span = dd.find_all('span')[1].string
            InfoList.append(span)
        if i == 2:
            span = dd.find_all('span')[1].string
            InfoList.append(span)

conn = pymysql.connect(host = 'localhost',user = 'root',password = '123456',port = 3306,db = 'mystudy',charset = 'utf8') # 数据库的连接
cursor = conn.cursor() # 创建游标
tablename = 'seleniumGetNews'
#数据存储操作
try:
    insertSql = "insert into {} values (%s,%s,%s,%s,%s,%s,%s)".format(tablename) #mysql语句
    cursor.execute(insertSql,InfoList)
except pymysql.err.ProgrammingError:
    #如果表不存在则创建。
    createSql = "create table {}(" \
                "基金代码 varchar(100) primary key ," \
                "近一月 varchar(100)," \
                "近一年 varchar(100)," \
                "近三月 varchar(100)," \
                "近三年 varchar(100)," \
                "近六月 varchar(100)," \
                "成立来 varchar(100))" \
                "ENGINE = InnoDB DEFAULT  CHARSET =utf8;".format(tablename)
    cursor.execute(createSql)
    cursor.execute(insertSql,InfoList)
conn.commit() #提交命令
cursor.close() #关闭游标
conn.close()  #关闭连接

4.将页面切换回首页(句柄切换)

d.switch_to.window(d.window_handles[0]) #关于页面句柄,在第三点的问题有提及
d.refresh() #刷新页面

三、遇到的问题

1. 从主窗口A跳转至主窗口B后,无法定位窗口B的元素的问题

原因:当启动脚本后,从页面A打开页面B后,窗口句柄(焦点)依旧停留在主页面A,所以无法定位页面B的元素,报错无当前元素,当跳转页面时。

python 天天基金获取净值数据 python天天基金自动交易_python_05

当我们打印句柄,输出的是列表,其中各代表各自的页面。
解决方法:将窗口句柄(焦点)切换到当前页面

d.switch_to.window(d.window_handles[1])