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中使用sort()方法进行排序的简单教程
May 21 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
python版大富翁源代码分享
Nov 19 Python
python在回调函数中获取返回值的方法
Feb 22 Python
python利用7z批量解压rar的实现
Aug 07 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
python中@property和property函数常见使用方法示例
Oct 21 Python
解决Django Haystack全文检索为空的问题
May 19 Python
Python如何在main中调用函数内的函数方式
Jun 01 Python
Python学习之迭代器详解
Apr 01 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的FTP学习(二)[转自奥索]
2006/10/09 PHP
php下使用以下代码连接并测试
2008/04/09 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
php测试kafka项目示例
2020/02/06 PHP
JS的数组的扩展实例代码
2008/07/09 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
2014/06/12 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
python 文件和路径操作函数小结
2009/11/23 Python
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
python列表操作之extend和append的区别实例分析
2015/07/28 Python
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
Python切换pip安装源的方法详解
2016/11/18 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
详解python 3.6 安装json 模块(simplejson)
2019/04/02 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
RIP版本1跟版本2的区别
2013/12/30 面试题
考博自荐信
2013/10/25 职场文书
2015年党性分析材料
2014/12/19 职场文书
2016春节家属慰问信
2015/03/25 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
论文致谢词范文
2015/05/14 职场文书
行政处罚告知书
2015/07/01 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
vue3使用vue-router的完整步骤记录
2021/06/20 Vue.js
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android