鱼C论坛

 找回密码
 立即注册
查看: 8948|回复: 59

[作品展示] 爬取天天基金(手机端)开放式基金持仓前十位

[复制链接]
发表于 2020-9-9 16:39:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 疾风怪盗 于 2020-9-9 21:31 编辑

近期被股市当韭菜狠狠割了一刀,怕了怕了。。。。。。。
但突然想到,各大所谓赚钱的基金都在买些啥股票。。。。。。
于是爬取了天天基金上开放式基金的持仓,爬的是手机网页,貌似手机上的排行和PC上还不一样
代码如下:
  1. import requests
  2. import time
  3. import datetime
  4. import json
  5. import pandas as pd


  6. # 目标:爬取天天基金网,开放基金中股票型基金的持仓股票情况

  7. class TianTian_Fund():
  8.     def __init__(self):
  9.         # 获取基金排行url

  10.         self.fund_name_url = 'https://fundmobapi.eastmoney.com/FundMNewApi/FundMNRankNewList?fundtype={}&SortColumn=RZDF&Sort=desc&pageIndex={}&pagesize=30&companyid=&deviceid=Wap&plat=Wap&product=EFund&version=2.0.0&Uid=&_=1599579446935'
  11.         # 获取基金调仓日期rul
  12.         self.fund_position_url_1 = 'https://fundmobapi.eastmoney.com/FundMApi/FundIVInfo.ashx?FCODE={}&deviceid=Wap&plat=Wap&product=EFund&version=2.0.0&Uid='
  13.         # 获取基金仓位情况rul
  14.         self.fund_position_url_2 = 'https://fundmobapi.eastmoney.com/FundMNewApi/FundMNInverstPosition?FCODE={}&deviceid=Wap&plat=Wap&product=EFund&version=2.0.0&Uid=&DATE={}'
  15.         self.headers_1 = {
  16.             'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
  17.         # 保存数据
  18.         self.data = []

  19.         date_temp = datetime.datetime.now()  # 获取当前日期
  20.         self.date = str(date_temp.year) + str(date_temp.month).zfill(2) + str(date_temp.day).zfill(2)  # 获取当前日期,年月日

  21.     def Get_Fund_Nname(self, t, page_nums):
  22.         for page_num in range(1, page_nums):
  23.             fund_name_url = self.fund_name_url.format(t, page_num)  # 构造地址
  24.             print(f'正在爬取第{page_num}页,url为{fund_name_url}')

  25.             fund_name_response = requests.get(url=fund_name_url, headers=self.headers_1)
  26.             fund_name_str = fund_name_response.content.decode('utf-8')  # 获取数据
  27.             # fund_name_str=fund_name_str[fund_name_str.index('(')+1:-1]#把字符串前后不能解析为json的内容去除,变成字典形式,就能解析为json
  28.             # print(fund_name_str)
  29.             fund_name_data = json.loads(fund_name_str)  # 解析为json格式
  30.             fund_name_data = fund_name_data['Datas']
  31.             self.Save_Fund_data(fund_name_data, page_num)  # 保存json原始数据

  32.             for i in range(len(fund_name_data)):
  33.                 data_temp = {}
  34.                 data_temp['fund_name'] = fund_name_data[i]['SHORTNAME']  # 提取基金名称
  35.                 data_temp['fund_value'] = fund_name_data[i]['DWJZ']  # 提取基金净值
  36.                 data_temp['fund_date'] = fund_name_data[i]['FSRQ']  # 提取日期
  37.                 data_temp['fund_id'] = fund_name_data[i]['FCODE']  # 提取基金编号id
  38.                 stock = self.Get_Fund_Position(data_temp['fund_id'])
  39.                 data_temp['stock'] = stock
  40.                 self.data.append(data_temp)
  41.             time.sleep(3)
  42.         print(self.data)

  43.     def Save_Fund_data(self, fund_name_data, page_num):  # 保存数据
  44.         with open(f'{self.date}天天基金-名称-{page_num}.json', mode='w', encoding='utf-8') as file:
  45.             json.dump(fund_name_data, file, ensure_ascii=False, indent=4)
  46.             print('保存成功')

  47.     def Save_Fund_all(self):  # 保存数据
  48.         with open(f'{self.date}天天基金.csv', mode='w', encoding='utf-8') as file:
  49.             # 表头
  50.             file.write('fund_name' + ',' + 'fund_value' + ',' + 'fund_date' + ',' + 'fund_id' + ',')
  51.             for j in range(1, 11):
  52.                 file.write(f'stock_name{j}' + ',' + f'stock_position{j}' + ',' + f'stock_operation{j}' + ',')
  53.             file.write('\n')
  54.             # 内容
  55.             for i in self.data:
  56.                 file.write(i['fund_name'] + ',' + i['fund_value'] + ',' + i['fund_date'] + ',' + i['fund_id'] + ',')
  57.                 if i['stock'] != None:
  58.                     for k in i['stock']:
  59.                         file.write(str(k['stock_name']) + ',' + str(k['stock_position']) + ',' + str(
  60.                             k['stock_operation']) + ',')
  61.                 else:
  62.                     for k in range(10):
  63.                         file.write('' + ',' + '' + ',' + '' + ',')
  64.                 file.write('\n')

  65.     def Get_Fund_Position(self, fund_id):
  66.         # 先获取调仓日期
  67.         fund_position_url_1 = self.fund_position_url_1.format(fund_id)
  68.         print(fund_position_url_1)
  69.         fund_position_response_1 = requests.get(url=fund_position_url_1, headers=self.headers_1)
  70.         fund_position_str_1 = fund_position_response_1.content.decode()
  71.         fund_position_json_1 = json.loads(fund_position_str_1)
  72.         fund_position_date = fund_position_json_1['Datas'][0]['DATE']  # 获取最新调仓日期
  73.         try:
  74.             fund_position_date = fund_position_date[0]
  75.         except:
  76.             fund_position_date = None
  77.         time.sleep(1)
  78.         stock_all = []
  79.         if fund_position_date != None:
  80.             # 再获取仓位信息
  81.             fund_position_url_2 = self.fund_position_url_2.format(fund_id, fund_position_date)
  82.             print(fund_position_url_2)
  83.             fund_position_response_2 = requests.get(url=fund_position_url_2, headers=self.headers_1)
  84.             fund_position_str_2 = fund_position_response_2.content.decode()
  85.             fund_position_json_2 = json.loads(fund_position_str_2)
  86.             fund_position_json_2 = fund_position_json_2['Datas']['fundStocks']

  87.             for i in range(len(fund_position_json_2)):
  88.                 stock = {}
  89.                 stock['stock_name'] = fund_position_json_2[i]['GPJC']
  90.                 stock['stock_position'] = fund_position_json_2[i]['JZBL'] + '%'
  91.                 stock['stock_operation'] = fund_position_json_2[i]['PCTNVCHGTYPE']
  92.                 stock_all.append(stock)
  93.             time.sleep(1)
  94.         else:
  95.             stock = {'stock_name': None, 'stock_position': None, 'stock_operation': None}
  96.             stock_all.append(stock)
  97.         return stock_all

  98.     def Process_Data(self):
  99.         data = pd.read_csv(f'{self.date}天天基金.csv', sep=',')
  100.         # print(data.info())
  101.         with open(f'{self.date}持仓股分析.txt', mode='w', encoding='utf-8') as file:
  102.             for n in range(1, 11):
  103.                 data1 = data.groupby(by=f'stock_name{n}').count()['fund_name']  # 最多持仓股
  104.                 a = [i for i in data1.values]
  105.                 b = [i for i in data1.index]
  106.                 c = f'stock_name{n}分析:持仓股最多的股票为‘{b[a.index(max(a))]}’,一共{len(data)}个基金,有{max(a)}家持仓' + '\n'
  107.                 print(c)
  108.                 file.write(c)


  109. if __name__ == '__main__':
  110.     time1 = datetime.datetime.now()
  111.     tiantian = TianTian_Fund()
  112.     t = 27  # t=25股票型基金,t=26#指数型基金,t=27#混合型基金
  113.     page_nums = 10
  114.     tiantian.Get_Fund_Nname(t, page_nums)  # 传入页码参数
  115.     tiantian.Save_Fund_all()
  116.     time2 = datetime.datetime.now()
  117.     delta = time1 - time2
  118.     print(f'耗时{delta.seconds}秒')
  119.     tiantian.Process_Data()
复制代码


爬取混合型基金,10页270个基金的前十位持仓内容,都是2020-6-30的调仓数据,比较慢,没用多线程之类的提速,大概花了25多分钟
stock_name1分析:持仓股最多的股票为‘贵州茅台’,一共270个基金,有39家持仓
stock_name2分析:持仓股最多的股票为‘中国平安’,一共270个基金,有34家持仓
stock_name3分析:持仓股最多的股票为‘招商银行’,一共270个基金,有26家持仓
stock_name4分析:持仓股最多的股票为‘恒瑞医药’,一共270个基金,有23家持仓
stock_name5分析:持仓股最多的股票为‘中信证券’,一共270个基金,有10家持仓
stock_name6分析:持仓股最多的股票为‘伊利股份’,一共270个基金,有12家持仓
stock_name7分析:持仓股最多的股票为‘中信证券’,一共270个基金,有12家持仓
stock_name8分析:持仓股最多的股票为‘中信证券’,一共270个基金,有10家持仓
stock_name9分析:持仓股最多的股票为‘中信证券’,一共270个基金,有8家持仓
stock_name10分析:持仓股最多的股票为‘中信证券’,一共270个基金,有10家持仓

仅作参考!虽然参考意义不大。。。。。。。。。。。。。。。

本帖被以下淘专辑推荐:

  • · python|主题: 62, 订阅: 4
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-23 15:43:17 | 显示全部楼层
谢谢分享。
其实同样的思路,爬取定投榜单前10基金,进行定投,应该也是可以赚钱的。
另外,换个思路,找蓝筹股持股的基金,进行投资,赚钱几率也比较高吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-11 22:56:59 | 显示全部楼层
来向作者学下一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-18 16:09:19 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-18 15:57:31 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-18 15:20:11 | 显示全部楼层
学习一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-10 10:26:12 | 显示全部楼层
谢谢分享
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-10 10:05:00 | 显示全部楼层
学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-9 21:57:46 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-8 22:03:25 | 显示全部楼层
xuexi
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-7 14:17:09 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-3 17:26:45 | 显示全部楼层
谢谢分享。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-2 14:43:17 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-2 10:37:07 | 显示全部楼层
想看啊,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-13 20:02:09 | 显示全部楼层
谢谢分享...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-13 11:22:30 From FishC Mobile | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-13 09:46:16 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-12 23:53:53 | 显示全部楼层
123
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-12 21:17:58 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-4-13 08:55:17 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-25 12:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表