akshare 1.14.49__py3-none-any.whl → 1.17.99__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 (343) hide show
  1. akshare/__init__.py +595 -129
  2. akshare/air/air_hebei.py +77 -54
  3. akshare/air/air_zhenqi.py +0 -4
  4. akshare/air/cons.py +1 -0
  5. akshare/air/crypto.js +1 -1
  6. akshare/air/outcrypto.js +1 -1
  7. akshare/article/cons.py +1 -0
  8. akshare/article/epu_index.py +4 -3
  9. akshare/article/ff_factor.py +19 -8
  10. akshare/article/fred_md.py +4 -1
  11. akshare/article/risk_rv.py +3 -8
  12. akshare/bank/bank_cbirc_2020.py +11 -11
  13. akshare/bank/cons.py +7 -6
  14. akshare/bond/bond_buy_back_em.py +228 -0
  15. akshare/bond/bond_cb_sina.py +1 -0
  16. akshare/bond/bond_cb_ths.py +17 -9
  17. akshare/bond/bond_cbond.py +19 -14
  18. akshare/bond/bond_china.py +38 -39
  19. akshare/bond/bond_china_money.py +1 -1
  20. akshare/bond/bond_convert.py +10 -9
  21. akshare/bond/bond_em.py +37 -17
  22. akshare/bond/bond_summary.py +38 -37
  23. akshare/bond/bond_zh_cov.py +31 -40
  24. akshare/bond/bond_zh_sina.py +4 -0
  25. akshare/bond/cons.py +14 -11
  26. akshare/cal/__init__.py +0 -0
  27. akshare/cal/rv.py +170 -0
  28. akshare/cost/cost_living.py +7 -5
  29. akshare/crypto/__init__.py +1 -1
  30. akshare/crypto/crypto_bitcoin_cme.py +9 -7
  31. akshare/crypto/crypto_hold.py +4 -2
  32. akshare/currency/currency.py +1 -0
  33. akshare/currency/currency_china_bank_sina.py +11 -6
  34. akshare/data/__init__.py +1 -1
  35. akshare/data/cninfo.js +1 -1
  36. akshare/datasets.py +10 -21
  37. akshare/economic/cons.py +10 -3
  38. akshare/economic/macro_australia.py +74 -69
  39. akshare/economic/macro_bank.py +95 -653
  40. akshare/economic/macro_canada.py +92 -81
  41. akshare/economic/macro_china.py +97 -105
  42. akshare/economic/macro_china_hk.py +0 -1
  43. akshare/economic/macro_euro.py +103 -56
  44. akshare/economic/macro_finance_ths.py +7 -5
  45. akshare/economic/macro_germany.py +1 -1
  46. akshare/economic/macro_japan.py +0 -1
  47. akshare/economic/macro_other.py +1 -6
  48. akshare/economic/macro_swiss.py +2 -3
  49. akshare/economic/macro_uk.py +1 -1
  50. akshare/economic/macro_usa.py +7 -9
  51. akshare/economic/marco_cnbs.py +11 -6
  52. akshare/energy/energy_carbon.py +0 -1
  53. akshare/energy/energy_oil_em.py +1 -2
  54. akshare/event/cons.py +1 -0
  55. akshare/exceptions.py +43 -0
  56. akshare/file_fold/calendar.json +245 -2
  57. akshare/forex/__init__.py +0 -0
  58. akshare/forex/cons.py +192 -0
  59. akshare/forex/forex_em.py +149 -0
  60. akshare/fortune/fortune_500.py +1 -37
  61. akshare/fortune/fortune_bloomberg.py +6 -3
  62. akshare/fortune/fortune_forbes_500.py +3 -6
  63. akshare/fortune/fortune_hurun.py +2 -1
  64. akshare/fortune/fortune_xincaifu_500.py +17 -14
  65. akshare/fund/fund_announcement_em.py +145 -0
  66. akshare/fund/fund_aum_em.py +49 -35
  67. akshare/fund/fund_em.py +251 -220
  68. akshare/fund/fund_etf_em.py +44 -35
  69. akshare/fund/fund_etf_sina.py +75 -27
  70. akshare/fund/fund_etf_ths.py +2 -0
  71. akshare/fund/fund_fee_em.py +172 -0
  72. akshare/fund/fund_fhsp_em.py +42 -32
  73. akshare/fund/fund_init_em.py +8 -5
  74. akshare/fund/fund_lof_em.py +12 -19
  75. akshare/fund/fund_manager.py +25 -11
  76. akshare/fund/fund_overview_em.py +42 -0
  77. akshare/fund/fund_portfolio_em.py +23 -21
  78. akshare/fund/fund_position_lg.py +19 -8
  79. akshare/fund/fund_rank_em.py +2 -5
  80. akshare/fund/fund_rating.py +33 -12
  81. akshare/fund/fund_scale_em.py +24 -13
  82. akshare/fund/fund_scale_sina.py +20 -10
  83. akshare/fund/fund_xq.py +3 -2
  84. akshare/futures/cons.py +135 -39
  85. akshare/futures/cot.py +55 -56
  86. akshare/futures/futures_basis.py +49 -11
  87. akshare/futures/futures_comex_em.py +1 -0
  88. akshare/futures/futures_comm_ctp.py +1 -1
  89. akshare/futures/futures_contract_detail.py +59 -9
  90. akshare/futures/futures_daily_bar.py +66 -59
  91. akshare/futures/futures_foreign.py +14 -8
  92. akshare/futures/futures_hf_em.py +215 -61
  93. akshare/futures/futures_hist_em.py +191 -0
  94. akshare/futures/futures_hq_sina.py +5 -3
  95. akshare/futures/futures_index_ccidx.py +24 -82
  96. akshare/futures/futures_inventory_99.py +70 -272
  97. akshare/futures/futures_inventory_em.py +14 -11
  98. akshare/futures/futures_news_shmet.py +2 -2
  99. akshare/futures/futures_roll_yield.py +11 -24
  100. akshare/futures/futures_rule.py +7 -3
  101. akshare/futures/futures_rule_em.py +38 -0
  102. akshare/futures/futures_settlement_price_sgx.py +21 -6
  103. akshare/futures/futures_stock_js.py +0 -1
  104. akshare/futures/futures_to_spot.py +5 -6
  105. akshare/futures/futures_warehouse_receipt.py +48 -47
  106. akshare/futures/futures_zh_sina.py +3 -3
  107. akshare/futures/receipt.py +298 -165
  108. akshare/futures/requests_fun.py +16 -3
  109. akshare/futures/symbol_var.py +32 -13
  110. akshare/futures_derivative/cons.py +100 -103
  111. akshare/futures_derivative/futures_contract_info_cffex.py +55 -39
  112. akshare/futures_derivative/futures_contract_info_czce.py +2 -0
  113. akshare/futures_derivative/futures_contract_info_dce.py +43 -17
  114. akshare/futures_derivative/futures_contract_info_gfex.py +43 -31
  115. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  116. akshare/futures_derivative/futures_contract_info_shfe.py +3 -4
  117. akshare/futures_derivative/futures_cot_sina.py +8 -6
  118. akshare/futures_derivative/futures_index_sina.py +25 -13
  119. akshare/fx/cons.py +12 -7
  120. akshare/fx/fx_c_swap_cm.py +62 -0
  121. akshare/fx/fx_quote.py +3 -2
  122. akshare/fx/fx_quote_baidu.py +2 -1
  123. akshare/hf/__init__.py +1 -1
  124. akshare/hf/hf_sp500.py +8 -7
  125. akshare/index/cons.py +132 -28
  126. akshare/index/index_cni.py +7 -7
  127. akshare/index/index_cons.py +2 -2
  128. akshare/index/index_csindex.py +68 -0
  129. akshare/index/index_cx.py +20 -20
  130. akshare/index/index_drewry.py +17 -16
  131. akshare/index/index_eri.py +1 -0
  132. akshare/index/index_global_em.py +167 -0
  133. akshare/index/index_global_sina.py +82 -0
  134. akshare/index/index_kq_fz.py +17 -14
  135. akshare/index/index_kq_ss.py +1 -0
  136. akshare/index/index_option_qvix.py +351 -16
  137. akshare/index/index_research_sw.py +21 -21
  138. akshare/index/index_spot.py +9 -5
  139. akshare/index/index_stock_hk.py +5 -9
  140. akshare/index/index_stock_zh.py +111 -24
  141. akshare/index/index_stock_zh_csindex.py +3 -367
  142. akshare/index/index_sugar.py +18 -4
  143. akshare/index/index_sw.py +10 -2
  144. akshare/index/index_yw.py +53 -75
  145. akshare/index/index_zh_em.py +15 -82
  146. akshare/interest_rate/interbank_rate_em.py +0 -1
  147. akshare/movie/jm.js +0 -1
  148. akshare/news/__init__.py +1 -1
  149. akshare/news/news_baidu.py +395 -222
  150. akshare/news/news_stock.py +49 -16
  151. akshare/option/cons.py +2 -2
  152. akshare/option/option_commodity.py +341 -220
  153. akshare/option/option_commodity_sina.py +22 -26
  154. akshare/option/option_contract_info_ctp.py +63 -0
  155. akshare/option/option_current_sse.py +61 -0
  156. akshare/option/option_current_szse.py +84 -0
  157. akshare/option/option_czce.py +37 -9
  158. akshare/option/option_daily_stats_sse_szse.py +0 -1
  159. akshare/option/option_em.py +4 -8
  160. akshare/option/option_finance.py +60 -12
  161. akshare/option/option_finance_sina.py +7 -7
  162. akshare/option/option_lhb_em.py +0 -1
  163. akshare/option/option_margin.py +62 -0
  164. akshare/option/option_premium_analysis_em.py +58 -53
  165. akshare/option/option_risk_analysis_em.py +11 -8
  166. akshare/option/option_risk_indicator_sse.py +3 -4
  167. akshare/option/option_value_analysis_em.py +62 -55
  168. akshare/other/__init__.py +1 -1
  169. akshare/pro/__init__.py +0 -1
  170. akshare/pro/client.py +6 -4
  171. akshare/pro/cons.py +3 -2
  172. akshare/pro/data_pro.py +6 -5
  173. akshare/qdii/__init__.py +0 -0
  174. akshare/qdii/qdii_jsl.py +233 -0
  175. akshare/qhkc/__init__.py +1 -6
  176. akshare/qhkc/qhkc_api.py +64 -22
  177. akshare/qhkc_web/__init__.py +1 -6
  178. akshare/qhkc_web/qhkc_fund.py +10 -6
  179. akshare/qhkc_web/qhkc_index.py +28 -14
  180. akshare/qhkc_web/qhkc_tool.py +62 -59
  181. akshare/rate/__init__.py +1 -1
  182. akshare/rate/repo_rate.py +36 -32
  183. akshare/reits/__init__.py +1 -1
  184. akshare/reits/reits_basic.py +149 -13
  185. akshare/request.py +117 -0
  186. akshare/spot/__init__.py +1 -1
  187. akshare/spot/spot_hog_soozhu.py +165 -3
  188. akshare/spot/spot_sge.py +70 -9
  189. akshare/stock/cons.py +60 -23
  190. akshare/stock/stock_allotment_cninfo.py +8 -8
  191. akshare/stock/stock_ask_bid_em.py +3 -78
  192. akshare/stock/stock_board_concept_em.py +160 -35
  193. akshare/stock/stock_board_industry_em.py +163 -70
  194. akshare/stock/stock_dividend_cninfo.py +31 -17
  195. akshare/stock/stock_dzjy_em.py +347 -260
  196. akshare/stock/stock_fund_em.py +72 -64
  197. akshare/stock/stock_fund_hold.py +1 -2
  198. akshare/stock/stock_gsrl_em.py +1 -0
  199. akshare/stock/stock_hk_comparison_em.py +175 -0
  200. akshare/stock/stock_hk_famous.py +4 -5
  201. akshare/stock/stock_hk_fhpx_ths.py +2 -1
  202. akshare/stock/stock_hk_hot_rank_em.py +1 -0
  203. akshare/stock/stock_hk_sina.py +84 -36
  204. akshare/stock/stock_hold_control_cninfo.py +82 -0
  205. akshare/stock/stock_hold_control_em.py +0 -2
  206. akshare/stock/stock_hot_rank_em.py +4 -1
  207. akshare/stock/stock_hot_search_baidu.py +32 -19
  208. akshare/stock/stock_hot_up_em.py +4 -1
  209. akshare/stock/stock_hsgt_em.py +155 -0
  210. akshare/stock/stock_industry.py +1 -0
  211. akshare/stock/stock_industry_cninfo.py +1 -2
  212. akshare/stock/stock_info.py +6 -4
  213. akshare/stock/stock_info_em.py +17 -11
  214. akshare/stock/stock_intraday_em.py +4 -78
  215. akshare/stock/stock_intraday_sina.py +2 -2
  216. akshare/stock/stock_news_cx.py +39 -0
  217. akshare/stock/stock_profile_cninfo.py +7 -7
  218. akshare/stock/stock_profile_em.py +302 -0
  219. akshare/stock/stock_rank_forecast.py +6 -5
  220. akshare/stock/stock_repurchase_em.py +7 -2
  221. akshare/stock/stock_share_changes_cninfo.py +7 -5
  222. akshare/stock/stock_share_hold.py +24 -20
  223. akshare/stock/stock_stop.py +6 -6
  224. akshare/stock/stock_summary.py +153 -417
  225. akshare/stock/stock_us_famous.py +5 -6
  226. akshare/stock/stock_us_js.py +3 -2
  227. akshare/stock/stock_us_pink.py +38 -27
  228. akshare/stock/stock_us_sina.py +7 -3
  229. akshare/stock/stock_weibo_nlp.py +18 -20
  230. akshare/stock/stock_xq.py +24 -22
  231. akshare/stock/stock_zh_a_sina.py +8 -5
  232. akshare/stock/stock_zh_a_special.py +240 -243
  233. akshare/stock/stock_zh_a_tick_tx.py +11 -3
  234. akshare/stock/stock_zh_ah_tx.py +23 -26
  235. akshare/stock/stock_zh_b_sina.py +2 -2
  236. akshare/stock/stock_zh_comparison_em.py +250 -0
  237. akshare/stock/stock_zh_kcb_sina.py +67 -64
  238. akshare/stock_a/__init__.py +0 -0
  239. akshare/stock_a/stock_board_concept_name_em.py +170 -0
  240. akshare/stock_a/stock_individual_fund_flow_rank.py +258 -0
  241. akshare/stock_a/stock_zh_a_spot.py +212 -0
  242. akshare/stock_feature/cons.py +1 -0
  243. akshare/stock_feature/stock_a_indicator.py +9 -54
  244. akshare/stock_feature/stock_a_pe_and_pb.py +23 -5
  245. akshare/stock_feature/stock_account_em.py +0 -1
  246. akshare/stock_feature/stock_all_pb.py +2 -1
  247. akshare/stock_feature/stock_analyst_em.py +36 -30
  248. akshare/stock_feature/stock_board_concept_ths.py +328 -0
  249. akshare/stock_feature/stock_board_industry_ths.py +57 -2
  250. akshare/stock_feature/stock_buffett_index_lg.py +10 -8
  251. akshare/stock_feature/stock_classify_sina.py +3 -6
  252. akshare/stock_feature/stock_comment_em.py +81 -144
  253. akshare/stock_feature/stock_congestion_lg.py +2 -1
  254. akshare/stock_feature/stock_cyq_em.py +5 -11
  255. akshare/stock_feature/stock_disclosure_cninfo.py +6 -6
  256. akshare/stock_feature/stock_dxsyl_em.py +121 -74
  257. akshare/stock_feature/stock_ebs_lg.py +5 -4
  258. akshare/stock_feature/stock_esg_sina.py +29 -7
  259. akshare/stock_feature/stock_fhps_em.py +2 -1
  260. akshare/stock_feature/stock_fhps_ths.py +15 -7
  261. akshare/stock_feature/stock_fund_flow.py +30 -22
  262. akshare/stock_feature/stock_gddh_em.py +19 -11
  263. akshare/stock_feature/stock_gdfx_em.py +226 -113
  264. akshare/stock_feature/stock_gdhs.py +75 -50
  265. akshare/stock_feature/stock_gdzjc_em.py +21 -10
  266. akshare/stock_feature/stock_gpzy_em.py +78 -46
  267. akshare/stock_feature/stock_gxl_lg.py +3 -2
  268. akshare/stock_feature/stock_hist_em.py +137 -234
  269. akshare/stock_feature/stock_hist_tx.py +13 -10
  270. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  271. akshare/stock_feature/stock_hot_xq.py +4 -6
  272. akshare/stock_feature/stock_hsgt_em.py +269 -97
  273. akshare/stock_feature/stock_hsgt_exchange_rate.py +115 -87
  274. akshare/stock_feature/stock_hsgt_min_em.py +13 -16
  275. akshare/stock_feature/stock_info.py +7 -80
  276. akshare/stock_feature/stock_inner_trade_xq.py +38 -31
  277. akshare/stock_feature/stock_jgdy_em.py +43 -40
  278. akshare/stock_feature/stock_lhb_em.py +119 -3
  279. akshare/stock_feature/stock_margin_em.py +0 -1
  280. akshare/stock_feature/stock_margin_sse.py +0 -2
  281. akshare/stock_feature/stock_pankou_em.py +71 -35
  282. akshare/stock_feature/stock_qsjy_em.py +13 -4
  283. akshare/stock_feature/stock_report_em.py +151 -7
  284. akshare/stock_feature/stock_research_report_em.py +55 -20
  285. akshare/stock_feature/stock_sy_em.py +20 -15
  286. akshare/stock_feature/stock_technology_ths.py +122 -77
  287. akshare/stock_feature/stock_tfp_em.py +2 -1
  288. akshare/stock_feature/stock_three_report_em.py +21 -5
  289. akshare/stock_feature/stock_ttm_lyr.py +18 -9
  290. akshare/stock_feature/stock_value_em.py +83 -0
  291. akshare/stock_feature/stock_yjbb_em.py +58 -32
  292. akshare/stock_feature/stock_yjyg_cninfo.py +6 -2
  293. akshare/stock_feature/stock_yjyg_em.py +1 -1
  294. akshare/stock_feature/stock_yzxdr_em.py +24 -22
  295. akshare/stock_feature/stock_zdhtmx_em.py +20 -6
  296. akshare/stock_feature/stock_zh_vote_baidu.py +4 -1
  297. akshare/stock_feature/stock_ztb_em.py +39 -24
  298. akshare/stock_fundamental/__init__.py +1 -1
  299. akshare/stock_fundamental/stock_basic_info_xq.py +119 -0
  300. akshare/stock_fundamental/{stock_finance_hk.py → stock_finance_hk_em.py} +23 -16
  301. akshare/stock_fundamental/{stock_finance.py → stock_finance_sina.py} +60 -7
  302. akshare/stock_fundamental/stock_finance_ths.py +524 -57
  303. akshare/stock_fundamental/stock_finance_us_em.py +268 -0
  304. akshare/stock_fundamental/stock_gbjg_em.py +80 -0
  305. akshare/stock_fundamental/stock_hold.py +26 -17
  306. akshare/stock_fundamental/stock_ipo_declare.py +1 -0
  307. akshare/stock_fundamental/stock_kcb_detail_sse.py +10 -10
  308. akshare/stock_fundamental/stock_kcb_sse.py +26 -25
  309. akshare/stock_fundamental/stock_notice.py +12 -3
  310. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  311. akshare/stock_fundamental/stock_profit_forecast_hk_etnet.py +64 -41
  312. akshare/stock_fundamental/stock_profit_forecast_ths.py +86 -35
  313. akshare/stock_fundamental/stock_recommend.py +20 -4
  314. akshare/stock_fundamental/stock_zygc.py +5 -62
  315. akshare/utils/context.py +43 -0
  316. akshare/utils/demjson.py +2009 -1338
  317. akshare/utils/func.py +49 -2
  318. akshare/utils/multi_decrypt.py +53 -0
  319. akshare/utils/token_process.py +6 -5
  320. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/METADATA +54 -80
  321. akshare-1.17.99.dist-info/RECORD +409 -0
  322. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/WHEEL +1 -1
  323. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info/licenses}/LICENSE +1 -1
  324. tests/test_func.py +3 -5
  325. akshare/bond/bond_futures.py +0 -50
  326. akshare/bond/bond_investing.py +0 -139
  327. akshare/crypto/crypto_hist_investing.py +0 -249
  328. akshare/fund/fund_announcement.py +0 -56
  329. akshare/futures/futures_international.py +0 -170
  330. akshare/futures/futures_news_baidu.py +0 -54
  331. akshare/futures/inventory_data.py +0 -100
  332. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  333. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  334. akshare/futures_derivative/futures_index_volatility_nh.py +0 -53
  335. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  336. akshare/index/index_fear_greed_funddb.py +0 -78
  337. akshare/index/index_investing.py +0 -232
  338. akshare/sport/__init__.py +0 -6
  339. akshare/sport/sport_olympic.py +0 -27
  340. akshare/stock_feature/stock_wencai.py +0 -104
  341. akshare/stock_fundamental/stock_mda_ym.py +0 -40
  342. akshare-1.14.49.dist-info/RECORD +0 -387
  343. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/4/25 20:24
4
+ Date: 2025/10/30 20:24
5
5
  Desc: 市盈率, 市净率和股息率查询
6
6
  https://www.legulegu.com/stocklist
7
7
  https://www.legulegu.com/s/000001
@@ -24,12 +24,17 @@ def get_cookie_csrf(url: str = "") -> dict:
24
24
  :return: 指定市场的市盈率数据
25
25
  :rtype: pandas.DataFrame
26
26
  """
27
- r = requests.get(url, headers=headers)
27
+ # 创建独立的 session,避免污染全局状态
28
+ session = requests.Session()
29
+ session.headers.update(headers)
30
+ r = session.get(url)
28
31
  soup = BeautifulSoup(r.text, features="lxml")
29
32
  csrf_tag = soup.find(name="meta", attrs={"name": "_csrf"})
30
33
  csrf_token = csrf_tag.attrs["content"]
31
- headers.update({"X-CSRF-Token": csrf_token})
32
- return {"cookies": r.cookies, "headers": headers}
34
+ # 创建新的 headers
35
+ local_headers = headers.copy()
36
+ local_headers.update({"X-CSRF-Token": csrf_token})
37
+ return {"cookies": r.cookies, "headers": local_headers}
33
38
 
34
39
 
35
40
  def get_token_lg() -> str:
@@ -46,50 +51,6 @@ def get_token_lg() -> str:
46
51
  return token
47
52
 
48
53
 
49
- def stock_a_indicator_lg(symbol: str = "000001") -> pd.DataFrame:
50
- """
51
- 市盈率, 市净率, 股息率数据接口
52
- https://legulegu.com/stocklist
53
- :param symbol: 通过 ak.stock_a_indicator_lg(symbol="all") 来获取所有股票的代码
54
- :type symbol: str
55
- :return: 市盈率, 市净率, 股息率查询
56
- :rtype: pandas.DataFrame
57
- """
58
- if symbol == "all":
59
- url = "https://legulegu.com/stocklist"
60
- r = requests.get(url, headers=headers)
61
- soup = BeautifulSoup(r.text, features="lxml")
62
- node_list = soup.find_all(attrs={"class": "col-xs-6"})
63
- href_list = [item.find("a")["href"] for item in node_list]
64
- title_list = [item.find("a")["title"] for item in node_list]
65
- temp_df = pd.DataFrame([title_list, href_list]).T
66
- temp_df.columns = ["stock_name", "short_url"]
67
- temp_df["code"] = temp_df["short_url"].str.split("/", expand=True).iloc[:, -1]
68
- del temp_df["short_url"]
69
- temp_df = temp_df[["code", "stock_name"]]
70
- return temp_df
71
- else:
72
- url = "https://legulegu.com/api/s/base-info/"
73
- token = get_token_lg()
74
- params = {"token": token, "id": symbol}
75
- r = requests.post(
76
- url,
77
- params=params,
78
- **get_cookie_csrf(url="https://legulegu.com/"),
79
- )
80
- temp_json = r.json()
81
- temp_df = pd.DataFrame(
82
- temp_json["data"]["items"],
83
- columns=temp_json["data"]["fields"],
84
- )
85
- temp_df["trade_date"] = pd.to_datetime(temp_df["trade_date"]).dt.date
86
- temp_df[temp_df.columns[1:]] = temp_df[temp_df.columns[1:]].astype(float)
87
- temp_df.sort_values(by=["trade_date"], inplace=True, ignore_index=True)
88
- if len(set(temp_df["trade_date"])) <= 0:
89
- raise ValueError("数据获取失败, 请检查是否输入正确的股票代码")
90
- return temp_df
91
-
92
-
93
54
  def stock_hk_indicator_eniu(
94
55
  symbol: str = "hk01093", indicator: str = "市盈率"
95
56
  ) -> pd.DataFrame:
@@ -128,12 +89,6 @@ def stock_hk_indicator_eniu(
128
89
 
129
90
 
130
91
  if __name__ == "__main__":
131
- stock_a_indicator_lg_all_df = stock_a_indicator_lg(symbol="all")
132
- print(stock_a_indicator_lg_all_df)
133
-
134
- stock_a_indicator_lg_df = stock_a_indicator_lg(symbol="000001")
135
- print(stock_a_indicator_lg_df)
136
-
137
92
  stock_hk_indicator_eniu_df = stock_hk_indicator_eniu(
138
93
  symbol="hk01093", indicator="市盈率"
139
94
  )
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/4/25 22:30
4
+ Date: 2025/3/20 20:00
5
5
  Desc: 乐咕乐股-A 股市盈率和市净率
6
6
  https://legulegu.com/stockdata/shanghaiPE
7
7
  """
@@ -9,8 +9,8 @@ https://legulegu.com/stockdata/shanghaiPE
9
9
  from datetime import datetime
10
10
 
11
11
  import pandas as pd
12
- import requests
13
12
  import py_mini_racer
13
+ import requests
14
14
 
15
15
  from akshare.stock_feature.stock_a_indicator import get_cookie_csrf
16
16
 
@@ -317,9 +317,6 @@ function E(n, e, t, r, o, f, i) {
317
317
  return A(t ^ (e | ~r), n, e, o, f, i)
318
318
  }
319
319
  """
320
- js_functions = py_mini_racer.MiniRacer()
321
- js_functions.eval(hash_code)
322
- token = js_functions.call("hex", datetime.now().date().isoformat()).lower()
323
320
 
324
321
 
325
322
  def stock_market_pe_lg(symbol: str = "深证") -> pd.DataFrame:
@@ -331,6 +328,9 @@ def stock_market_pe_lg(symbol: str = "深证") -> pd.DataFrame:
331
328
  :return: 指定市场的市盈率数据
332
329
  :rtype: pandas.DataFrame
333
330
  """
331
+ js_functions = py_mini_racer.MiniRacer()
332
+ js_functions.eval(hash_code)
333
+ token = js_functions.call("hex", datetime.now().date().isoformat()).lower()
334
334
  if symbol in {"上证", "深证", "创业板"}:
335
335
  url = "https://legulegu.com/api/stock-data/market-pe"
336
336
  symbol_map = {
@@ -404,6 +404,9 @@ def stock_index_pe_lg(symbol: str = "沪深300") -> pd.DataFrame:
404
404
  :return: 指定指数的市盈率数据
405
405
  :rtype: pandas.DataFrame
406
406
  """
407
+ js_functions = py_mini_racer.MiniRacer()
408
+ js_functions.eval(hash_code)
409
+ token = js_functions.call("hex", datetime.now().date().isoformat()).lower()
407
410
  symbol_map = {
408
411
  "上证50": "000016.SH",
409
412
  "沪深300": "000300.SH",
@@ -466,6 +469,9 @@ def stock_market_pb_lg(symbol: str = "上证") -> pd.DataFrame:
466
469
  :return: 指定市场的市净率数据
467
470
  :rtype: pandas.DataFrame
468
471
  """
472
+ js_functions = py_mini_racer.MiniRacer()
473
+ js_functions.eval(hash_code)
474
+ token = js_functions.call("hex", datetime.now().date().isoformat()).lower()
469
475
  url = "https://legulegu.com/api/stockdata/index-basic-pb"
470
476
  symbol_map = {"上证": "1", "深证": "2", "创业板": "4", "科创版": "7"}
471
477
  url_map = {
@@ -511,6 +517,9 @@ def stock_index_pb_lg(symbol: str = "上证50") -> pd.DataFrame:
511
517
  :return: 指定指数的市净率数据
512
518
  :rtype: pandas.DataFrame
513
519
  """
520
+ js_functions = py_mini_racer.MiniRacer()
521
+ js_functions.eval(hash_code)
522
+ token = js_functions.call("hex", datetime.now().date().isoformat()).lower()
514
523
  symbol_map = {
515
524
  "上证50": "000016.SH",
516
525
  "沪深300": "000300.SH",
@@ -559,10 +568,19 @@ def stock_index_pb_lg(symbol: str = "上证50") -> pd.DataFrame:
559
568
 
560
569
 
561
570
  if __name__ == "__main__":
571
+ stock_market_pe_lg_df = stock_market_pe_lg(symbol="上证")
572
+ print(stock_market_pe_lg_df)
573
+
574
+ stock_market_pe_lg_df = stock_market_pe_lg(symbol="科创版")
575
+ print(stock_market_pe_lg_df)
576
+
562
577
  for item in {"上证", "深证", "创业板", "科创版"}:
563
578
  stock_market_pe_lg_df = stock_market_pe_lg(symbol=item)
564
579
  print(stock_market_pe_lg_df)
565
580
 
581
+ stock_index_pe_lg_df = stock_index_pe_lg(symbol="上证50")
582
+ print(stock_index_pe_lg_df)
583
+
566
584
  for item in [
567
585
  "上证50",
568
586
  "沪深300",
@@ -31,7 +31,6 @@ def stock_account_statistics_em() -> pd.DataFrame:
31
31
  "pageNo": "1",
32
32
  "pageNum": "1",
33
33
  "pageNumber": "1",
34
- "_": "1640749656405",
35
34
  }
36
35
  r = requests.get(url, params=params)
37
36
  data_json = r.json()
@@ -5,6 +5,7 @@ Date: 2023/4/11 20:40
5
5
  Desc: 全部A股-等权重市净率、中位数市净率
6
6
  https://www.legulegu.com/stockdata/all-pb
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
 
@@ -26,7 +27,7 @@ def stock_a_all_pb() -> pd.DataFrame:
26
27
  r = requests.get(
27
28
  url,
28
29
  params=params,
29
- **get_cookie_csrf(url="https://legulegu.com/stockdata/all-pb")
30
+ **get_cookie_csrf(url="https://legulegu.com/stockdata/all-pb"),
30
31
  )
31
32
  data_json = r.json()
32
33
  temp_df = pd.DataFrame(data_json["data"])
@@ -5,12 +5,14 @@ Date: 2023/8/20 20:00
5
5
  Desc: 东方财富网-数据中心-研究报告-东方财富分析师指数
6
6
  https://data.eastmoney.com/invest/invest/list.html
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
- from tqdm import tqdm
11
+ from akshare.utils.tqdm import get_tqdm
12
+ from akshare.utils.cons import headers
11
13
 
12
14
 
13
- def stock_analyst_rank_em(year: str = "2023") -> pd.DataFrame:
15
+ def stock_analyst_rank_em(year: str = "2024") -> pd.DataFrame:
14
16
  """
15
17
  东方财富网-数据中心-研究报告-东方财富分析师指数-东方财富分析师指数
16
18
  https://data.eastmoney.com/invest/invest/list.html
@@ -20,9 +22,6 @@ def stock_analyst_rank_em(year: str = "2023") -> pd.DataFrame:
20
22
  :rtype: pandas.DataFrame
21
23
  """
22
24
  url = "https://data.eastmoney.com/dataapi/invest/list"
23
- headers = {
24
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
25
- }
26
25
  params = {
27
26
  "sortColumns": "YEAR_YIELD",
28
27
  "sortTypes": "-1",
@@ -40,12 +39,13 @@ def stock_analyst_rank_em(year: str = "2023") -> pd.DataFrame:
40
39
  data_json = r.json()
41
40
  total_page = data_json["result"]["pages"]
42
41
  big_df = pd.DataFrame()
42
+ tqdm = get_tqdm()
43
43
  for page in tqdm(range(1, total_page + 1), leave=False):
44
44
  params.update({"pageNumber": page})
45
45
  r = requests.get(url, params=params, headers=headers)
46
46
  data_json = r.json()
47
47
  data_df = pd.DataFrame(data_json["result"]["data"])
48
- big_df = pd.concat([big_df, data_df], ignore_index=True)
48
+ big_df = pd.concat(objs=[big_df, data_df], ignore_index=True)
49
49
 
50
50
  big_df.reset_index(inplace=True)
51
51
  big_df["index"] = list(range(1, len(big_df) + 1))
@@ -92,7 +92,9 @@ def stock_analyst_rank_em(year: str = "2023") -> pd.DataFrame:
92
92
  ]
93
93
  big_df["更新日期"] = pd.to_datetime(big_df["更新日期"], errors="coerce").dt.date
94
94
  big_df["年度指数"] = pd.to_numeric(big_df["年度指数"], errors="coerce")
95
- big_df[f"{year}年收益率"] = pd.to_numeric(big_df[f"{year}年收益率"], errors="coerce")
95
+ big_df[f"{year}年收益率"] = pd.to_numeric(
96
+ big_df[f"{year}年收益率"], errors="coerce"
97
+ )
96
98
  big_df["3个月收益率"] = pd.to_numeric(big_df["3个月收益率"], errors="coerce")
97
99
  big_df["6个月收益率"] = pd.to_numeric(big_df["6个月收益率"], errors="coerce")
98
100
  big_df["12个月收益率"] = pd.to_numeric(big_df["12个月收益率"], errors="coerce")
@@ -114,9 +116,6 @@ def stock_analyst_detail_em(
114
116
  :rtype: pandas.DataFrame
115
117
  """
116
118
  url = "https://datacenter.eastmoney.com/special/api/data/v1/get"
117
- headers = {
118
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
119
- }
120
119
  if indicator == "最新跟踪成分股":
121
120
  params = {
122
121
  "reportName": "RPT_RESEARCHER_NTCSTOCK",
@@ -128,11 +127,10 @@ def stock_analyst_detail_em(
128
127
  "pageNumber": "1",
129
128
  "pageSize": "1000",
130
129
  "filter": f'(ANALYST_CODE="{analyst_id}")',
131
- "_": "1675744438197",
132
130
  }
133
131
  r = requests.get(url, params=params, headers=headers)
134
132
  data_json = r.json()
135
- temp_df = pd.DataFrame(data_json["result"]['data'])
133
+ temp_df = pd.DataFrame(data_json["result"]["data"])
136
134
  temp_df.reset_index(inplace=True)
137
135
  temp_df["index"] = list(range(1, len(temp_df) + 1))
138
136
  temp_df.columns = [
@@ -164,9 +162,15 @@ def stock_analyst_detail_em(
164
162
  "阶段涨跌幅",
165
163
  ]
166
164
  ]
167
- temp_df["调入日期"] = pd.to_datetime(temp_df["调入日期"], errors="coerce").dt.date
168
- temp_df["最新评级日期"] = pd.to_datetime(temp_df["最新评级日期"], errors="coerce").dt.date
169
- temp_df["成交价格(前复权)"] = pd.to_numeric(temp_df["成交价格(前复权)"], errors="coerce")
165
+ temp_df["调入日期"] = pd.to_datetime(
166
+ temp_df["调入日期"], errors="coerce"
167
+ ).dt.date
168
+ temp_df["最新评级日期"] = pd.to_datetime(
169
+ temp_df["最新评级日期"], errors="coerce"
170
+ ).dt.date
171
+ temp_df["成交价格(前复权)"] = pd.to_numeric(
172
+ temp_df["成交价格(前复权)"], errors="coerce"
173
+ )
170
174
  temp_df["最新价格"] = pd.to_numeric(temp_df["最新价格"], errors="coerce")
171
175
  temp_df["阶段涨跌幅"] = pd.to_numeric(temp_df["阶段涨跌幅"], errors="coerce")
172
176
  return temp_df
@@ -181,11 +185,10 @@ def stock_analyst_detail_em(
181
185
  "pageNumber": "1",
182
186
  "pageSize": "1000",
183
187
  "filter": f'(ANALYST_CODE="{analyst_id}")',
184
- "_": "1675744438197",
185
188
  }
186
189
  r = requests.get(url, params=params, headers=headers)
187
190
  data_json = r.json()
188
- temp_df = pd.DataFrame(data_json["result"]['data'])
191
+ temp_df = pd.DataFrame(data_json["result"]["data"])
189
192
  temp_df.reset_index(inplace=True)
190
193
  temp_df["index"] = list(range(1, len(temp_df) + 1))
191
194
  temp_df.columns = [
@@ -214,8 +217,12 @@ def stock_analyst_detail_em(
214
217
  "累计涨跌幅",
215
218
  ]
216
219
  ]
217
- temp_df["调入日期"] = pd.to_datetime(temp_df["调入日期"], errors="coerce").dt.date
218
- temp_df["调出日期"] = pd.to_datetime(temp_df["调出日期"], errors="coerce").dt.date
220
+ temp_df["调入日期"] = pd.to_datetime(
221
+ temp_df["调入日期"], errors="coerce"
222
+ ).dt.date
223
+ temp_df["调出日期"] = pd.to_datetime(
224
+ temp_df["调出日期"], errors="coerce"
225
+ ).dt.date
219
226
  temp_df["累计涨跌幅"] = pd.to_numeric(temp_df["累计涨跌幅"], errors="coerce")
220
227
  return temp_df
221
228
  elif indicator == "历史指数":
@@ -227,26 +234,25 @@ def stock_analyst_detail_em(
227
234
  "filter": f'(ANALYST_CODE="{analyst_id}")',
228
235
  "source": "WEB",
229
236
  "client": "WEB",
230
- "_": "1675744438200",
231
237
  }
232
238
  r = requests.get(url, params=params, headers=headers)
233
239
  data_json = r.json()
234
- temp_df = pd.DataFrame(
235
- data_json['result']['data']
236
- )
237
- temp_df = temp_df[[
238
- "TRADE_DATE",
239
- "INDEX_HVALUE",
240
- ]]
241
- temp_df.columns = ['date', 'value']
240
+ temp_df = pd.DataFrame(data_json["result"]["data"])
241
+ temp_df = temp_df[
242
+ [
243
+ "TRADE_DATE",
244
+ "INDEX_HVALUE",
245
+ ]
246
+ ]
247
+ temp_df.columns = ["date", "value"]
242
248
  temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
243
249
  temp_df["value"] = pd.to_numeric(temp_df["value"], errors="coerce")
244
- temp_df.sort_values(['date'], inplace=True, ignore_index=True)
250
+ temp_df.sort_values(["date"], inplace=True, ignore_index=True)
245
251
  return temp_df
246
252
 
247
253
 
248
254
  if __name__ == "__main__":
249
- stock_analyst_rank_em_df = stock_analyst_rank_em(year="2023")
255
+ stock_analyst_rank_em_df = stock_analyst_rank_em(year="2024")
250
256
  print(stock_analyst_rank_em_df)
251
257
 
252
258
  stock_analyst_detail_em_df = stock_analyst_detail_em(