版权声明:本文为博主原创文章,如果转载请给出原文链接: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 条评论 - Python爬虫抓取基金数据分析、预测系统设计与实现