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 相关文章推荐
用pywin32实现windows模拟鼠标及键盘动作
Apr 22 Python
python使用PyGame模块播放声音的方法
May 20 Python
Django的数据模型访问多对多键值的方法
Jul 21 Python
Python时间模块datetime、time、calendar的使用方法
Jan 13 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
Python 模块EasyGui详细介绍
Feb 19 Python
Python实现的单向循环链表功能示例
Nov 10 Python
python使用生成器实现可迭代对象
Mar 20 Python
pandas to_excel 添加颜色操作
Jul 14 Python
解决导入django_filters不成功问题No module named 'django_filter'
Jul 15 Python
基于opencv的selenium滑动验证码的实现
Jul 24 Python
使用pandas生成/读取csv文件的方法实例
Jul 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
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
php curl的深入解析
2013/06/02 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
csdn 批量接受好友邀请
2009/02/19 Javascript
javascript 变量作用域 代码分析
2009/06/26 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
python3.8下载及安装步骤详解
2020/01/15 Python
python能否java成为主流语言吗
2020/06/22 Python
详解Anaconda 的安装教程
2020/09/23 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
草莓网官网:StrawberryNET
2019/08/21 全球购物
介绍一下write命令
2012/09/24 面试题
法律专业个人实习自我鉴定
2013/09/23 职场文书
临床医学专业毕业生的自我评价
2013/10/17 职场文书
车辆安全检查制度
2014/01/12 职场文书
节约用水的口号
2014/06/20 职场文书
讲党性心得体会
2014/09/03 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
聘任书范文大全
2015/09/21 职场文书
公司董事任命书
2015/09/21 职场文书
php将xml转化对象的实例详解
2021/11/17 PHP
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android