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 相关文章推荐
PyQt5每天必学之像素图控件QPixmap
Apr 19 Python
python3模块smtplib实现发送邮件功能
May 22 Python
Python使用sax模块解析XML文件示例
Apr 04 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
python打包exe开机自动启动的实例(windows)
Jun 28 Python
python自动化工具之pywinauto实例详解
Aug 26 Python
基于Python实现拆分和合并GIF动态图
Oct 22 Python
Python进程Multiprocessing模块原理解析
Feb 28 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
Mar 09 Python
python为什么会环境变量设置不成功
Jun 23 Python
Python用access判断文件是否被占用的实例方法
Dec 17 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 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类常量的使用详解
2013/06/08 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
PHP Header用于页面跳转时的几个注意事项
2016/10/21 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
大家未必知道的Js技巧收藏
2008/04/07 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
jQuery Easyui快速入门教程
2016/08/21 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
python各种语言间时间的转化实现代码
2016/03/23 Python
Python面向对象之继承和多态用法分析
2019/06/08 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
Happy Socks英国官网:购买五颜六色的袜子
2020/11/03 全球购物
青年志愿者事迹材料
2014/02/07 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
德语专业求职信
2014/03/12 职场文书
横幅标语大全
2014/06/17 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
2015年小学数学教师个人工作总结
2015/05/25 职场文书
入党转正介绍人意见
2015/06/03 职场文书
修辞手法有哪些?
2019/08/29 职场文书
字节飞书面试promise.all实现示例
2022/06/16 Javascript