爬虫基础之爬取某基金网站+数据分析

news/2025/1/10 18:31:24/

声明: 本案例仅供学习参考使用,任何不法的活动均与本作者无关

网站:天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台!


本案例所需要的模块:

1.requests          2.re(内置)           3.pandas           4.pyecharts

其他均需要 pip install 模块名

爬取步骤:


一.请求数据  模拟浏览器向服务器发送请求
 

 F12 打开开发者模式 点击网络  搜索我们需要的数据 找到正确的接口

老样子 使用工具能够使我们节约时间 方便快捷 但前提能够自己写就没问题


新建本地py文件复制过去 运行之后就可以看到与浏览器预览中一样的数据

接着我们需要对请求到的数据进行处理
这里我们使用正则是最好的
匹配所需的内容 即()里的

python">text = re.findall(r'datas:\[(.*?)\]',response.text)

二.提取数据 提取所需要的内容 

 然后我们观察放回的数据 把每条数据都提取出来

此时我们想该使用什么 去提取我们的数据呢  split字符串分割 or 正则
都不使用 此时选择eval函数去除引号 是最佳的选择

 处理完之后就是一个个的元组 之后我们可以遍历元组保存数据

接着就是多页数据的采集 通过观察每一页的URL可知 pi参数控制着我们的页码
嵌套个for循坏 实现 翻页的操作

三.保存数据  保存数据到本地

        因为这样保存的数据连个标头都没有 因此我们对照网站将表头写入

        根据我们所拿取的数据对照  麻烦的话直接复制我的代码

python">
# 保存的格式为utf-8-sig  单是utf-8的话会有乱码 看不懂 思密达with open('基金.csv', 'a', encoding='utf-8-sig', newline='\n') as f:f.write('基金代码,基金简称,English,日期,基金净值,基金累计净值,日增长率,基金近1周,基金近1月,基金近3月,基金近6月,基金近1年,基金近2年,基金近3年,今年来,成立来,False,False,False,False,手续费,False,False,False,False,False')


   后面发现需要进一步的处理csv文件里的数据 我就随便给个表头写入 后续通过pandas 提取所需要的列形成新的表格 

 以下是本案例的源代码 供大家交流使用

python">import requests
import re
import csvwith open('基金.csv', 'a', encoding='utf-8-sig', newline='\n') as f:f.write('基金代码,基金简称,English,日期,基金净值,基金累计净值,日增长率,基金近1周,基金近1月,基金近3月,基金近6月,基金近1年,基金近2年,基金近3年,今年来,成立来,False,False,False,False,手续费,False,False,False,False,False')
headers = {"Accept": "*/*","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","Cache-Control": "no-cache","Connection": "keep-alive","Pragma": "no-cache","Referer": "https://fund.eastmoney.com/data/fundranking.html","Sec-Fetch-Dest": "script","Sec-Fetch-Mode": "no-cors","Sec-Fetch-Site": "same-origin","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0","sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"","sec-ch-ua-mobile": "?0","sec-ch-ua-platform": "\"Windows\""
}
cookies = {"ASP.NET_SessionId": "2n3frbs0qlvk51gumxde43jz","st_si": "03571815072389","st_pvi": "42679690302429","st_sp": "2025-01-05%2020%3A21%3A57","st_inirUrl": "https%3A%2F%2Ffund.eastmoney.com%2Fdata%2F","st_sn": "1","st_psi": "20250105202156911-112200312936-7115758265","st_asi": "delete"
}
url = "https://fund.eastmoney.com/data/rankhandler.aspx"
for page in range(1,20):params = {"op": "ph","dt": "kf","ft": "all","rs": "","gs": "0","sc": "1nzf","st": "desc","sd": "2024-01-05","ed": "2025-01-05","qdii": "","tabSubtype": ",,,,,","pi": page,"pn": "50","dx": "1","v": "0.7427594655500473"}response = requests.get(url, headers=headers, cookies=cookies, params=params)text = re.findall(r'datas:\[(.*?)\]', response.text)[0]tuple_data = eval(text)for tup in tuple_data:with open('基金.csv', 'a', encoding='utf-8-sig', newline='\n') as f:f.write(tup)f.write('\n')

数据清洗模块 


准备步骤:
        下载pandas模块 pip install pandas

此时可以新建一个py文件 方便我们清洗数据

python"># 第一步导包
import pandas as pd# 读取文件
df = pd.read_csv('基金.csv')
# 获取该文件中所有的列名print(df.columns)

将我们所需要的复制下来   形成一个新的文件

python">import pandas as pddf = pd.read_csv('基金.csv')
# 语法df[['基金代码', '基金简称', 'English', '日期', '基金净值', '基金累计净值', '日增长率', '基金近1周',
'基金近1月', '基金近3月', '基金近6月', '基金近1年', '基金近2年', '基金近3年', '今年来', '成立来','手续费']].to_csv('基金_New.csv', index=False,encoding='utf-8-sig')print(df.columns)

        现在就看着舒服多了 

Explain:
        如下图所示的列名中的数字0保存到csv文件中会消失 但在pycharm中可以正常显示

数据可视化模块

python"># 导包
# 需要下载pyecharts
import pandas as pd
from pyecharts.charts import Line
from pyecharts.options import LabelOpts
from pyecharts import options as optsdf = pd.read_csv('基金_New.csv')
# 将每一列的数据转换成列表 因为下面的表格数据需要list类型的
name = df['基金简称'].tolist()
value = df['基金净值'].tolist()
value_2 = df['基金累计净值'].tolist()
value_3 = df['基金近1周'].tolist()
# 折线图的生成
line = (Line()# 生成x y轴的值.add_xaxis(name).add_yaxis('基金净值', value, markpoint_opts=opts.MarkPointOpts(# 只显示数据中的最小值和最大值data=[opts.MarkPointItem(type_="max", name="最大值"),opts.MarkPointItem(type_="min", name="最小值")])).add_yaxis('基金累计净值',value_2,markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值"),opts.MarkPointItem(type_="min", name="最小值")])).add_yaxis('基金近1周',value_3,markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值"),opts.MarkPointItem(type_="min", name="最小值")]))# 将数值不显示出来 这样美观些.set_series_opts(label_opts=opts.LabelOpts(is_show=False))).render('found.html')
# 最后生成html文件

 


http://www.ppmy.cn/news/1562037.html

相关文章

根据中文名称首字母进行分组

很多项目中&#xff0c;需要用到中文名称到首字母进行分组&#xff0c;例如&#xff1a;城市、游戏等等。。。 /*** 将集合数据按照汉字首字母分组排序** param list* return*/public Map<String, Object> screenManufacturer(List<Game> list) {Set<String>…

2025新春烟花代码(二)HTML5实现孔明灯和烟花效果

效果展示 源代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34";var …

Appium版本升级,需要注意哪些点:使用UiAutomator2Options传递capabilities

mac上安装的是较新的Appium版本&#xff0c;在跑之前写的Android UI 自动化代码时报错&#xff1a;AttributeError: dict object has no attribute to_capabilities。 查了一下资料&#xff0c;这是因为较新的 Selenium 和 Appium 版本要求使用 Options 类来定义能力&#xff…

【hadoop学习遇见的小问题】clone克隆完之后网络连接不上问题解决

vi /etc/udev/rules.d/70-persistent-net.rules注释掉第一行 第二行的eth1 改为eth0 由上图也可以看到物理地址 记录下来在网卡中修改物理地址 vi /etc/sysconfig/network-scripts/ifcfg-eth0修改完之后 重启reboot 即可

线性表的接口定义及使用

定义接口 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _001_线性表 {interface IListDS<T>//定义接口{int GetLength();void Clear();bool IsEmpty();void Add(T item);void Inser…

在离线环境中安装 `.rpm` 包的步骤

在一些环境中&#xff0c;可能无法直接通过网络安装软件包。特别是在没有互联网连接的情况下&#xff0c;我们仍然可以手动下载 .rpm 安装包并进行离线安装。本文将介绍如何在离线环境中安装多个 .rpm 包&#xff0c;确保软件的顺利安装和依赖关系的处理。 1. 将 .rpm 文件复制…

macOS 如何修改 PATH 环境变量 ?

对于希望从终端管理命令行工具和脚本的可访问性的用户来说&#xff0c;在 macOS 上编辑 PATH 环境变量是必不可少的。在最近的版本中&#xff0c;macOS 已经从使用 bash shell 作为默认 shell 转变为使用 zsh&#xff0c;因此了解如何在这两个 shell 中编辑 PATH 是很重要的。 …

RabbitMQ-SpringAMQP使用介绍

RabbitMQ 1. Spring AMQP1.1 引入依赖1.2 消息发送1.3 消息接收1.4 WorkQueue模型1.4.1 实例代码1.4.2 能者多劳1.4.3 总结 1.5交换机1.6 Fanout交换机&#xff08;广播&#xff09;1.7 Direct交换机&#xff08;订阅&#xff09;1.8 Topic交换机&#xff08;通配符订阅&#x…