Python学习笔记之抓取某只基金历史净值数据实战案例


Posted in Python onJune 03, 2019

本文实例讲述了Python抓取某只基金历史净值数据。分享给大家供大家参考,具体如下:

http://fund.eastmoney.com/f10/jjjz_519961.html

Python学习笔记之抓取某只基金历史净值数据实战案例

1、接下来,我们需要动手把这些html抓取下来(这部分知识我们之前已经学过,现在不妨重温)

# coding: utf-8
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
from bs4 import BeautifulSoup
from threading import Thread,Lock
import os
import csv
# 下面是利用 selenium 抓取html页面的代码
# 初始化函数
def initSpider():
  driver = webdriver.PhantomJS(executable_path=r"你phantomjs可执行文件的绝对路径")
  driver.get("http://fund.eastmoney.com/f10/jjjz_519961.html") # 要抓取的网页地址
  # 找到"下一页"按钮,就可以得到它前面的一个label,就是总页数
  getPage_text = driver.find_element_by_id("pagebar").find_element_by_xpath(
    "div[@class='pagebtns']/label[text()='下一页']/preceding-sibling::label[1]").get_attribute("innerHTML")
  # 得到总共有多少页
  total_page = int("".join(filter(str.isdigit, getPage_text)))
  # 返回
  return (driver,total_page)
# 获取html内容
def getData(myrange,driver,lock):
  for x in myrange:
    # 锁住
    lock.acquire()
    tonum = driver.find_element_by_id("pagebar").find_element_by_xpath(
      "div[@class='pagebtns']/input[@class='pnum']") # 得到 页码文本框
    jumpbtn = driver.find_element_by_id("pagebar").find_element_by_xpath(
      "div[@class='pagebtns']/input[@class='pgo']") # 跳转到按钮
    tonum.clear() # 第x页 输入框
    tonum.send_keys(str(x)) # 去第x页
    jumpbtn.click() # 点击按钮
    # 抓取
    WebDriverWait(driver, 20).until(lambda driver: driver.find_element_by_id("pagebar").find_element_by_xpath("div[@class='pagebtns']/label[@value={0} and @class='cur']".format(x)) != None)
    # 保存到项目中
    with open("../htmls/details/{0}.txt".format(x), 'wb') as f:
      f.write(driver.find_element_by_id("jztable").get_attribute("innerHTML").encode('utf-8'))
      f.close()
    # 解锁
    lock.release()
# 开始抓取函数
def beginSpider():
  # 初始化爬虫
  (driver, total_page) = initSpider()
  # 创建锁
  lock = Lock()
  r = range(1, int(total_page)+1)
  step = 10
  range_list = [r[x:x + step] for x in range(0, len(r), step)]  #把页码分段
  thread_list = []
  for r in range_list:
    t = Thread(target=getData, args=(r,driver,lock))
    thread_list.append(t)
    t.start()
  for t in thread_list:
    t.join() # 这一步是需要的,等待线程全部执行完成
  print("抓取完成")
# #################上面代码就完成了 抓取远程网站html内容并保存到项目中的 过程

需要说明一下这3个函数:

initSpider函数,初始化了selenium的webdriver对象,并且先获取到我们需要抓取页面的总页码数。
getData函数,有3个参数,myrange我们还是要分段抓取,之前我们学过多进程抓取,这里我们是多线程抓取;lock参数用来锁住线程的,防止线程冲突;driver就是我们在initSpider函数中初始化的webdriver对象。
getData函数中,我们循环myrange,把抓取到的html内容保存到了项目目录中。
beginSpider函数,我们在此函数中给总页码分段,并且创建线程,调用getData

所以最后执行:

beginSpider()

就开始抓取 http://fund.eastmoney.com/f10/jjjz_519961.html 这个基金的”历史净值明细”,共有31个页面。

Python学习笔记之抓取某只基金历史净值数据实战案例

2、根据已经学过的python和mysql交互的知识,我们也可以再把这些数据 写入到数据表中。

这里就不再赘述,给出基金详细表结构:

CREATE TABLE `fund_detail` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `fcode` varchar(10) NOT NULL DEFAULT '' COMMENT '基金代码',
 `fdate` datetime DEFAULT NULL COMMENT '基金日期',
 `NAV` decimal(10,4) DEFAULT NULL COMMENT '单位净值',
 `ACCNAV` decimal(10,4) DEFAULT NULL COMMENT '累计净值',
 `DGR` varchar(20) DEFAULT NULL COMMENT '日增长率',
 `pstate` varchar(20) DEFAULT NULL COMMENT '申购状态',
 `rstate` varchar(20) DEFAULT NULL COMMENT '赎回状态',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='基金详细数据表';

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python基于xml parse实现解析cdatasection数据
Sep 30 Python
通过Python 获取Android设备信息的轻量级框架
Dec 18 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
python中的单引号双引号区别知识点总结
Jun 23 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
opencv 阈值分割的具体使用
Jul 08 Python
python写文件时覆盖原来的实例方法
Jul 22 Python
python 爬取免费简历模板网站的示例
Sep 27 Python
如何用Django处理gzip数据流
Jan 29 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 #Python
Python3 实现文件批量重命名示例代码
Jun 03 #Python
我就是这样学习Python中的列表
Jun 02 #Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 #Python
python实现感知机线性分类模型示例代码
Jun 02 #Python
python调用摄像头拍摄数据集
Jun 01 #Python
Python OpenCV实现视频分帧
Jun 01 #Python
You might like
用PHP生成静态HTML速度快类库
2007/03/18 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
关于JavaScript中string 的replace
2013/04/12 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
js跨域请求数据的3种常用的方法
2015/12/01 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
vue-router路由参数刷新消失的问题解决方法
2017/06/17 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
js this 绑定机制深入详解
2020/04/30 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
[19:26]TNC vs EG (BO3)
2018/06/07 DOTA
Python3读取文件常用方法实例分析
2015/05/22 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
python实现决策树分类算法
2017/12/21 Python
python在文本开头插入一行的实例
2018/05/02 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
2018/06/01 Python
Python中super函数用法实例分析
2019/03/18 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
Java提供了哪些企业应用编程接口
2015/02/13 面试题
企业统计员岗位职责
2013/12/13 职场文书
后勤人员岗位职责
2013/12/17 职场文书
项目投资合作意向书
2014/07/29 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
2015年环保局工作总结
2015/05/22 职场文书
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers