声明: 本案例仅供学习参考使用,任何不法的活动均与本作者无关
网站: 天天基金网(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 csv
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')
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 pd
df = 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 opts
df = 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文件