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常用知识梳理(必看篇)
Mar 23 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
python虚拟环境完美部署教程
Aug 06 Python
python可视化篇之流式数据监控的实现
Aug 07 Python
wxpython绘制圆角窗体
Nov 18 Python
Python和Sublime整合过程图示
Dec 25 Python
Python telnet登陆功能实现代码
Apr 16 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
Apr 16 Python
解决pycharm安装第三方库失败的问题
May 09 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
如何理解Python中的变量
Jun 01 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 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
Ping服务的php实现方法,让网站快速被收录
2012/02/04 PHP
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
php函数mkdir实现递归创建层级目录
2016/10/27 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
js 弹出菜单/窗口效果
2011/10/30 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
python 自动去除空行的实例
2018/07/24 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
深入浅析Python代码规范性检测
2020/07/31 Python
jupyter 添加不同内核的操作
2021/02/06 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
*p++ 自增p 还是p所指向的变量
2016/07/16 面试题
医院护士求职自荐信格式
2013/09/21 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
房屋继承公证书
2014/04/10 职场文书
建筑投标担保书
2014/05/20 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
明星邀请函
2015/02/02 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
关于的python五子棋的算法
2022/05/02 Python