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将数组的元素导出到变量中(unpacking)
Oct 27 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
Nov 15 Python
python 动态生成变量名以及动态获取变量的变量名方法
Jan 20 Python
Opencv实现抠图背景图替换功能
May 21 Python
Python函数参数匹配模型通用规则keyword-only参数详解
Jun 10 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
Jun 14 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
Mar 11 Python
Python中zip函数如何使用
Jun 04 Python
Pycharm快捷键配置详细整理
Oct 13 Python
Python的collections模块真的很好用
Mar 01 Python
python中urllib包的网络请求教程
Apr 19 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
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
php读取纯真ip数据库使用示例
2014/01/26 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
从JavaScript的函数重名看其初始化方式
2007/03/08 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
浅谈Webpack打包优化技巧
2018/06/12 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
使用Kivy将python程序打包为apk文件
2017/07/29 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
五五普法心得体会
2014/09/04 职场文书
2014年政务公开工作总结
2014/12/09 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
重阳节简报
2015/07/20 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
python中的被动信息搜集
2021/04/29 Python
理解python中装饰器的作用
2021/07/21 Python
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL