mns-scheduler 1.1.8.4__py3-none-any.whl → 1.4.5.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. mns_scheduler/__init__.py +1 -3
  2. mns_scheduler/auto_da_ban/auto_da_ban_service.py +89 -0
  3. mns_scheduler/company_info/clean/__init__.py +1 -1
  4. mns_scheduler/company_info/clean/company_info_clean_api.py +62 -21
  5. mns_scheduler/company_info/common/company_common_query_service.py +45 -0
  6. mns_scheduler/company_info/constant/__init__.py +1 -1
  7. mns_scheduler/company_info/constant/company_constant_data.py +335 -224
  8. mns_scheduler/company_info/de_list_stock/__init__.py +1 -1
  9. mns_scheduler/company_info/de_list_stock/de_list_stock_service.py +1 -1
  10. mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +134 -0
  11. mns_scheduler/company_info/sync/company_info_set_service.py +208 -0
  12. mns_scheduler/company_info/sync/sync_company_info_task.py +203 -0
  13. mns_scheduler/company_info/task/company_announce_info_task.py +77 -0
  14. mns_scheduler/company_info/task/company_base_info_task.py +64 -0
  15. mns_scheduler/company_info/task/company_business_info_task.py +177 -0
  16. mns_scheduler/company_info/task/company_hold_info_task.py +66 -0
  17. mns_scheduler/company_info/task/company_industry_info_task.py +167 -0
  18. mns_scheduler/company_info/task/company_total_task.py +69 -0
  19. mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
  20. mns_scheduler/concept/clean/ths_concept_clean_api.py +20 -4
  21. mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +23 -18
  22. mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +4 -1
  23. mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py +7 -7
  24. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +9 -4
  25. mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +2 -2
  26. mns_scheduler/db/col_move_service.py +3 -3
  27. mns_scheduler/db/script/__init__.py +1 -1
  28. mns_scheduler/db/script/col_move_script.py +1 -1
  29. mns_scheduler/db/script/db_move/__init__.py +7 -0
  30. mns_scheduler/db/script/db_move/col_move_one_service.py +34 -0
  31. mns_scheduler/db/script/sync/__init__.py +1 -1
  32. mns_scheduler/db/script/sync/remote_data_sync_to_local.py +65 -4
  33. mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +80 -0
  34. mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +69 -0
  35. mns_scheduler/db/script/update/__init__.py +7 -0
  36. mns_scheduler/db/script/update/update_col_field.py +36 -0
  37. mns_scheduler/finance/__init__.py +1 -1
  38. mns_scheduler/finance/em/__init__.py +7 -0
  39. mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +2 -2
  40. mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +27 -26
  41. mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +3 -3
  42. mns_scheduler/finance/{sync_financial_report_service_api.py → sync_financial_report_service_task.py} +80 -27
  43. mns_scheduler/finance/xue_qiu/__init__.py +7 -0
  44. mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
  45. mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
  46. mns_scheduler/hk/__init__.py +1 -1
  47. mns_scheduler/hk/hk_company_info_sync_service_api.py +4 -4
  48. mns_scheduler/hk/hk_industry_info_sync_service_api.py +3 -5
  49. mns_scheduler/industry/__init__.py +7 -0
  50. mns_scheduler/industry/ths/__init__.py +7 -0
  51. mns_scheduler/industry/ths/ths_industry_index_service.py +58 -0
  52. mns_scheduler/industry/ths/ths_industry_sync_service.py +68 -0
  53. mns_scheduler/irm/__init__.py +1 -1
  54. mns_scheduler/irm/api/__init__.py +1 -1
  55. mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +8 -58
  56. mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +15 -26
  57. mns_scheduler/irm/stock_irm_cninfo_service.py +43 -31
  58. mns_scheduler/irm/stock_question_id_service.py +169 -0
  59. mns_scheduler/k_line/clean/daily/__init__.py +1 -1
  60. mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +52 -6
  61. mns_scheduler/k_line/clean/daily/daily_k_line_service.py +7 -2
  62. mns_scheduler/k_line/clean/k_line_info_clean_impl.py +3 -2
  63. mns_scheduler/k_line/clean/k_line_info_clean_task.py +42 -15
  64. mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
  65. mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +124 -26
  66. mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +2 -2
  67. mns_scheduler/k_line/common/__init__.py +7 -0
  68. mns_scheduler/k_line/common/k_line_common_api.py +188 -0
  69. mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
  70. mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
  71. mns_scheduler/k_line/{sync → month_week_daily}/bfq_k_line_sync.py +14 -29
  72. mns_scheduler/k_line/{sync → month_week_daily}/daily_week_month_line_sync.py +11 -12
  73. mns_scheduler/k_line/sync_status/__init__.py +7 -0
  74. mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
  75. mns_scheduler/k_line/test/__init__.py +1 -1
  76. mns_scheduler/k_line/test/k_line_info_clean_his_data.py +14 -3
  77. mns_scheduler/k_line/year_quarter/__init__.py +7 -0
  78. mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +76 -0
  79. mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +1 -2
  80. mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
  81. mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +5 -0
  82. mns_scheduler/lhb/__init__.py +1 -1
  83. mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
  84. mns_scheduler/open/__init__.py +1 -1
  85. mns_scheduler/open/sync_one_day_open_data_to_db_service.py +2 -3
  86. mns_scheduler/risk/__init__.py +1 -1
  87. mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +8 -2
  88. mns_scheduler/risk/financial/annual_report_audit_check_api.py +13 -3
  89. mns_scheduler/risk/financial/net_assets_check_api.py +21 -18
  90. mns_scheduler/risk/financial/profit_income_check_api.py +7 -2
  91. mns_scheduler/risk/financial_report_risk_check_api.py +1 -1
  92. mns_scheduler/risk/major_violations/register_and_investigate_stock_sync_api.py +1 -1
  93. mns_scheduler/risk/self/wei_pan_stock_api.py +1 -1
  94. mns_scheduler/risk/test/__init__.py +1 -1
  95. mns_scheduler/risk/test/fix_blask_list.py +4 -6
  96. mns_scheduler/risk/transactions/transactions_check_api.py +22 -4
  97. mns_scheduler/self_choose/__init__.py +1 -1
  98. mns_scheduler/self_choose/ths_self_choose_service.py +99 -43
  99. mns_scheduler/trade/auto_login/trader_auto_service.py +7 -4
  100. mns_scheduler/trade/auto_sell_service_api.py +4 -4
  101. mns_scheduler/trade/balance/__init__.py +7 -0
  102. mns_scheduler/trade/balance/ths_account_balance_service.py +7 -0
  103. mns_scheduler/trade/sync_position_api.py +39 -6
  104. mns_scheduler/trade/task/trader_task_service.py +38 -10
  105. mns_scheduler/trade/tfp/__init__.py +7 -0
  106. mns_scheduler/trade/tfp/stock_tfp_info_sync.py +56 -0
  107. mns_scheduler/zb/stock_zb_pool_sync.py +1 -16
  108. mns_scheduler/zt/high_chg/sync_high_chg_pool_service.py +2 -2
  109. mns_scheduler/zt/high_chg/sync_high_chg_real_time_quotes_service.py +1 -1
  110. mns_scheduler/zt/script/__init__.py +1 -1
  111. mns_scheduler/zt/script/fix_error_deal_day.py +41 -0
  112. mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -2
  113. mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
  114. mns_scheduler/zt/script/sync_now_higt_chg_zt.py +8 -7
  115. mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +260 -83
  116. mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +33 -90
  117. mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +27 -13
  118. mns_scheduler/zz_task/compensation/__init__.py +0 -0
  119. mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
  120. mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
  121. mns_scheduler/zz_task/data_sync_task.py +197 -103
  122. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.5.7.dist-info}/METADATA +1 -1
  123. mns_scheduler-1.4.5.7.dist-info/RECORD +176 -0
  124. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.5.7.dist-info}/WHEEL +1 -1
  125. mns_scheduler/2014-2015-test/2014_2015_chg_statistics.py +0 -87
  126. mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
  127. mns_scheduler/company_info/base/sync_company_base_info_api.py +0 -439
  128. mns_scheduler/company_info/base/sync_company_hold_info_api.py +0 -40
  129. mns_scheduler/company_info/remark/company_remark_info_sync.py +0 -46
  130. mns_scheduler/db/real_time_task_check.py +0 -84
  131. mns_scheduler/debt/kzz_bond_info_sync.py +0 -33
  132. mns_scheduler-1.1.8.4.dist-info/RECORD +0 -142
  133. /mns_scheduler/{2014-2015-test → auto_da_ban}/__init__.py +0 -0
  134. /mns_scheduler/company_info/{base → common}/__init__.py +0 -0
  135. /mns_scheduler/{big_deal → company_info/em_stock_info}/__init__.py +0 -0
  136. /mns_scheduler/company_info/{remark → sync}/__init__.py +0 -0
  137. /mns_scheduler/{debt → company_info/task}/__init__.py +0 -0
  138. /mns_scheduler/k_line/{sync → month_week_daily}/__init__.py +0 -0
  139. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.5.7.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,58 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 17
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ import mns_common.api.ths.concept.app.ths_concept_index_app as ths_concept_index_app
9
+ from datetime import datetime
10
+ import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
11
+ import mns_common.utils.date_handle_util as date_handle_util
12
+ import mns_common.utils.data_frame_util as data_frame_util
13
+ import pandas as pd
14
+ import mns_common.component.common_service_fun_api as common_service_fun_api
15
+
16
+
17
+ # 通过api 获取ths行业和指数
18
+ def get_ths_index_by_api(query_type):
19
+ now_date = datetime.now()
20
+ hour = now_date.hour
21
+ minute = now_date.minute
22
+ now_str_day = now_date.strftime('%Y-%m-%d')
23
+
24
+ is_trade_day = trade_date_common_service_api.is_trade_day(now_str_day)
25
+
26
+ if bool(1 - is_trade_day):
27
+ last_trade_day = trade_date_common_service_api.get_before_trade_date(now_str_day, 1)
28
+ begin_time = date_handle_util.no_slash_date(last_trade_day) + '093000'
29
+ end_time = date_handle_util.no_slash_date(last_trade_day) + '150000'
30
+ else:
31
+ if hour < 9 or (hour == 9 and minute <= 25):
32
+ last_trade_day = trade_date_common_service_api.get_before_trade_date(now_str_day, 2)
33
+ begin_time = date_handle_util.no_slash_date(last_trade_day) + '093000'
34
+ end_time = date_handle_util.no_slash_date(last_trade_day) + '150000'
35
+ else:
36
+ begin_time = date_handle_util.no_slash_date(now_str_day) + '093000'
37
+ if hour == 9:
38
+ hour = '0' + str(hour)
39
+ end_time = date_handle_util.no_slash_date(now_str_day) + str(hour) + str(minute) + '00'
40
+ elif (hour == 11 and minute >= 30) or (hour == 12):
41
+ end_time = date_handle_util.no_slash_date(now_str_day) + '113000'
42
+ elif hour >= 15:
43
+ end_time = date_handle_util.no_slash_date(now_str_day) + '150000'
44
+ else:
45
+ end_time = date_handle_util.no_slash_date(now_str_day) + str(hour) + str(minute) + '00'
46
+
47
+ df = ths_concept_index_app.get_ths_concept_his_info(begin_time, end_time, 500, query_type)
48
+ if data_frame_util.is_empty(df):
49
+ return pd.DataFrame()
50
+ df['turnover'] = round(df['turnover'] / common_service_fun_api.HUNDRED_MILLION, 1)
51
+ df['net_inflow_of_main_force'] = round(df['net_inflow_of_main_force'] / common_service_fun_api.TEN_THOUSAND, 1)
52
+ df.fillna('', inplace=True)
53
+ return df
54
+
55
+
56
+ if __name__ == '__main__':
57
+ df_industry = get_ths_index_by_api(1)
58
+ print(df_industry)
@@ -0,0 +1,68 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 17
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ import mns_scheduler.industry.ths.ths_industry_index_service as ths_industry_index_service
9
+ from mns_common.db.MongodbUtil import MongodbUtil
10
+ import time
11
+ from datetime import datetime
12
+ from loguru import logger
13
+ import mns_common.utils.data_frame_util as data_frame_util
14
+ import mns_common.api.ths.concept.app.ths_concept_detail_app as ths_concept_detail_app
15
+
16
+ mongodb_util = MongodbUtil('27017')
17
+ import mns_common.constant.db_name_constant as db_name_constant
18
+
19
+
20
+ # 同步同花顺行业指数
21
+ def sync_ths_industry_index():
22
+ ths_industry_index_df = ths_industry_index_service.get_ths_index_by_api(1)
23
+ if data_frame_util.is_empty(ths_industry_index_df):
24
+ return None
25
+ ths_industry_index_df['_id'] = ths_industry_index_df['block_code']
26
+ ths_industry_index_df = ths_industry_index_df[[
27
+ '_id',
28
+ 'turnover',
29
+ 'block_market',
30
+ 'block_code',
31
+ 'block_name',
32
+ 'net_inflow_of_main_force',
33
+ 'chg'
34
+ ]]
35
+ now_date = datetime.now()
36
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
37
+ ths_industry_index_df['str_now_date'] = str_now_date
38
+ mongodb_util.save_mongo(ths_industry_index_df, db_name_constant.THS_INDUSTRY_LIST)
39
+
40
+
41
+ def sync_ths_industry_detail():
42
+ ths_industry_list_df = mongodb_util.find_all_data(db_name_constant.THS_INDUSTRY_LIST)
43
+ for industry_one in ths_industry_list_df.itertuples():
44
+ try:
45
+ time.sleep(1)
46
+ now_date = datetime.now()
47
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
48
+
49
+ ths_industry_symbol_detail_df = ths_concept_detail_app.get_ths_concept_detail_by_app(
50
+ industry_one.block_code)
51
+ ths_industry_symbol_detail_df = ths_industry_symbol_detail_df.rename(
52
+ columns={"concept_code": 'ths_industry_code',
53
+ "concept_name": 'ths_industry_name',
54
+ })
55
+ if data_frame_util.is_empty(ths_industry_symbol_detail_df):
56
+ continue
57
+ ths_industry_symbol_detail_df['str_now_date'] = str_now_date
58
+ ths_industry_symbol_detail_df['_id'] = ths_industry_symbol_detail_df['symbol']
59
+ mongodb_util.save_mongo(ths_industry_symbol_detail_df, db_name_constant.THS_STOCK_INDUSTRY_DETAIL)
60
+ logger.info("同步ths行业股票详情:{}", industry_one.block_name)
61
+
62
+ except BaseException as e:
63
+ logger.error("同步ths行业股票详情异常:{}", e)
64
+
65
+
66
+ if __name__ == '__main__':
67
+ sync_ths_industry_index()
68
+ sync_ths_industry_detail()
@@ -2,6 +2,6 @@ import sys
2
2
  import os
3
3
 
4
4
  file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
5
+ end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
@@ -2,6 +2,6 @@ import sys
2
2
  import os
3
3
 
4
4
  file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
5
+ end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
@@ -2,7 +2,7 @@ import sys
2
2
  import os
3
3
 
4
4
  file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
5
+ end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
  # !/usr/bin/env python
@@ -13,64 +13,17 @@ Desc: 上证e互动-提问与回答
13
13
  https://sns.sseinfo.com/
14
14
  """
15
15
  import warnings
16
- from functools import lru_cache
17
-
18
16
  import pandas as pd
19
17
  import requests
20
18
  from bs4 import BeautifulSoup
21
-
22
19
  from mns_common.db.MongodbUtil import MongodbUtil
23
- import mns_common.constant.db_name_constant as db_name_constant
24
20
 
25
21
  mongodb_util = MongodbUtil('27017')
26
- from tqdm import tqdm
27
-
28
-
29
- @lru_cache()
30
- def sync_stock_uid() -> pd.DataFrame:
31
- """
32
- 上证e互动-代码ID映射
33
- https://sns.sseinfo.com/list/company.do
34
- :return: 代码ID映射
35
- :rtype: str
36
- """
37
- url = "https://sns.sseinfo.com/allcompany.do"
38
- data = {
39
- "code": "0",
40
- "order": "2",
41
- "areaId": "0",
42
- "page": "1",
43
- }
44
- uid_list = list()
45
- code_list = list()
46
- for page in tqdm(range(1, 74), leave=False):
47
- data.update({"page": page})
48
- r = requests.post(url, data=data)
49
- data_json = r.json()
50
- soup = BeautifulSoup(data_json["content"], "lxml")
51
- soup.find_all("a", attrs={"rel": "tag"})
52
- uid_list.extend(
53
- [item["uid"] for item in soup.find_all("a", attrs={"rel": "tag"})]
54
- )
55
- code_list.extend(
56
- [
57
- item.find("img")["src"].split("?")[0].split("/")[-1].split(".")[0]
58
- for item in soup.find_all("a", attrs={"rel": "tag"})
59
- ]
60
- )
61
- code_uid_df = pd.DataFrame()
62
- code_uid_df['symbol'] = code_list
63
- code_uid_df['uid'] = uid_list
64
- code_uid_df['_id'] = uid_list
65
- return code_uid_df
66
-
67
-
68
- @lru_cache()
69
- def get_stock_uid() -> pd.DataFrame:
70
- return mongodb_util.find_all_data(db_name_constant.SSE_INFO_UID)
71
22
 
72
23
 
73
- def stock_sns_sse_info(symbol: str = "603119") -> pd.DataFrame:
24
+ def stock_sns_sse_info(org_ask_id,
25
+ page,
26
+ page_size) -> pd.DataFrame:
74
27
  """
75
28
  上证e互动-提问与回答
76
29
  https://sns.sseinfo.com/company.do?uid=65
@@ -80,16 +33,13 @@ def stock_sns_sse_info(symbol: str = "603119") -> pd.DataFrame:
80
33
  :rtype: str
81
34
  """
82
35
 
83
- stock_uid_df = get_stock_uid()
84
- stock_uid_df = stock_uid_df.loc[stock_uid_df['symbol'] == symbol]
85
- uid = list(stock_uid_df['uid'])[0]
86
36
  url = "https://sns.sseinfo.com/ajax/userfeeds.do"
87
37
  params = {
88
38
  "typeCode": "company",
89
39
  "type": "11",
90
- "pageSize": "100",
91
- "uid": uid,
92
- "page": "1",
40
+ "pageSize": str(page_size),
41
+ "uid": org_ask_id,
42
+ "page": str(page),
93
43
  }
94
44
  big_df = pd.DataFrame()
95
45
  page = 1
@@ -164,5 +114,5 @@ def stock_sns_sse_info(symbol: str = "603119") -> pd.DataFrame:
164
114
 
165
115
 
166
116
  if __name__ == "__main__":
167
- stock_sns_sse_info_df = stock_sns_sse_info(symbol="688787")
117
+ stock_sns_sse_info_df = stock_sns_sse_info('308', '2', '100')
168
118
  print(stock_sns_sse_info_df)
@@ -2,7 +2,7 @@ import sys
2
2
  import os
3
3
 
4
4
  file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
5
+ end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
  # !/usr/bin/env python
@@ -15,27 +15,18 @@ https://irm.cninfo.com.cn/
15
15
 
16
16
  import pandas as pd
17
17
  import requests
18
+ import time
18
19
 
19
20
 
20
- def _fetch_org_id(symbol: str = "000001") -> str:
21
- """
22
- 股票-互动易-组织代码
23
- https://irm.cninfo.com.cn/
24
- :return: 组织代码
25
- :rtype: str
26
- """
27
- url = "https://irm.cninfo.com.cn/newircs/index/queryKeyboardInfo"
28
- params = {"_t": "1691144074"}
29
- data = {"keyWord": symbol}
30
- r = requests.post(url, params=params, data=data)
31
- data_json = r.json()
32
- org_id = data_json["data"][0]["secid"]
33
- return org_id
34
-
35
-
36
- # 获取股票所有问题
21
+ # 获取单个股票所有问题
22
+ # todo https://irm.cninfo.com.cn/ircs/company/companyDetail?stockcode=000002&orgId=gssz0000002
23
+ def stock_irm_cninfo(symbol,
24
+ org_ask_id,
25
+ page,
26
+ page_size) -> pd.DataFrame:
27
+ # 毫秒级时间戳字符串
28
+ current_ms_timestamp_str = str(int(time.time() * 1000))
37
29
 
38
- def stock_irm_cninfo(symbol: str = "002594") -> pd.DataFrame:
39
30
  """
40
31
  互动易-提问
41
32
  https://irm.cninfo.com.cn/ircs/question/questionDetail?questionId=1515236357817618432
@@ -46,19 +37,17 @@ def stock_irm_cninfo(symbol: str = "002594") -> pd.DataFrame:
46
37
  """
47
38
  url = "https://irm.cninfo.com.cn/newircs/company/question"
48
39
  params = {
49
- "_t": "1691142650",
40
+ "_t": current_ms_timestamp_str,
50
41
  "stockcode": symbol,
51
- "orgId": _fetch_org_id(symbol),
52
- "pageSize": "100",
53
- "pageNum": "1",
42
+ "orgId": org_ask_id,
43
+ "pageSize": page_size,
44
+ "pageNum": page,
54
45
  "keyWord": "",
55
46
  "startDay": "",
56
47
  "endDay": "",
57
48
  }
58
49
 
59
50
  big_df = pd.DataFrame()
60
- page = 1
61
- params.update({"pageNum": page})
62
51
  r = requests.post(url, params=params)
63
52
  data_json = r.json()
64
53
  temp_df = pd.DataFrame(data_json["rows"])
@@ -195,7 +184,7 @@ def stock_irm_ans_cninfo(symbol: str = "1513586704097333248") -> pd.DataFrame:
195
184
 
196
185
 
197
186
  if __name__ == "__main__":
198
- stock_irm_cninfo_df = stock_irm_cninfo(symbol="002594")
187
+ stock_irm_cninfo_df = stock_irm_cninfo(symbol="000002", org_ask_id='gssz0000002', page=2, pageSize=100)
199
188
  print(stock_irm_cninfo_df)
200
189
 
201
190
  stock_irm_ans_cninfo_df = stock_irm_ans_cninfo(symbol="1495108801386602496")
@@ -2,34 +2,37 @@ import sys
2
2
  import os
3
3
 
4
4
  file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
5
+ end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
- import akshare as ak
8
+
9
9
  import mns_common.utils.data_frame_util as data_frame_util
10
10
  import pandas as pd
11
- import mns_common.api.em.east_money_stock_api as east_money_stock_api
11
+ import mns_common.component.em.em_stock_info_api as em_stock_info_api
12
12
  import mns_common.component.company.company_common_service_api as company_common_service_api
13
13
  from loguru import logger
14
14
  from datetime import datetime
15
15
  import time
16
16
  import mns_common.utils.date_handle_util as date_handle_util
17
-
18
17
  import mns_common.constant.db_name_constant as db_name_constant
19
18
  import mns_common.component.common_service_fun_api as common_service_fun_api
20
19
  import mns_scheduler.irm.api.sh_stock_sns_sse_info_api as sh_stock_sns_sse_info_api
21
20
  import mns_scheduler.irm.api.sz_stock_sns_sse_info_api as sz_stock_sns_sse_info_api
22
-
23
21
  from mns_common.db.MongodbUtil import MongodbUtil
22
+ import mns_scheduler.irm.stock_question_id_service as stock_question_id_service
24
23
 
25
24
  mongodb_util = MongodbUtil('27017')
26
25
 
27
26
 
28
- # 获取股票提问 互动易-提问 深交所
27
+ # 获取股票提问 互动易-提问 todo 深交所 可以拉取未回答的,但是最拉到最近三个月
29
28
  def get_stock_irm_cninfo_sz_api(symbol):
30
29
  try:
30
+ org_ask_id = stock_question_id_service.get_one_sz_symbol_org_id(symbol)
31
31
  # 获取一页
32
- stock_irm_cninfo_df = sz_stock_sns_sse_info_api.stock_irm_cninfo(symbol)
32
+ stock_irm_cninfo_df = sz_stock_sns_sse_info_api.stock_irm_cninfo(symbol,
33
+ org_ask_id,
34
+ 1,
35
+ 100)
33
36
  # 获取全页
34
37
  # stock_irm_cninfo_df = ak.stock_irm_cninfo(symbol)
35
38
  except Exception as e:
@@ -66,11 +69,15 @@ def get_stock_irm_cninfo_sz_api(symbol):
66
69
  return stock_irm_cninfo_df
67
70
 
68
71
 
69
- # 获取股票提问 互动易-提问 上交所
72
+ # 获取股票提问 互动易-提问 todo 上交所
70
73
  def get_stock_irm_cninfo_sh_api(symbol):
71
74
  try:
72
75
  # 获取一页
73
- stock_sns_sse_info_df = sh_stock_sns_sse_info_api.stock_sns_sse_info(symbol)
76
+ org_ask_id = stock_question_id_service.get_one_sh_symbol_org_id(symbol)
77
+
78
+ stock_sns_sse_info_df = sh_stock_sns_sse_info_api.stock_sns_sse_info(org_ask_id,
79
+ 1,
80
+ 100)
74
81
  # 获取全页
75
82
  # stock_sns_sse_info_df = ak.stock_sns_sseinfo(symbol)
76
83
  except Exception as e:
@@ -101,10 +108,21 @@ def get_stock_irm_cninfo_sh_api(symbol):
101
108
  "answer_time",
102
109
  "questioner",
103
110
  "source"]]
111
+ now_date = datetime.now()
112
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
113
+ stock_sns_sse_info_df.loc[
114
+ stock_sns_sse_info_df['answer_time'].str.contains('小时前', na=False), 'answer_time'] = str_now_date
115
+ stock_sns_sse_info_df.loc[
116
+ stock_sns_sse_info_df['answer_time'].str.contains('分钟前', na=False), 'answer_time'] = str_now_date
117
+ stock_sns_sse_info_df.loc[
118
+ stock_sns_sse_info_df['question_time'].str.contains('小时前', na=False), 'question_time'] = str_now_date
119
+ stock_sns_sse_info_df.loc[
120
+ stock_sns_sse_info_df['question_time'].str.contains('分钟前', na=False), 'answer_time'] = str_now_date
104
121
 
105
122
  return stock_sns_sse_info_df
106
123
 
107
124
 
125
+ # 格式化 时间
108
126
  def replace_date_format(date_str):
109
127
  now_date = datetime.now()
110
128
  str_day = now_date.strftime('%Y-%m-%d')
@@ -113,26 +131,20 @@ def replace_date_format(date_str):
113
131
  return date_str.replace('年', '-').replace('月', '-').replace('日', '').replace('昨天', last_day)
114
132
 
115
133
 
116
- def save_sh_stock_uid():
117
- code_uid_df = sh_stock_sns_sse_info_api.sync_stock_uid()
118
- mongodb_util.save_mongo(code_uid_df, db_name_constant.SSE_INFO_UID)
119
-
120
-
121
134
  # 同步所有互动问题
122
- def sync_all_interactive_questions(symbol_list):
123
- # 同步互动易映射
124
- save_sh_stock_uid()
125
-
126
- real_time_quotes_all_stocks = east_money_stock_api.get_real_time_quotes_all_stocks()
135
+ def sync_symbols_interactive_questions(symbol_list):
136
+ real_time_quotes_all_stocks = em_stock_info_api.get_a_stock_info()
127
137
  de_list_company_symbols = company_common_service_api.get_de_list_company()
128
138
  real_time_quotes_all_stocks = real_time_quotes_all_stocks.loc[
129
139
  ~(real_time_quotes_all_stocks['symbol'].isin(de_list_company_symbols))]
130
140
  real_time_quotes_all_stocks = common_service_fun_api.classify_symbol(real_time_quotes_all_stocks)
131
- real_time_quotes_all_stocks = real_time_quotes_all_stocks.sort_values(by=['chg'], ascending=False)
141
+ real_time_quotes_all_stocks = real_time_quotes_all_stocks.sort_values(by=['amount'], ascending=False)
132
142
  fail_symbol_list = []
133
- if symbol_list is not None:
143
+ if len(symbol_list) != 0:
134
144
  real_time_quotes_all_stocks = real_time_quotes_all_stocks.loc[
135
145
  real_time_quotes_all_stocks['symbol'].isin(symbol_list)]
146
+
147
+ real_time_quotes_all_stocks = real_time_quotes_all_stocks.reset_index(drop=True)
136
148
  for stock_one in real_time_quotes_all_stocks.itertuples():
137
149
  try:
138
150
  now_date = datetime.now()
@@ -149,18 +161,13 @@ def sync_all_interactive_questions(symbol_list):
149
161
 
150
162
  else:
151
163
  continue
164
+ if data_frame_util.is_empty(stock_irm_cninfo_df):
165
+ continue
152
166
  stock_irm_cninfo_df['sync_time'] = str_now_date
153
167
  stock_irm_cninfo_df['str_day'] = str_day
154
168
  stock_irm_cninfo_df.drop_duplicates('_id', keep='last', inplace=True)
155
169
  stock_irm_cninfo_df.fillna("", inplace=True)
156
- stock_irm_cninfo_df.loc[
157
- stock_irm_cninfo_df['answer_time'].str.contains('小时前', na=False), 'answer_time'] = str_now_date
158
- stock_irm_cninfo_df.loc[
159
- stock_irm_cninfo_df['answer_time'].str.contains('分钟前', na=False), 'answer_time'] = str_now_date
160
- stock_irm_cninfo_df.loc[
161
- stock_irm_cninfo_df['question_time'].str.contains('小时前', na=False), 'question_time'] = str_now_date
162
- stock_irm_cninfo_df.loc[
163
- stock_irm_cninfo_df['question_time'].str.contains('分钟前', na=False), 'answer_time'] = str_now_date
170
+
164
171
  stock_irm_cninfo_df['valid'] = True
165
172
  stock_irm_cninfo_df['answer_content'].fillna('')
166
173
  # 保存新增数据
@@ -172,6 +179,7 @@ def sync_all_interactive_questions(symbol_list):
172
179
  logger.error("同步互动问题出现异常:{},{}", stock_one.symbol, e)
173
180
 
174
181
 
182
+ # 保存新增回答数据
175
183
  def save_new_data(stock_irm_cninfo_df):
176
184
  if data_frame_util.is_empty(stock_irm_cninfo_df):
177
185
  return None
@@ -191,6 +199,10 @@ def save_new_data(stock_irm_cninfo_df):
191
199
 
192
200
 
193
201
  if __name__ == '__main__':
194
- fail_symbol_list_01 = ['000638', '002886', '688778', '688766', '688733', '688778', '688793', '688787']
202
+ get_stock_irm_cninfo_sz_api('000002')
203
+ sync_symbols_interactive_questions([])
204
+ # sync_symbols_interactive_questions([])
205
+ # get_stock_irm_cninfo_sh_api('688778')
206
+ # fail_symbol_list_01 = ['000638', '002886', '688778', '688766', '688733', '688778', '688793', '688787']
195
207
  # get_stock_irm_cninfo_sh_api('603633')
196
- sync_all_interactive_questions(None)
208
+ # sync_symbols_interactive_questions(None)
@@ -0,0 +1,169 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+
9
+ """
10
+ """
11
+
12
+ from functools import lru_cache
13
+ import pandas as pd
14
+ import requests
15
+ from bs4 import BeautifulSoup
16
+ from mns_common.db.MongodbUtil import MongodbUtil
17
+ import mns_common.constant.db_name_constant as db_name_constant
18
+ import mns_common.component.common_service_fun_api as common_service_fun_api
19
+ import mns_common.component.em.em_stock_info_api as em_stock_info_api
20
+ import mns_common.component.company.company_common_service_api as company_common_service_api
21
+ from loguru import logger
22
+ import mns_common.utils.data_frame_util as data_frame_util
23
+ from datetime import datetime, timedelta
24
+
25
+ mongodb_util = MongodbUtil('27017')
26
+ from tqdm import tqdm
27
+
28
+
29
+ # 同步所有映射表
30
+ @lru_cache()
31
+ def sync_stock_uid() -> pd.DataFrame:
32
+ """
33
+ 上证e互动-代码ID映射
34
+ https://sns.sseinfo.com/list/company.do
35
+ :return: 代码ID映射
36
+ :rtype: str
37
+ """
38
+ url = "https://sns.sseinfo.com/allcompany.do"
39
+ data = {
40
+ "code": "0",
41
+ "order": "2",
42
+ "areaId": "0",
43
+ "page": "1",
44
+ }
45
+ uid_list = list()
46
+ code_list = list()
47
+ for page in tqdm(range(1, 74), leave=False):
48
+ data.update({"page": page})
49
+ r = requests.post(url, data=data)
50
+ data_json = r.json()
51
+ soup = BeautifulSoup(data_json["content"], "lxml")
52
+ soup.find_all("a", attrs={"rel": "tag"})
53
+ uid_list.extend(
54
+ [item["uid"] for item in soup.find_all("a", attrs={"rel": "tag"})]
55
+ )
56
+ code_list.extend(
57
+ [
58
+ item.find("img")["src"].split("?")[0].split("/")[-1].split(".")[0]
59
+ for item in soup.find_all("a", attrs={"rel": "tag"})
60
+ ]
61
+ )
62
+ code_uid_df = pd.DataFrame()
63
+ code_uid_df['symbol'] = code_list
64
+ code_uid_df['uid'] = uid_list
65
+ code_uid_df['_id'] = uid_list
66
+ return code_uid_df
67
+
68
+
69
+ # 获取上海问答id
70
+ @lru_cache()
71
+ def get_sh_stock_all_uid() -> pd.DataFrame:
72
+ return mongodb_util.find_all_data(db_name_constant.SH_INFO_UID)
73
+
74
+
75
+ # 获取深圳问答id
76
+ @lru_cache()
77
+ def get_sz_stock_all_uid() -> pd.DataFrame:
78
+ return mongodb_util.find_all_data(db_name_constant.SZ_INFO_UID)
79
+
80
+
81
+ # 获取深圳互动回答单个ID
82
+ def get_one_sz_symbol_org_id(symbol):
83
+ sz_info_uid_df = get_sz_stock_all_uid()
84
+ sz_info_uid_one_df = sz_info_uid_df.loc[sz_info_uid_df['symbol'] == symbol]
85
+ if data_frame_util.is_not_empty(sz_info_uid_one_df):
86
+ return list(sz_info_uid_one_df['uid'])[0]
87
+ else:
88
+ try:
89
+ return fetch_sz_org_id(symbol)
90
+ except BaseException as e:
91
+ logger.error("获取组织代码异常:{},{}", symbol, e)
92
+ return '0'
93
+
94
+
95
+ # 获取上海互动回答单个ID
96
+ def get_one_sh_symbol_org_id(symbol):
97
+ sh_info_uid_df = get_sh_stock_all_uid()
98
+ sh_info_uid_one_df = sh_info_uid_df.loc[sh_info_uid_df['symbol'] == symbol]
99
+ if data_frame_util.is_not_empty(sh_info_uid_one_df):
100
+ return list(sh_info_uid_one_df['uid'])[0]
101
+ else:
102
+ return '0'
103
+
104
+
105
+ # 深圳股票-互动易-组织代码 单个获取
106
+ def fetch_sz_org_id(symbol: str = "000001") -> str:
107
+ """
108
+ 股票-互动易-组织代码
109
+ https://irm.cninfo.com.cn/
110
+ :return: 组织代码
111
+ :rtype: str
112
+ """
113
+ url = "https://irm.cninfo.com.cn/newircs/index/queryKeyboardInfo"
114
+ params = {"_t": "1691144074"}
115
+ data = {"keyWord": symbol}
116
+ r = requests.post(url, params=params, data=data)
117
+ data_json = r.json()
118
+ org_id = data_json["data"][0]["secid"]
119
+ return org_id
120
+
121
+
122
+ # 同步上证互动uid
123
+ def sync_sh_stock_uid():
124
+ code_uid_df = sync_stock_uid()
125
+ mongodb_util.save_mongo(code_uid_df, db_name_constant.SH_INFO_UID)
126
+
127
+
128
+ # 同步深圳互动uid
129
+ def sync_sz_stock_uid(symbol_list):
130
+ real_time_quotes_all_stocks = em_stock_info_api.get_a_stock_info()
131
+ de_list_company_symbols = company_common_service_api.get_de_list_company()
132
+ real_time_quotes_all_stocks = real_time_quotes_all_stocks.loc[
133
+ ~(real_time_quotes_all_stocks['symbol'].isin(de_list_company_symbols))]
134
+ real_time_quotes_all_stocks = common_service_fun_api.classify_symbol(real_time_quotes_all_stocks)
135
+
136
+ real_time_quotes_all_stocks = real_time_quotes_all_stocks.loc[
137
+ real_time_quotes_all_stocks['classification'].isin(['S', 'C'])]
138
+ if len(symbol_list) != 0:
139
+ real_time_quotes_all_stocks = real_time_quotes_all_stocks.loc[
140
+ real_time_quotes_all_stocks['symbol'].isin(symbol_list)]
141
+ else:
142
+ # 获取当前时间
143
+ now_date = datetime.now()
144
+ # 计算前7天的时间(timedelta 用于表示时间间隔)
145
+ seven_days_ago = now_date - timedelta(days=30)
146
+ str_day_number = int(seven_days_ago.strftime('%Y%m%d'))
147
+ real_time_quotes_all_stocks = real_time_quotes_all_stocks.loc[
148
+ (real_time_quotes_all_stocks['list_date'] >= str_day_number) | (
149
+ real_time_quotes_all_stocks['list_date'] == 19890604)]
150
+ for stock_one in real_time_quotes_all_stocks.itertuples():
151
+ try:
152
+ symbol = stock_one.symbol
153
+ uid = fetch_sz_org_id(symbol)
154
+ result_dict = {'_id': symbol, 'symbol': symbol, 'uid': uid}
155
+ result_dict_df = pd.DataFrame(result_dict, index=[1])
156
+ mongodb_util.save_mongo(result_dict_df, db_name_constant.SZ_INFO_UID)
157
+ logger.info("同步SZ互动ID:{}", stock_one.symbol)
158
+ except Exception as e:
159
+ logger.error("同步SZ互动ID异常:{},{}", stock_one.symbol, e)
160
+
161
+
162
+ if __name__ == '__main__':
163
+ sz_symbol_org_id = get_one_sz_symbol_org_id('300085')
164
+ sh_symbol_org_id = get_one_sh_symbol_org_id('600000')
165
+ print(sz_symbol_org_id)
166
+ print(sh_symbol_org_id)
167
+ sync_sz_stock_uid([])
168
+ # sync_sz_stock_uid([])
169
+ # sync_sh_stock_uid([])
@@ -2,6 +2,6 @@ import sys
2
2
  import os
3
3
 
4
4
  file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
5
+ end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)