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提取内容关键词的方法
Mar 16 Python
使用python实现正则匹配检索远端FTP目录下的文件
Mar 25 Python
详解Python中的strftime()方法的使用
May 22 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
关于python多重赋值的小问题
Apr 17 Python
详解python调用cmd命令三种方法
Jul 08 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
pyecharts调整图例与各板块的位置间距实例
May 16 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
Django通过设置CORS解决跨域问题
Nov 26 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权限分配的实现代码
2013/04/28 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
PHP使用json_encode函数时不转义中文的解决方法
2014/11/12 PHP
php绘制一条弧线的方法
2015/01/24 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
javascript实现图片上传前台页面
2015/08/18 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
BootStrap表单时间选择器详解
2017/05/09 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
python实现控制台打印的方法
2019/01/12 Python
Django Rest framework频率原理与限制
2019/07/26 Python
Python Gitlab Api 使用方法
2019/08/28 Python
Python获取时间戳代码实例
2019/09/24 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
护士岗前培训自我评鉴
2014/02/28 职场文书
闭幕式主持词
2014/04/02 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
放弃继承权公证书
2015/01/23 职场文书
高一作文之乐趣
2019/11/21 职场文书
JavaScript实现简单计时器
2021/06/22 Javascript
python井字棋游戏实现人机对战
2022/04/28 Python
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL