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使用django获取用户IP地址的方法
May 11 Python
Python多进程分块读取超大文件的方法
Apr 13 Python
centos6.7安装python2.7.11的具体方法
Jan 16 Python
wxPython的安装与使用教程
Aug 31 Python
详解python中TCP协议中的粘包问题
Mar 22 Python
Python3安装pip工具的详细步骤
Oct 14 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
Python-for循环的内部机制
Jun 12 Python
Python SMTP配置参数并发送邮件
Jun 16 Python
pytorch SENet实现案例
Jun 24 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 Python
python 解决微分方程的操作(数值解法)
May 26 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
Win下如何安装PHP的APC拓展
2013/08/07 PHP
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
php实现微信模板消息推送
2018/03/30 PHP
DWR Ext 加载数据
2009/03/22 Javascript
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
详解jenkins自动化部署vue
2019/05/14 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
原生JS实现留言板
2020/03/26 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
使用python绘制人人网好友关系图示例
2014/04/01 Python
Python专用方法与迭代机制实例分析
2014/09/15 Python
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
python 开发的三种运行模式详细介绍
2017/01/18 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
使用python 3实现发送邮件功能
2018/06/15 Python
会计系毕业个人自荐信格式
2013/09/23 职场文书
升职自荐信
2013/11/28 职场文书
物理力学求职信
2014/02/18 职场文书
中考冲刺决心书
2014/03/11 职场文书
洗车工岗位职责
2014/03/15 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android