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 with的用法
Aug 22 Python
零基础写python爬虫之HTTP异常处理
Nov 05 Python
Python实现Const详解
Jan 27 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
Sep 18 Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
pycharm修改文件的默认打开方式的步骤
Jul 29 Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 Python
python 使用opencv 把视频分割成图片示例
Dec 12 Python
python多维数组分位数的求取方式
Mar 03 Python
python中def是做什么的
Jun 10 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 防止单引号,双引号在接受页面转义
2008/07/10 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
javascript实现连续赋值
2015/08/10 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
javascript中的隐式调用
2018/02/10 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
python实现的系统实用log类实例
2015/06/30 Python
HTML5中使用json对象的实例代码
2018/09/10 HTML / CSS
薇姿法国官网:Vichy法国
2021/01/28 全球购物
女娲补天教学反思
2014/02/05 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
办理信用卡工作证明
2014/09/30 职场文书
2015元旦标语横幅
2014/12/09 职场文书
就业导师推荐信范文
2015/03/27 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
2015年大学生工作总结
2015/04/21 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
浅谈Web Storage API的使用
2021/06/23 Javascript
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技