大家好,我是小一

今天的文章来自于朋友圈,发现大家对于基金报告的爬取也挺感兴趣,于是就抽时间复现了一下

爬虫的整体思路比较简单,代码量甚至都没有基金分析那篇的多,很适合入门的朋友参考学习

另外,这篇文章可能介绍的比较细,大家酌情加速阅读

注:文末可获取本节所有源码

正文

目标:通过天天基金网爬取基金历史季度报告,下载对应的季度报告到本地 pdf 文件

首先,登录天天基金网,进入基金季度报告页面

我这里直接选近一年收益率最高的基金为对象:创金合信工业周期股票A,基金代码:005968

报告页面长这样:

对应的,点击 基金公告菜单的定期报告选项 可以看到所有的季度报告

可以看到此时的 url 链接变成了下面这种:

http://fundf10.eastmoney.com/jjgg_005968_3.html

这个 url 我们通过 前缀+基金代码+后缀 可以直接构造

对于任意的基金报告,只需要改动基金代码就能直接定位到基金报告页。

http://fundf10.eastmoney.com/jjgg_ + 基金代码 + _3.html

另外可以发现,005968 的基金报告是有两页。

调出 F12 窗口,在点击下一页的时候可以发现动态请求的链接

http://api.fund.eastmoney.com/f10/JJGG?callback=jQuery18304948864684189589_1613722337855&fundcode=005968&pageIndex=2&pageSize=20&type=3&_=1613723166954

前面的参数例如:funcode、pageIndex 等表示基金代码、页码等,都可以理解,但是最后一个参数有点奇怪:“&_=1613723166954”

如果删了这个参数或者随便改一个值,出来的结果是这样的:

通过多次测试,发现这个参数值会根据时间发生变化,但是又不是简单的时间戳格式

大胆盲猜一下,这个参数应该是平台对应的反爬参数,如果能破解这个参数的生成规则,那么今天的目标就很容易搞定

花了点时间多研究了一下,发现没有很明显的规则,暂时决定放弃。

这个参数确实比较重要,有兴趣的可以研究下平台的生成规则,

ok,通过接口的方案获取数据暂时行不通,那就换种方式:selenium

关于 selenium 的使用在老早的一篇文章中就有说过,我还特意去看了一下,发现当时写的巨详细,墙裂推荐:小白学爬虫-进阶-selenium 获取数据

所以,下面是文章的重点:通过 selenium 爬取数据

老规矩,先说流程:

  1. 进入季度报页面,获取翻页页面进行循环

  2. 循环体中执行以下两个操作

  • 解析当前页的内容,保存页面数据

  • 点击下一页

遍历所有数据,筛选报告中的季度报

调用下载函数,下载对应的基金报告,保存 pdf 在本地

具体的,在解析每一页的内容时,可拿到 基金报告的标题、下载链接、发布时间

流程不难,代码操作也比较简单,往下看 

1. 构造基金报告页 url

很简单,两句话

code = '005968'
url = 'http://fundf10.eastmoney.com/jjgg_{0}_3.html'.format(code)
2. 初始化 selenium

为了方便使用,直接封装在函数里面

具体代码如下:

from selenium import webdriverdef init_selenium():"""初始化 selenium@return:"""executable_path = "D:\software\install\chromedriver_win32\chromedriver.exe"# 设置不弹窗显示# chrome_options = Options()# chrome_options.add_argument('--headless')# chrome_options.add_argument('--disable-gpu')# browser = webdriver.Chrome(chrome_options=chrome_options, executable_path=executable_path)browser = webdriver.Chrome(executable_path=executable_path)return browser

运行之前需要手动改一下自己的 chromedriver.exe 的本地路径,前面的文章有详细教程:小白学爬虫-进阶-selenium 获取数据

3. 获取报告页码

如图所示,4 个 label 标签分别对应:上一页、1、2、下一页,页码为 2

所以:页码即为 label 的长度-2

具体页码的获取通过  BeautifulSoup 对页面进行解析即可

browser.get(url)
content = browser.page_source
soup = BeautifulSoup(content, 'html.parser')
# 获取页码数
soup_pages = soup.find_all('div', class_='pagebtns')[0].find_all('label')
page_size = len(soup_pages)-2
4. 获取页面内容

页面内容中主要包括:报告标题、报告文件链接和公告日期

需要注意的是,部分报告的文件下载链接为空,需要特殊处理

部分报告文件是报告摘要,需要过滤掉

具体代码如下:

list_result = []
"""获取内容"""
soup_tbody = soup.find_all('table', class_='w782 comm jjgg')[0].find_all('tbody')[0]
for soup_tr in soup_tbody.find_all('tr'):soup_a = soup_tr.find_all('td')[0].find_all('a')title = soup_a[0].get_text()# 文件下载链接为空的处理if len(soup_a) == 2:link = soup_a[1].get('href')else:link = Nonedate_str = soup_tr.find_all('td')[2].get_text()if title.endswith("报告"):list_result.append([title, link, date_str])df_result = pd.DataFrame(list_result, columns=['报告标题', '报告pdf链接', '公告日期'])
5. 翻页操作

翻页操作在 selenium 中操作非常方便,定位+点击

对应的需要先确定翻页的按钮,也就是对应的页码 1/2/3/4 等,然后调用 click 函数

具体代码如下:

# 点击下一页按钮
browser.find_element_by_xpath("//div[@class='pagebtns']/label["+str(index+2)+"]").click()
time.sleep(random.randint(5, 10))

非常建议大家在每一个翻页中设置合适的休眠时间

上次基金的文章开源之后,可能有人把休眠时间去掉了,短时间内频繁爬取,导致官方做了反爬

还是建议大家理性爬数据,善待每一个目标网站。

6. 下载文件

上上一步已经拿到了每一个基金报告的标题和链接,直接遍历下载即可

下载 pdf 文件直接使用 requests 即可

具体代码如下:

import requests
# 设置下载路径
file_path = os.path.join(dirpath, title + '.pdf')
# 下载文件
res = requests.get(link)
with open(file_path, 'wb') as f:f.write(res.content)

ok,具体的流程和代码已经介绍完毕

正常情况下,你的代码点击运行后自动打开 chrome 浏览器:

同时,编译器终端会是这样的:

下载后的基金季度报告文件是这样的:

以上就是本次爬虫的所有内容

最后的最后,还是建议大家理性爬数据,在每一个翻页中设置合适的休眠时间,善待每一个目标网站

另外,本着互相学习、交流思路的目的,本节所有代码开源

点击 下方公众号,在对话框回复:基金报告 即可获取所有源码

代码开源的目的主要是互相学习、交流思路

比如有更好的方法爬取基金报告数据的,也都可以一起交流讨论

说个小小的拓展,对于基金季度报 pdf 文件,可以通过 Python 对收益情况、业绩表现、投资情况等做一个更细致的对比分析

往期文章

2020年,『小一的学习笔记』文章合集

说说我自己对于 基金 股票 的理解

爬取了 14455 个已发行基金,到底能分析点啥出来?

我是小一,坚持向暮光所走的人,终将成为耀眼的存在!

期待你的 三连!我们下节见

一键爬取基金历年季度报数据,轻松搞定!附源码相关推荐

  1. 20行Python代码爬取2W多条音频文件素材【内附源码+详细解析】新媒体创作必备

    大家好,我是辣条. 今天的内容稍显简单,不过对于新媒体创作的朋友们还是很有帮助的,你能用上的话记得给辣条三连! 爬取目标 网站:站长素材 工具使用 开发工具:pycharm 开发环境:python3. ...

  2. 教你用PHP爬取王者荣耀英雄皮肤高清壁纸(附源码)

    午饭后看到一篇文章关于"用Python爬取王者荣耀官网的英雄皮肤图片",于是顺手用PHP也写了一个,在这里给大家分享一下,贴出源码: //下载王者荣耀皮肤图片 public fun ...

  3. python爬取网站教学视频_零基础Python爬取网页文章和图片详细教学(内附源码、教学视频)...

    Python爬虫,这个我相信对于很多人来说都不陌生! 今天小编给大家提供一份零基础Python爬取网页图片以及小说的代码并且详细的和大家讲解一下! 开发环境:版本Python3.6.2!(2版本会在2 ...

  4. python 抓取解析接口数据_[干货]用python抓取摩拜单车API数据并做可视化分析(源码)...

    原标题:[干货]用python抓取摩拜单车API数据并做可视化分析(源码) 在APP中能看到很多单车,但走到那里的时候,才发现车并不在那里.有些车不知道藏到了哪里:有些车或许是在高楼的后面,由于有GP ...

  5. 手把手教你做一个数据图表生成器(附源码)...

    我的需求:手动配置X轴.Y轴.图表标题等参数自动通过Pyecharts模块生成可视化的html数据图表,并将浏览器图表展示到UI界面上. [阅读全文] 制作出图表后的效果展示如下: 另外,生成后的图表 ...

  6. flink sql 知其所以然(二)| 自定义 redis 数据维表(附源码)

    感谢您的关注  +  点赞 + 再看,对博主的肯定,会督促博主持续的输出更多的优质实战内容!!! 1.序篇-本文结构 背景篇-为啥需要 redis 维表 目标篇-做 redis 维表的预期效果是什么 ...

  7. Python爬取新闻标题及链接存至 Excel(含源码)

    新闻网址: https://www.tsinghua.edu.cn/news.htm 本片文章实现爬取新闻标题和链接 将新闻标题及链接存储至 Excel 表 源码 # 清华新闻import panda ...

  8. Vue使用ECharts完成2020年全国各地区GDP总量大数据可视化面板(附源码)

    就在上周全国各地区GDP总量上了热搜,一时兴起就想写个大数据面板展示 既然决定要写,那么就要考虑到图表和图标的使用,这里我是用了我最熟悉的两大框架ECharts和element-ui 一.我的构思步骤 ...

  9. 前端复杂表格导出excel,一键导出 Antd Table 看这篇就够了(附源码)

    前端导出 excel 的需求很多,但市面上好用的库并不多,讲明白复杂使用场景的文章更少. 本文将以文字 + demo 源码的形式,力求讲清楚满足 99% 使用场景的终极 excel 导出方案. 如果项 ...

最新文章

  1. Centos7 上安装 mysql5.7
  2. UNICODE 码和字符的相互转换
  3. oracle em 乱码问题
  4. python 语言-python是一门什么样的语言?
  5. 关于Kafka 的 consumer 消费者手动提交详解
  6. 直流(DC)跟交流射频(RF)的电场构成
  7. testNg自动化,读取excel的数据
  8. 画验证曲线_数学老师用“函数曲线”绘出美图 学生舍不得擦
  9. Hibernate--使用xml配置映射关系
  10. @Import注解使用及源码分析
  11. 《基于MFC的OpenGL编程》Part 8 Colors
  12. Maven SCM Release版本控制与发布
  13. ubuntu下cmake安装
  14. java web程序设计郭_Java Web程序设计-(第2版)
  15. 国家电网 计算机 《信息新技术》 整理
  16. Java | PTA练习:Employee类的层级结构
  17. html静态资源加载404,spring security访问静态资源文件出现404
  18. Windows系统连接蓝牙音箱,已连接,没有声音
  19. 放弃75W年薪,回老家当公务员,提离职被领导教育,网友:leader嫉妒了
  20. 【stm32f4 C++与C混合开发】建立keil5的ARM Compiler 6(AC6)标准库开发工程

热门文章

  1. 2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按 yyyymmdd 的格式写成一个8位数是 ,恰好是一个回文数。我们称这样的日期是回文日期。 有人表示
  2. 性能监控工具Zabbix学习笔记
  3. Day79_Flink(五) FlinkSQL和CEP
  4. undo数据文件丢失的恢复
  5. dddddddddddddd
  6. 如何使用会声会影制作手机竖屏效果
  7. QQ2010的划词搜索
  8. Beginning 的搭配说明
  9. 在IE中通过a标签直接下载rar文件时以乱码方式打开
  10. 大数据深度学习下的车辆结构化——明景车辆结构化分析