云诺说 - 小程序定制 - 广告营销
当前位置: 商业源码 > Python爬虫抓取基金数据分析、预测系统设计与实现

Python爬虫抓取基金数据分析、预测系统设计与实现

2020-03-03 08:09 分类:商业源码 作者:云诺 阅读(47)

版权声明:本文为博主原创文章,如果转载请给出原文链接:http://doofuu.com/article/4156231.html

目前在开发一款基于Python的基金爬取、分析、预测系统,目前已经开发到90%了。借助周末有时间,记录下开发过程中遇到的坑和自己的项目总结。

这篇文章主要介绍了Python抓取某只基金历史净值数据案例,结合具体实例形式分析了Python基于BeautifulSoup库的数据抓取及mysql交互相关实现技巧,需要的朋友可以参考下。

Python做网络爬虫需要学习额外基本知识:
        1.HTML。基金所需的数据都通过HTML网页的形式返回,数据和HTML tag通过一定的规范组成渲染后的形成网页。了解HTML是为了有效地剥离数据。
        2.Python的正则表达式。正则表达式对文字的筛选效率十分高。上面已经说明数据需要剥离,而正则表达式正为了完成这项工作。正则表达式一定要学,不然所有东西都白搭。同时这个也是最繁复的,需要根据结果适当调整正则表达式。
        3.报文的格式及类型,为了得到需要的数据,我们需要向服务器提出请求。有的请求设置需要使用到POST的知识,如向学校教务网站登陆等等。但是这里用不上,做爬虫这个点迟早会用上,要多多钻研。
好了先来看看Python爬取基金的核心代码吧!

# -*- coding: utf-8 -*-
'''
使用selenium模拟翻页
使用beautifulsoup解析网页
使用sqlacheme存储入库
'''
import os
import io
from datetime import datetime
from common.config import dburl
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from mappers.Fund import Myfund
from common.function import getText
engine = create_engine(dburl,echo=True)

##获取基金每一页的数据,并且写入到文件当中
def getFundhtml():
    # 初始化selenium
    driver = webdriver.PhantomJS()
    driver.get('http://fund.eastmoney.com/fund.html')
    totalpage = getPageTotal(driver)
    getData(driver, 1, totalpage)
##获取总的页数
def getPageTotal(driver):
    getTotalPage_text = driver.find_element_by_id("pager").find_element_by_xpath("span[@class='nv']").text
    total_page = ''.join(filter(str.isdigit, getTotalPage_text))  ##得到一共是多少页数
    return int(total_page)
##获取分页,并将每一页的数据写进htmls文件夹中
def getData(driver,start,end):
    for x in range(start,end+1):
        tonum=driver.find_element_by_id("tonum")#得到跳转输入框
        jumbtn=driver.find_element_by_id("btn_jump")#跳转得到按钮
        tonum.clear()
        tonum.send_keys(str(x))#发送跳转页数
        jumbtn.click()#模拟点击确定跳转按钮
        #判断找到某页成功的标志
        WebDriverWait(driver,30).until(lambda driver:driver.find_element_by_id('pager').find_element_by_xpath("span[@value={0} and @class!='end page']".format(x)).get_attribute(
            'class').find("at") != -1)
        #写入文件中
        with io.open(os.path.abspath('..')+"\htmls\{0}.txt".format(x),'wb') as f:
            ##只抓取表格部分,方便beautifulsoup解析数据
            f.write(driver.find_element_by_id("tableDiv").get_attribute("innerHTML").encode('utf-8'))
            f.close()

def SoupFundData(html):
    #读取htmls文件夹的每一个文件
        soup=BeautifulSoup(html,'html.parser')
        fCodes = soup.find("table", id="oTable").tbody.find_all("td", "bzdm")  # 基金编码集合
        fDate = soup.find("table", id="oTable").thead.find("td", colspan='2').get_text()  # 基金日期
        ##获取基金代码
        result=[]
        for fCode in fCodes:
            result.append({"fcode": fCode.get_text()
                              , "fname": fCode.next_sibling.find("a").get_text()
                              , "NAV": getText(fCode.next_sibling.next_sibling)
                              , "ACCNAV": getText(fCode.next_sibling.next_sibling.next_sibling)
                              , "DGV": fCode.parent.find("td", "rzzz").get_text()  # 日增长值,取fcode所在的父元素(tr),然后find
                              , "DGR": fCode.parent.find("td", "rzzl").get_text()  # 日增长率
                              , "fee": getText(fCode.parent.find("div", "rate_f"))  # 费率,注意这里不要定位到A元素,有的基金没有这个div,所以要做判断
                              , "updatetime": datetime.now().isoformat(sep=' ')
                              , "fdate": fDate}
                          )
       ##返回每一页的数据集
        return result

def SaveDb():
    ##抓取文件的路径
    datadir='./htmls'
    allpath=os.listdir(datadir)
    ##初始化数据库连接
    mysession = sessionmaker(bind=engine)()
    dataList=[]
    for filename in allpath:
        if os.path.isfile(os.path.join(datadir, filename)):
            ##读取抓取的文本文件
            with io.open(os.path.join(datadir,filename), "r",encoding='UTF-8') as file:
                fileCnt = file.read()
                file.close()
            resultSet=SoupFundData(fileCnt)
            for result in resultSet:
                myfund = Myfund(**result)
                ##构造数据库实体化对象列表,方便批量插入
                dataList.append(myfund)
    #批量插入
    mysession.add_all(dataList)  # 批量新增
    mysession.commit()
    mysession.close()

目前是把爬取的数据存放在txt文件了,下片博文我会数据存放在Mysql中。

 

祝生活愉快!

「创作不易,你的支持是本站持续更新最大的动力!」

赞(0) 打赏

谢谢你请我喝奶茶*^_^*

支付宝
微信
1

谢谢你请我喝奶茶*^_^*

支付宝
微信

上一篇:

下一篇:

共有 0 条评论 - Python爬虫抓取基金数据分析、预测系统设计与实现

博客简介

云诺说是一个致力于分享互联网编程技术交流、小程序开发、小程序源码分享、网络推广引流服务、推荐优质的引流渠道、广告开户、竞价推广等行业的IT技术网站,希望你能在本站得到你所需要的信息。

Q Q :2730094141

微信 :LGY17666

职业 :小程序开发、网络推广

现居 :广东省-广州市-天河区

友情链接

欢迎与本博客交换友情链接,本博客对交换链接的网站没有要求。如果您是本博客的友情链接网站,在遇到网站运行问题时,可以随时联系,我们将免费提供技术类支持! 申请交换友链

站点统计

  • 文章总数:108 篇
  • 草稿数目:0 篇
  • 分类数目:14 个
  • 独立页面:118 个
  • 评论总数:0 条
  • 访问总量: 37908次
  • 最近更新:2020年04月08日