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循环语句之break与continue的用法
Oct 14 Python
Python中文分词实现方法(安装pymmseg)
Jun 14 Python
python3中bytes和string之间的互相转换
Feb 09 Python
对python中for、if、while的区别与比较方法
Jun 25 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
解决pycharm工程启动卡住没反应的问题
Jan 19 Python
详解PyCharm安装MicroPython插件的教程
Jun 24 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 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
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
jquery 元素相对定位代码
2010/10/15 Javascript
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
使用jQuery实现购物车
2020/10/29 jQuery
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python数组条件过滤filter函数使用示例
2014/07/22 Python
简单介绍Python中的struct模块
2015/04/28 Python
python中OrderedDict的使用方法详解
2017/05/05 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
基于python 等频分箱qcut问题的解决
2020/03/03 Python
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
交通专业个人自荐信格式
2013/09/23 职场文书
一名女生的自荐信
2013/12/08 职场文书
2014年幼儿园植树节活动方案
2014/03/02 职场文书
安全生产承诺书范文
2014/05/22 职场文书
滞留工资返还协议书
2014/10/19 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
十岁生日答谢词
2015/01/05 职场文书
安全责任书
2015/01/29 职场文书
阿甘正传观后感
2015/06/01 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
使用feign服务调用添加Header参数
2021/06/23 Java/Android
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers