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读写Json涉及到中文的处理方法
Sep 12 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
Python用 KNN 进行验证码识别的实现方法
Feb 06 Python
python中abs&map&reduce简介
Feb 20 Python
python2 与 python3 实现共存的方法
Jul 12 Python
对web.py设置favicon.ico的方法详解
Dec 04 Python
对json字符串与python字符串的不同之处详解
Dec 19 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
python pygame实现挡板弹球游戏
Nov 25 Python
python实现三壶谜题的示例详解
Nov 02 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 Python
Python 中面向接口编程
May 20 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安装为Apache DSO
2006/10/09 PHP
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
集合Bootstrap自定义confirm提示效果
2017/09/19 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
如何将python中的List转化成dictionary
2016/08/15 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
django 读取图片到页面实例
2020/03/27 Python
世界最大域名注册商:GoDaddy
2016/07/24 全球购物
宣传活动总结范文
2014/07/01 职场文书
护士2014年终工作总结
2014/11/11 职场文书
销售2014年度工作总结
2014/12/08 职场文书
2015最新民情日记范文
2015/06/26 职场文书
高中运动会广播稿
2015/08/19 职场文书
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技