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中用函数作为返回值和实现闭包的教程
Apr 27 Python
Python常用库推荐
Dec 04 Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 Python
python一键去抖音视频水印工具
Sep 14 Python
python使用pdfminer解析pdf文件的方法示例
Dec 20 Python
pycharm的console输入实现换行的方法
Jan 16 Python
Python numpy中矩阵的基本用法汇总
Feb 12 Python
Python中的类与类型示例详解
Jul 10 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 Python
把vgg-face.mat权重迁移到pytorch模型示例
Dec 27 Python
python lambda函数及三个常用的高阶函数
Feb 05 Python
TensorFlow Autodiff自动微分详解
Jul 06 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 XML数据解析代码
2010/05/26 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
ES6 十大特性简介
2020/12/09 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
python基于SMTP协议发送邮件
2019/05/31 Python
什么是Python变量作用域
2020/06/03 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
关于HTML5语义标签的实践(blog页面)
2016/07/12 HTML / CSS
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
国外软件测试工程师面试题
2016/12/09 面试题
后勤部长岗位职责
2013/12/14 职场文书
高中生期末评语
2014/01/28 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
难忘的一天教学反思
2014/04/30 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
劳模事迹材料范文
2014/12/24 职场文书
民间借贷借条如何写
2015/05/26 职场文书
教师节表彰会主持词
2015/07/06 职场文书
交通安全教育主题班会
2015/08/12 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书