akshare 1.13.46__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 (388) hide show
  1. akshare/__init__.py +757 -161
  2. akshare/air/air_hebei.py +79 -53
  3. akshare/air/air_zhenqi.py +3 -7
  4. akshare/air/cons.py +1 -0
  5. akshare/air/crypto.js +1 -1
  6. akshare/air/outcrypto.js +1 -1
  7. akshare/air/sunrise_tad.py +32 -17
  8. akshare/article/cons.py +1 -0
  9. akshare/article/epu_index.py +4 -3
  10. akshare/article/ff_factor.py +19 -8
  11. akshare/article/fred_md.py +4 -1
  12. akshare/article/risk_rv.py +3 -8
  13. akshare/bank/bank_cbirc_2020.py +11 -11
  14. akshare/bank/cons.py +7 -6
  15. akshare/bond/bond_buy_back_em.py +228 -0
  16. akshare/bond/bond_cb_sina.py +1 -0
  17. akshare/bond/bond_cb_ths.py +17 -9
  18. akshare/bond/bond_cbond.py +19 -14
  19. akshare/bond/bond_china.py +38 -39
  20. akshare/bond/bond_china_money.py +75 -48
  21. akshare/bond/bond_convert.py +10 -9
  22. akshare/bond/bond_em.py +37 -17
  23. akshare/bond/bond_info_cm.py +28 -8
  24. akshare/bond/bond_issue_cninfo.py +73 -30
  25. akshare/bond/bond_summary.py +38 -37
  26. akshare/bond/bond_zh_cov.py +31 -40
  27. akshare/bond/bond_zh_sina.py +61 -51
  28. akshare/bond/cons.py +14 -11
  29. akshare/cal/__init__.py +0 -0
  30. akshare/cal/rv.py +170 -0
  31. akshare/cost/cost_living.py +7 -5
  32. akshare/crypto/__init__.py +1 -1
  33. akshare/crypto/crypto_bitcoin_cme.py +9 -7
  34. akshare/crypto/crypto_hold.py +4 -2
  35. akshare/currency/currency.py +1 -0
  36. akshare/currency/currency_china_bank_sina.py +11 -6
  37. akshare/currency/currency_safe.py +7 -6
  38. akshare/data/__init__.py +1 -1
  39. akshare/data/cninfo.js +1 -1
  40. akshare/datasets.py +10 -21
  41. akshare/economic/cons.py +10 -3
  42. akshare/economic/macro_australia.py +74 -69
  43. akshare/economic/macro_bank.py +95 -653
  44. akshare/economic/macro_canada.py +92 -81
  45. akshare/economic/macro_china.py +163 -117
  46. akshare/economic/macro_china_hk.py +0 -1
  47. akshare/economic/macro_china_nbs.py +24 -7
  48. akshare/economic/macro_euro.py +103 -56
  49. akshare/economic/macro_finance_ths.py +135 -0
  50. akshare/economic/macro_germany.py +1 -1
  51. akshare/economic/macro_info_ws.py +100 -0
  52. akshare/economic/macro_japan.py +0 -1
  53. akshare/economic/macro_other.py +1 -6
  54. akshare/economic/macro_swiss.py +2 -3
  55. akshare/economic/macro_uk.py +1 -1
  56. akshare/economic/macro_usa.py +7 -9
  57. akshare/economic/marco_cnbs.py +11 -6
  58. akshare/energy/energy_carbon.py +94 -126
  59. akshare/energy/energy_oil_em.py +1 -2
  60. akshare/event/cons.py +1 -0
  61. akshare/event/migration.py +3 -2
  62. akshare/exceptions.py +43 -0
  63. akshare/file_fold/calendar.json +245 -2
  64. akshare/forex/__init__.py +0 -0
  65. akshare/forex/cons.py +192 -0
  66. akshare/forex/forex_em.py +149 -0
  67. akshare/fortune/fortune_500.py +15 -48
  68. akshare/fortune/fortune_bloomberg.py +6 -3
  69. akshare/fortune/fortune_forbes_500.py +3 -6
  70. akshare/fortune/fortune_hurun.py +2 -1
  71. akshare/fortune/fortune_xincaifu_500.py +17 -14
  72. akshare/fund/fund_amac.py +38 -15
  73. akshare/fund/fund_announcement_em.py +145 -0
  74. akshare/fund/fund_aum_em.py +49 -35
  75. akshare/fund/fund_em.py +251 -220
  76. akshare/fund/fund_etf_em.py +44 -35
  77. akshare/fund/fund_etf_sina.py +76 -27
  78. akshare/fund/fund_etf_ths.py +95 -0
  79. akshare/fund/fund_fee_em.py +172 -0
  80. akshare/fund/fund_fhsp_em.py +42 -32
  81. akshare/fund/fund_init_em.py +8 -5
  82. akshare/fund/fund_lof_em.py +12 -19
  83. akshare/fund/fund_manager.py +25 -11
  84. akshare/fund/fund_overview_em.py +42 -0
  85. akshare/fund/fund_portfolio_em.py +78 -66
  86. akshare/fund/fund_position_lg.py +19 -8
  87. akshare/fund/fund_rank_em.py +90 -84
  88. akshare/fund/fund_rating.py +33 -12
  89. akshare/fund/fund_report_cninfo.py +63 -48
  90. akshare/fund/fund_scale_em.py +24 -13
  91. akshare/fund/fund_scale_sina.py +20 -10
  92. akshare/fund/fund_xq.py +3 -2
  93. akshare/futures/cons.py +141 -46
  94. akshare/futures/cot.py +89 -88
  95. akshare/futures/futures_basis.py +99 -33
  96. akshare/futures/futures_comex_em.py +1 -0
  97. akshare/futures/futures_comm_ctp.py +13 -2
  98. akshare/futures/futures_contract_detail.py +59 -9
  99. akshare/futures/futures_daily_bar.py +75 -62
  100. akshare/futures/futures_foreign.py +14 -8
  101. akshare/futures/futures_hf_em.py +215 -61
  102. akshare/futures/futures_hist_em.py +191 -0
  103. akshare/futures/futures_hq_sina.py +79 -61
  104. akshare/futures/futures_index_ccidx.py +24 -82
  105. akshare/futures/futures_inventory_99.py +70 -272
  106. akshare/futures/futures_inventory_em.py +14 -11
  107. akshare/futures/futures_news_shmet.py +2 -2
  108. akshare/futures/futures_roll_yield.py +11 -24
  109. akshare/futures/futures_rule.py +7 -3
  110. akshare/futures/futures_rule_em.py +38 -0
  111. akshare/futures/futures_settlement_price_sgx.py +21 -6
  112. akshare/futures/futures_stock_js.py +1 -2
  113. akshare/futures/futures_to_spot.py +43 -39
  114. akshare/futures/futures_warehouse_receipt.py +53 -48
  115. akshare/futures/futures_zh_sina.py +4 -4
  116. akshare/futures/receipt.py +298 -165
  117. akshare/futures/requests_fun.py +16 -3
  118. akshare/futures/symbol_var.py +32 -13
  119. akshare/futures_derivative/cons.py +100 -103
  120. akshare/futures_derivative/futures_contract_info_cffex.py +55 -39
  121. akshare/futures_derivative/futures_contract_info_czce.py +2 -0
  122. akshare/futures_derivative/futures_contract_info_dce.py +43 -17
  123. akshare/futures_derivative/futures_contract_info_gfex.py +43 -31
  124. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  125. akshare/futures_derivative/futures_contract_info_shfe.py +7 -8
  126. akshare/futures_derivative/futures_cot_sina.py +28 -19
  127. akshare/futures_derivative/futures_index_sina.py +25 -13
  128. akshare/fx/cons.py +12 -7
  129. akshare/fx/currency_investing.py +19 -285
  130. akshare/fx/fx_c_swap_cm.py +62 -0
  131. akshare/fx/fx_quote.py +3 -2
  132. akshare/fx/fx_quote_baidu.py +2 -1
  133. akshare/hf/__init__.py +1 -1
  134. akshare/hf/hf_sp500.py +8 -7
  135. akshare/index/cons.py +132 -28
  136. akshare/index/index_cflp.py +29 -26
  137. akshare/index/index_cni.py +89 -91
  138. akshare/index/index_cons.py +26 -10
  139. akshare/index/index_csindex.py +68 -0
  140. akshare/index/index_cx.py +263 -62
  141. akshare/index/index_drewry.py +17 -16
  142. akshare/index/index_eri.py +1 -0
  143. akshare/index/index_global_em.py +167 -0
  144. akshare/index/index_global_sina.py +82 -0
  145. akshare/index/index_kq_fz.py +17 -14
  146. akshare/index/index_kq_ss.py +1 -0
  147. akshare/index/index_option_qvix.py +351 -16
  148. akshare/index/index_research_sw.py +38 -38
  149. akshare/index/index_spot.py +9 -5
  150. akshare/index/index_stock_hk.py +6 -10
  151. akshare/index/index_stock_us_sina.py +1 -1
  152. akshare/index/index_stock_zh.py +193 -101
  153. akshare/index/index_stock_zh_csindex.py +15 -369
  154. akshare/index/index_sugar.py +18 -4
  155. akshare/index/index_sw.py +62 -34
  156. akshare/index/index_yw.py +53 -75
  157. akshare/index/index_zh_em.py +15 -82
  158. akshare/interest_rate/interbank_rate_em.py +14 -10
  159. akshare/movie/artist_yien.py +32 -5
  160. akshare/movie/jm.js +0 -1
  161. akshare/movie/movie_yien.py +92 -18
  162. akshare/movie/video_yien.py +28 -5
  163. akshare/news/__init__.py +1 -1
  164. akshare/news/news_baidu.py +395 -220
  165. akshare/news/news_cctv.py +38 -38
  166. akshare/news/news_stock.py +49 -13
  167. akshare/nlp/nlp_interface.py +7 -8
  168. akshare/option/cons.py +12 -12
  169. akshare/option/option_comm_qihuo.py +86 -0
  170. akshare/option/option_commodity.py +355 -211
  171. akshare/option/option_commodity_sina.py +22 -26
  172. akshare/option/option_contract_info_ctp.py +63 -0
  173. akshare/option/option_current_sse.py +61 -0
  174. akshare/option/option_current_szse.py +84 -0
  175. akshare/option/option_czce.py +37 -9
  176. akshare/option/option_daily_stats_sse_szse.py +145 -0
  177. akshare/option/option_em.py +4 -8
  178. akshare/option/option_finance.py +60 -12
  179. akshare/option/option_finance_sina.py +28 -26
  180. akshare/option/option_lhb_em.py +62 -57
  181. akshare/option/option_margin.py +62 -0
  182. akshare/option/option_premium_analysis_em.py +58 -53
  183. akshare/option/option_risk_analysis_em.py +11 -8
  184. akshare/option/option_risk_indicator_sse.py +18 -16
  185. akshare/option/option_value_analysis_em.py +62 -55
  186. akshare/other/__init__.py +1 -1
  187. akshare/other/other_car_cpca.py +20 -20
  188. akshare/pro/__init__.py +0 -1
  189. akshare/pro/client.py +6 -4
  190. akshare/pro/cons.py +3 -2
  191. akshare/pro/data_pro.py +6 -5
  192. akshare/qdii/__init__.py +0 -0
  193. akshare/qdii/qdii_jsl.py +233 -0
  194. akshare/qhkc/__init__.py +1 -6
  195. akshare/qhkc/qhkc_api.py +64 -22
  196. akshare/qhkc_web/__init__.py +1 -6
  197. akshare/qhkc_web/qhkc_fund.py +10 -6
  198. akshare/qhkc_web/qhkc_index.py +28 -14
  199. akshare/qhkc_web/qhkc_tool.py +62 -59
  200. akshare/rate/__init__.py +1 -1
  201. akshare/rate/repo_rate.py +36 -32
  202. akshare/reits/__init__.py +1 -1
  203. akshare/reits/reits_basic.py +149 -13
  204. akshare/request.py +117 -0
  205. akshare/spot/__init__.py +1 -1
  206. akshare/spot/spot_hog_soozhu.py +232 -0
  207. akshare/spot/spot_price_qh.py +121 -0
  208. akshare/spot/spot_sge.py +70 -9
  209. akshare/stock/cons.py +60 -23
  210. akshare/stock/stock_allotment_cninfo.py +10 -9
  211. akshare/stock/stock_ask_bid_em.py +3 -78
  212. akshare/stock/stock_board_concept_em.py +160 -35
  213. akshare/stock/stock_board_industry_em.py +163 -70
  214. akshare/stock/stock_cg_equity_mortgage.py +15 -11
  215. akshare/stock/stock_cg_guarantee.py +41 -51
  216. akshare/stock/stock_cg_lawsuit.py +36 -35
  217. akshare/stock/stock_dividend_cninfo.py +36 -16
  218. akshare/stock/stock_dzjy_em.py +347 -260
  219. akshare/stock/stock_fund_em.py +73 -64
  220. akshare/stock/stock_fund_hold.py +1 -2
  221. akshare/stock/stock_gsrl_em.py +1 -0
  222. akshare/stock/stock_hk_comparison_em.py +175 -0
  223. akshare/stock/stock_hk_famous.py +107 -0
  224. akshare/stock/stock_hk_fhpx_ths.py +2 -1
  225. akshare/stock/stock_hk_hot_rank_em.py +1 -0
  226. akshare/stock/stock_hk_sina.py +91 -42
  227. akshare/stock/stock_hold_control_cninfo.py +100 -15
  228. akshare/stock/stock_hold_control_em.py +4 -5
  229. akshare/stock/stock_hold_num_cninfo.py +18 -12
  230. akshare/stock/stock_hot_rank_em.py +4 -1
  231. akshare/stock/stock_hot_search_baidu.py +32 -19
  232. akshare/stock/stock_hot_up_em.py +4 -1
  233. akshare/stock/stock_hsgt_em.py +155 -0
  234. akshare/stock/stock_industry.py +1 -0
  235. akshare/stock/stock_industry_cninfo.py +25 -20
  236. akshare/stock/stock_industry_pe_cninfo.py +45 -31
  237. akshare/stock/stock_industry_sw.py +5 -9
  238. akshare/stock/stock_info.py +31 -19
  239. akshare/stock/stock_info_em.py +17 -11
  240. akshare/stock/stock_intraday_em.py +9 -80
  241. akshare/stock/stock_intraday_sina.py +2 -2
  242. akshare/stock/stock_ipo_summary_cninfo.py +25 -10
  243. akshare/stock/stock_new_cninfo.py +32 -19
  244. akshare/stock/stock_news_cx.py +39 -0
  245. akshare/stock/stock_profile_cninfo.py +9 -8
  246. akshare/stock/stock_profile_em.py +302 -0
  247. akshare/stock/stock_rank_forecast.py +8 -6
  248. akshare/stock/stock_repurchase_em.py +7 -2
  249. akshare/stock/stock_share_changes_cninfo.py +18 -14
  250. akshare/stock/stock_share_hold.py +24 -20
  251. akshare/stock/stock_stop.py +6 -6
  252. akshare/stock/stock_summary.py +153 -417
  253. akshare/stock/stock_us_famous.py +19 -11
  254. akshare/stock/stock_us_js.py +3 -2
  255. akshare/stock/stock_us_pink.py +38 -27
  256. akshare/stock/stock_us_sina.py +15 -12
  257. akshare/stock/stock_weibo_nlp.py +18 -20
  258. akshare/stock/stock_xq.py +36 -9
  259. akshare/stock/stock_zh_a_sina.py +58 -80
  260. akshare/stock/stock_zh_a_special.py +240 -243
  261. akshare/stock/stock_zh_a_tick_tx.py +11 -3
  262. akshare/stock/stock_zh_ah_tx.py +23 -26
  263. akshare/stock/stock_zh_b_sina.py +32 -55
  264. akshare/stock/stock_zh_comparison_em.py +250 -0
  265. akshare/stock/stock_zh_kcb_report.py +11 -9
  266. akshare/stock/stock_zh_kcb_sina.py +67 -64
  267. akshare/stock_a/__init__.py +0 -0
  268. akshare/stock_a/stock_board_concept_name_em.py +170 -0
  269. akshare/stock_a/stock_individual_fund_flow_rank.py +258 -0
  270. akshare/stock_a/stock_zh_a_spot.py +212 -0
  271. akshare/stock_feature/cons.py +1 -0
  272. akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
  273. akshare/stock_feature/stock_a_high_low.py +5 -2
  274. akshare/stock_feature/stock_a_indicator.py +15 -57
  275. akshare/stock_feature/stock_a_pe_and_pb.py +39 -9
  276. akshare/stock_feature/stock_account_em.py +0 -1
  277. akshare/stock_feature/stock_all_pb.py +2 -1
  278. akshare/stock_feature/stock_analyst_em.py +36 -30
  279. akshare/stock_feature/stock_board_concept_ths.py +144 -252
  280. akshare/stock_feature/stock_board_industry_ths.py +137 -401
  281. akshare/stock_feature/stock_buffett_index_lg.py +10 -8
  282. akshare/stock_feature/stock_classify_sina.py +3 -6
  283. akshare/stock_feature/stock_comment_em.py +81 -144
  284. akshare/stock_feature/stock_concept_futu.py +183 -0
  285. akshare/stock_feature/stock_congestion_lg.py +2 -1
  286. akshare/stock_feature/stock_cyq_em.py +5 -11
  287. akshare/stock_feature/stock_disclosure_cninfo.py +20 -10
  288. akshare/stock_feature/stock_dxsyl_em.py +121 -74
  289. akshare/stock_feature/stock_ebs_lg.py +5 -4
  290. akshare/stock_feature/stock_esg_sina.py +33 -15
  291. akshare/stock_feature/stock_fhps_em.py +62 -26
  292. akshare/stock_feature/stock_fhps_ths.py +34 -7
  293. akshare/stock_feature/stock_fund_flow.py +38 -25
  294. akshare/stock_feature/stock_gddh_em.py +19 -11
  295. akshare/stock_feature/stock_gdfx_em.py +226 -113
  296. akshare/stock_feature/stock_gdhs.py +75 -50
  297. akshare/stock_feature/stock_gdzjc_em.py +21 -10
  298. akshare/stock_feature/stock_gpzy_em.py +78 -46
  299. akshare/stock_feature/stock_gxl_lg.py +3 -2
  300. akshare/stock_feature/stock_hist_em.py +158 -237
  301. akshare/stock_feature/stock_hist_tx.py +13 -10
  302. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  303. akshare/stock_feature/stock_hot_xq.py +4 -6
  304. akshare/stock_feature/stock_hsgt_em.py +269 -97
  305. akshare/stock_feature/stock_hsgt_exchange_rate.py +115 -87
  306. akshare/stock_feature/stock_hsgt_min_em.py +13 -16
  307. akshare/stock_feature/stock_info.py +8 -81
  308. akshare/stock_feature/stock_inner_trade_xq.py +38 -31
  309. akshare/stock_feature/stock_irm_cninfo.py +32 -9
  310. akshare/stock_feature/stock_jgdy_em.py +43 -40
  311. akshare/stock_feature/stock_lh_yybpm.py +36 -37
  312. akshare/stock_feature/stock_lhb_em.py +165 -35
  313. akshare/stock_feature/stock_lhb_sina.py +93 -46
  314. akshare/stock_feature/stock_margin_em.py +101 -0
  315. akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -17
  316. akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +7 -7
  317. akshare/stock_feature/stock_market_legu.py +4 -2
  318. akshare/stock_feature/stock_pankou_em.py +71 -35
  319. akshare/stock_feature/stock_qsjy_em.py +13 -4
  320. akshare/stock_feature/stock_report_em.py +152 -8
  321. akshare/stock_feature/stock_research_report_em.py +55 -20
  322. akshare/stock_feature/stock_sns_sseinfo.py +15 -12
  323. akshare/stock_feature/stock_sy_em.py +20 -15
  324. akshare/stock_feature/stock_technology_ths.py +152 -120
  325. akshare/stock_feature/stock_tfp_em.py +37 -14
  326. akshare/stock_feature/stock_three_report_em.py +120 -78
  327. akshare/stock_feature/stock_ttm_lyr.py +18 -9
  328. akshare/stock_feature/stock_value_em.py +83 -0
  329. akshare/stock_feature/stock_yjbb_em.py +58 -32
  330. akshare/stock_feature/stock_yjyg_cninfo.py +6 -2
  331. akshare/stock_feature/stock_yjyg_em.py +1 -1
  332. akshare/stock_feature/stock_yzxdr_em.py +24 -22
  333. akshare/stock_feature/stock_zdhtmx_em.py +20 -6
  334. akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
  335. akshare/stock_feature/stock_zh_vote_baidu.py +4 -1
  336. akshare/stock_feature/stock_ztb_em.py +39 -24
  337. akshare/stock_fundamental/__init__.py +1 -1
  338. akshare/stock_fundamental/stock_basic_info_xq.py +119 -0
  339. akshare/stock_fundamental/{stock_finance_hk.py → stock_finance_hk_em.py} +23 -16
  340. akshare/stock_fundamental/{stock_finance.py → stock_finance_sina.py} +203 -59
  341. akshare/stock_fundamental/stock_finance_ths.py +524 -57
  342. akshare/stock_fundamental/stock_finance_us_em.py +268 -0
  343. akshare/stock_fundamental/stock_gbjg_em.py +80 -0
  344. akshare/stock_fundamental/stock_hold.py +26 -17
  345. akshare/stock_fundamental/stock_ipo_declare.py +1 -0
  346. akshare/stock_fundamental/stock_kcb_detail_sse.py +10 -10
  347. akshare/stock_fundamental/stock_kcb_sse.py +26 -25
  348. akshare/stock_fundamental/stock_notice.py +41 -18
  349. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  350. akshare/stock_fundamental/stock_profit_forecast_hk_etnet.py +64 -41
  351. akshare/stock_fundamental/stock_profit_forecast_ths.py +86 -35
  352. akshare/stock_fundamental/stock_recommend.py +20 -4
  353. akshare/stock_fundamental/stock_register_em.py +448 -0
  354. akshare/stock_fundamental/stock_zygc.py +5 -62
  355. akshare/tool/trade_date_hist.py +1 -1
  356. akshare/utils/context.py +43 -0
  357. akshare/utils/demjson.py +2009 -1338
  358. akshare/utils/func.py +49 -2
  359. akshare/utils/multi_decrypt.py +53 -0
  360. akshare/utils/token_process.py +6 -5
  361. akshare/utils/tqdm.py +13 -3
  362. {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/METADATA +56 -86
  363. akshare-1.17.99.dist-info/RECORD +409 -0
  364. {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/WHEEL +1 -1
  365. {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info/licenses}/LICENSE +1 -1
  366. tests/test_func.py +3 -5
  367. akshare/bond/bond_futures.py +0 -50
  368. akshare/bond/bond_investing.py +0 -139
  369. akshare/crypto/crypto_hist_investing.py +0 -249
  370. akshare/fortune/fortune_it_juzi.py +0 -123
  371. akshare/fund/fund_announcement.py +0 -56
  372. akshare/futures/futures_international.py +0 -170
  373. akshare/futures/futures_news_baidu.py +0 -54
  374. akshare/futures/inventory_data.py +0 -100
  375. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  376. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  377. akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
  378. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  379. akshare/index/index_fear_greed_funddb.py +0 -78
  380. akshare/index/index_investing.py +0 -232
  381. akshare/sport/__init__.py +0 -6
  382. akshare/sport/sport_olympic.py +0 -27
  383. akshare/sport/sport_olympic_winter.py +0 -39
  384. akshare/stock_feature/stock_wencai.py +0 -104
  385. akshare/stock_fundamental/stock_mda_ym.py +0 -40
  386. akshare/stock_fundamental/stock_register.py +0 -292
  387. akshare-1.13.46.dist-info/RECORD +0 -380
  388. {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/top_level.txt +0 -0
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/10/15 18:00
4
+ Date: 2025/3/27 14:20
5
5
  Desc: 同花顺-板块-概念板块
6
- https://q.10jqka.com.cn/gn/detail/code/301558/
6
+ https://q.10jqka.com.cn/thshy/
7
7
  """
8
8
 
9
+ from typing import Dict
9
10
  from datetime import datetime
10
11
  from functools import lru_cache
11
12
  from io import StringIO
@@ -13,48 +14,11 @@ from io import StringIO
13
14
  import pandas as pd
14
15
  import requests
15
16
  from bs4 import BeautifulSoup
16
- from py_mini_racer import py_mini_racer
17
- from tqdm import tqdm
17
+ import py_mini_racer
18
18
 
19
19
  from akshare.datasets import get_ths_js
20
20
  from akshare.utils import demjson
21
-
22
-
23
- def stock_board_concept_graph_ths(symbol: str = "通用航空") -> pd.DataFrame:
24
- """
25
- 同花顺-板块-概念板块-概念图谱
26
- https://q.10jqka.com.cn/gn/detail/code/301558/
27
- :param symbol: 板块名称
28
- :type symbol: str
29
- :return: 概念图谱
30
- :rtype: pandas.DataFrame
31
- """
32
- stock_board_ths_map_df = stock_board_concept_name_ths()
33
- symbol = (
34
- stock_board_ths_map_df[stock_board_ths_map_df["概念名称"] == symbol]["网址"]
35
- .values[0]
36
- .split("/")[-2]
37
- )
38
- url = f"https://q.10jqka.com.cn/gn/detail/code/{symbol}"
39
- headers = {
40
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
41
- "Chrome/89.0.4389.90 Safari/537.36",
42
- }
43
- r = requests.get(url, headers=headers)
44
- temp_df = pd.read_html(StringIO(r.text))[0]
45
- new_list = []
46
- for col in temp_df.columns:
47
- temp_list = temp_df[col].values[0].split(" ")
48
- for i, item in enumerate(temp_list):
49
- if i % 2 != 0:
50
- price_pct, pct = item.split(" ")
51
- price_pct = price_pct.strip("%").strip("+").strip("-")
52
- pct = pct.strip("-").strip("+")
53
- new_list.append([col, temp_list[i - 1], price_pct, pct])
54
- temp_df = pd.DataFrame(new_list, columns=["产业链", "名称", "涨跌幅", "现价"])
55
- temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
56
- temp_df["现价"] = pd.to_numeric(temp_df["现价"], errors="coerce")
57
- return temp_df
21
+ from akshare.utils.tqdm import get_tqdm
58
22
 
59
23
 
60
24
  def _get_file_content_ths(file: str = "ths.js") -> str:
@@ -66,20 +30,18 @@ def _get_file_content_ths(file: str = "ths.js") -> str:
66
30
  :rtype: str
67
31
  """
68
32
  setting_file_path = get_ths_js(file)
69
- with open(setting_file_path) as f:
33
+ with open(setting_file_path, encoding="utf-8") as f:
70
34
  file_data = f.read()
71
35
  return file_data
72
36
 
73
37
 
74
38
  @lru_cache()
75
- def stock_board_concept_name_ths() -> pd.DataFrame:
39
+ def _get_stock_board_concept_name_ths() -> dict:
76
40
  """
77
- 同花顺-板块-概念板块-概念
78
- https://q.10jqka.com.cn/gn/detail/code/301558/
79
- :return: 所有概念板块的名称和链接
80
- :rtype: pandas.DataFrame
41
+ 获取同花顺概念板块代码和名称字典
42
+ :return: 获取同花顺概念板块代码和名称字典
43
+ :rtype: dict
81
44
  """
82
- url = "https://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/1/ajax/1/"
83
45
  js_code = py_mini_racer.MiniRacer()
84
46
  js_content = _get_file_content_ths("ths.js")
85
47
  js_code.eval(js_content)
@@ -89,161 +51,57 @@ def stock_board_concept_name_ths() -> pd.DataFrame:
89
51
  "Chrome/89.0.4389.90 Safari/537.36",
90
52
  "Cookie": f"v={v_code}",
91
53
  }
54
+ url = "https://q.10jqka.com.cn/gn/detail/code/307822/"
92
55
  r = requests.get(url, headers=headers)
93
56
  soup = BeautifulSoup(r.text, features="lxml")
94
- total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split("/")[1]
95
- big_df = pd.DataFrame()
96
- for page in tqdm(range(1, int(total_page) + 1), leave=False):
97
- url = f"https://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/{page}/ajax/1/"
98
- js_code = py_mini_racer.MiniRacer()
99
- js_content = _get_file_content_ths("ths.js")
100
- js_code.eval(js_content)
101
- v_code = js_code.call("v")
102
- headers = {
103
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
104
- "Chrome/89.0.4389.90 Safari/537.36",
105
- "Cookie": f"v={v_code}",
106
- }
107
- r = requests.get(url, headers=headers)
108
- soup = BeautifulSoup(r.text, features="lxml")
109
- url_list = []
110
- for item in (
111
- soup.find(name="table", attrs={"class": "m-table m-pager-table"})
112
- .find("tbody")
113
- .find_all("tr")
114
- ):
115
- inner_url = item.find_all("td")[1].find("a")["href"]
116
- url_list.append(inner_url)
117
- temp_df = pd.read_html(StringIO(r.text))[0]
118
- temp_df["网址"] = url_list
119
- big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
120
- big_df = big_df[["日期", "概念名称", "成分股数量", "网址"]]
121
- big_df["日期"] = pd.to_datetime(big_df["日期"], errors="coerce").dt.date
122
- big_df["成分股数量"] = pd.to_numeric(big_df["成分股数量"], errors="coerce")
123
- big_df["代码"] = big_df["网址"].str.split("/", expand=True).iloc[:, 6]
124
- big_df.drop_duplicates(keep="last", inplace=True)
125
- big_df.reset_index(inplace=True, drop=True)
126
-
127
- # 处理遗漏的板块
128
- url = "https://q.10jqka.com.cn/gn/detail/code/301558/"
129
- r = requests.get(url, headers=headers)
130
- soup = BeautifulSoup(r.text, "lxml")
131
- need_list = [
132
- item.find_all("a") for item in soup.find_all(attrs={"class": "cate_group"})
57
+ code_list = [
58
+ item["href"].split("/")[-2]
59
+ for item in soup.find(name="div", attrs={"class": "cate_inner"}).find_all("a")
133
60
  ]
134
- temp_list = []
135
- for item in need_list:
136
- temp_list.extend(item)
137
- temp_df = pd.DataFrame(
138
- [
139
- [item.text for item in temp_list],
140
- [item["href"] for item in temp_list],
141
- ]
142
- ).T
143
- temp_df.columns = ["概念名称", "网址"]
144
- temp_df["日期"] = None
145
- temp_df["成分股数量"] = None
146
- temp_df["代码"] = temp_df["网址"].str.split("/", expand=True).iloc[:, 6].tolist()
147
- temp_df = temp_df[["日期", "概念名称", "成分股数量", "网址", "代码"]]
148
- big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
149
- big_df.drop_duplicates(subset=["概念名称"], keep="first", inplace=True)
150
- return big_df
61
+ name_list = [
62
+ item.text
63
+ for item in soup.find(name="div", attrs={"class": "cate_inner"}).find_all("a")
64
+ ]
65
+ name_code_map = dict(zip(name_list, code_list))
66
+ temp_dict = __stock_board_concept_summary_ths()
67
+ name_code_map.update(temp_dict)
68
+ return name_code_map
151
69
 
152
70
 
153
- def _stock_board_concept_code_ths() -> dict:
71
+ def stock_board_concept_name_ths() -> pd.DataFrame:
154
72
  """
155
73
  同花顺-板块-概念板块-概念
156
- https://q.10jqka.com.cn/gn/detail/code/301558/
74
+ http://q.10jqka.com.cn/thshy/
157
75
  :return: 所有概念板块的名称和链接
158
76
  :rtype: pandas.DataFrame
159
77
  """
160
- _stock_board_concept_name_ths_df = stock_board_concept_name_ths()
161
- name_list = _stock_board_concept_name_ths_df["概念名称"].tolist()
162
- url_list = [
163
- item.split("/")[-2]
164
- for item in _stock_board_concept_name_ths_df["网址"].tolist()
78
+ code_name_ths_map = _get_stock_board_concept_name_ths()
79
+ temp_df = pd.DataFrame.from_dict(code_name_ths_map, orient="index")
80
+ temp_df.reset_index(inplace=True)
81
+ temp_df.columns = ["name", "code"]
82
+ temp_df = temp_df[
83
+ [
84
+ "name",
85
+ "code",
86
+ ]
165
87
  ]
166
- temp_map = dict(zip(name_list, url_list))
167
- return temp_map
168
-
169
-
170
- def stock_board_concept_cons_ths(symbol: str = "小米概念") -> pd.DataFrame:
171
- """
172
- 同花顺-板块-概念板块-成份股
173
- https://q.10jqka.com.cn/gn/detail/code/301558/
174
- :param symbol: 板块名称
175
- :type symbol: str
176
- :return: 成份股
177
- :rtype: pandas.DataFrame
178
- """
179
- stock_board_ths_map_df = stock_board_concept_name_ths()
180
- symbol = (
181
- stock_board_ths_map_df[stock_board_ths_map_df["概念名称"] == symbol]["网址"]
182
- .values[0]
183
- .split("/")[-2]
184
- )
185
- js_code = py_mini_racer.MiniRacer()
186
- js_content = _get_file_content_ths("ths.js")
187
- js_code.eval(js_content)
188
- v_code = js_code.call("v")
189
- headers = {
190
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
191
- "Chrome/89.0.4389.90 Safari/537.36",
192
- "Cookie": f"v={v_code}",
193
- }
194
- url = f"https://q.10jqka.com.cn/gn/detail/field/264648/order/desc/page/1/ajax/1/code/{symbol}"
195
- r = requests.get(url, headers=headers)
196
- soup = BeautifulSoup(r.text, features="lxml")
197
- try:
198
- page_num = int(
199
- soup.find_all(name="a", attrs={"class": "changePage"})[-1]["page"]
200
- )
201
- except IndexError:
202
- page_num = 1
203
- big_df = pd.DataFrame()
204
- for page in tqdm(range(1, page_num + 1), leave=False):
205
- v_code = js_code.call("v")
206
- headers = {
207
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
208
- "Chrome/89.0.4389.90 Safari/537.36",
209
- "Cookie": f"v={v_code}",
210
- }
211
- url = f"https://q.10jqka.com.cn/gn/detail/field/264648/order/desc/page/{page}/ajax/1/code/{symbol}"
212
- r = requests.get(url, headers=headers)
213
- temp_df = pd.read_html(StringIO(r.text))[0]
214
- big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
215
- big_df.rename(
216
- mapper={
217
- "涨跌幅(%)": "涨跌幅",
218
- "涨速(%)": "涨速",
219
- "换手(%)": "换手",
220
- "振幅(%)": "振幅",
221
- },
222
- inplace=True,
223
- axis=1,
224
- )
225
- del big_df["加自选"]
226
- big_df["代码"] = big_df["代码"].astype(str).str.zfill(6)
227
- big_df = big_df[big_df["代码"] != "暂无成份股数据"]
228
- return big_df
88
+ return temp_df
229
89
 
230
90
 
231
91
  def stock_board_concept_info_ths(symbol: str = "阿里巴巴概念") -> pd.DataFrame:
232
92
  """
233
93
  同花顺-板块-概念板块-板块简介
234
- https://q.10jqka.com.cn/gn/detail/code/301558/
94
+ http://q.10jqka.com.cn/gn/detail/code/301558/
235
95
  :param symbol: 板块简介
236
96
  :type symbol: str
237
97
  :return: 板块简介
238
98
  :rtype: pandas.DataFrame
239
99
  """
240
100
  stock_board_ths_map_df = stock_board_concept_name_ths()
241
- symbol_code = (
242
- stock_board_ths_map_df[stock_board_ths_map_df["概念名称"] == symbol]["网址"]
243
- .values[0]
244
- .split("/")[-2]
245
- )
246
- url = f"https://q.10jqka.com.cn/gn/detail/code/{symbol_code}/"
101
+ symbol_code = stock_board_ths_map_df[stock_board_ths_map_df["name"] == symbol][
102
+ "code"
103
+ ].values[0]
104
+ url = f"http://q.10jqka.com.cn/gn/detail/code/{symbol_code}/"
247
105
  headers = {
248
106
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
249
107
  "Chrome/89.0.4389.90 Safari/537.36",
@@ -251,7 +109,7 @@ def stock_board_concept_info_ths(symbol: str = "阿里巴巴概念") -> pd.DataF
251
109
  r = requests.get(url, headers=headers)
252
110
  soup = BeautifulSoup(r.text, features="lxml")
253
111
  name_list = [
254
- item.text
112
+ item.text.strip()
255
113
  for item in soup.find(name="div", attrs={"class": "board-infos"}).find_all("dt")
256
114
  ]
257
115
  value_list = [
@@ -263,40 +121,54 @@ def stock_board_concept_info_ths(symbol: str = "阿里巴巴概念") -> pd.DataF
263
121
  return temp_df
264
122
 
265
123
 
266
- def stock_board_concept_hist_ths(
267
- start_year: str = "2000", symbol: str = "安防"
124
+ def stock_board_concept_index_ths(
125
+ symbol: str = "阿里巴巴概念",
126
+ start_date: str = "20200101",
127
+ end_date: str = "20250228",
268
128
  ) -> pd.DataFrame:
269
129
  """
270
130
  同花顺-板块-概念板块-指数数据
271
131
  https://q.10jqka.com.cn/gn/detail/code/301558/
272
- :param start_year: 开始年份; e.g., 2019
273
- :type start_year: str
274
- :param symbol: 板块简介
132
+ :param start_date: 开始时间
133
+ :type start_date: str
134
+ :param end_date: 结束时间
135
+ :type end_date: str
136
+ :param symbol: 指数数据
275
137
  :type symbol: str
276
- :return: 板块简介
138
+ :return: 指数数据
277
139
  :rtype: pandas.DataFrame
278
140
  """
279
- code_map = _stock_board_concept_code_ths()
280
- symbol_url = f"https://q.10jqka.com.cn/gn/detail/code/{code_map[symbol]}/"
141
+ js_code = py_mini_racer.MiniRacer()
142
+ js_content = _get_file_content_ths("ths.js")
143
+ js_code.eval(js_content)
144
+ v_code = js_code.call("v")
145
+
146
+ code_map = _get_stock_board_concept_name_ths()
147
+ symbol_code = code_map[symbol]
281
148
  headers = {
282
149
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
283
150
  "Chrome/89.0.4389.90 Safari/537.36",
284
151
  }
285
- r = requests.get(symbol_url, headers=headers)
286
- soup = BeautifulSoup(r.text, "lxml")
287
- symbol_code = soup.find("div", attrs={"class": "board-hq"}).find("span").text
152
+ url = f"https://q.10jqka.com.cn/gn/detail/code/{symbol_code}"
153
+ r = requests.get(url=url, headers=headers)
154
+ soup = BeautifulSoup(r.text, features="lxml")
155
+ inner_code = soup.find(name="input", attrs={"id": "clid"})["value"]
288
156
  big_df = pd.DataFrame()
289
157
  current_year = datetime.now().year
290
- for year in tqdm(range(int(start_year), current_year + 1), leave=False):
291
- url = f"https://d.10jqka.com.cn/v4/line/bk_{symbol_code}/01/{year}.js"
158
+ begin_year = int(start_date[:4])
159
+ tqdm = get_tqdm()
160
+ for year in tqdm(range(begin_year, current_year + 1), leave=False):
161
+ url = f"https://d.10jqka.com.cn/v4/line/bk_{inner_code}/01/{year}.js"
292
162
  headers = {
293
163
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
294
164
  "Chrome/89.0.4389.90 Safari/537.36",
295
- "Referer": "https://q.10jqka.com.cn",
165
+ "Referer": "http://q.10jqka.com.cn",
296
166
  "Host": "d.10jqka.com.cn",
167
+ "Cookie": f"v={v_code}",
297
168
  }
298
169
  r = requests.get(url, headers=headers)
299
170
  data_text = r.text
171
+
300
172
  try:
301
173
  demjson.decode(data_text[data_text.find("{") : -1])
302
174
  except: # noqa: E722
@@ -304,8 +176,9 @@ def stock_board_concept_hist_ths(
304
176
  temp_df = demjson.decode(data_text[data_text.find("{") : -1])
305
177
  temp_df = pd.DataFrame(temp_df["data"].split(";"))
306
178
  temp_df = temp_df.iloc[:, 0].str.split(",", expand=True)
307
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
308
- if big_df.columns.shape[0] == 12:
179
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
180
+
181
+ if len(big_df.columns) == 11:
309
182
  big_df.columns = [
310
183
  "日期",
311
184
  "开盘价",
@@ -318,7 +191,6 @@ def stock_board_concept_hist_ths(
318
191
  "_",
319
192
  "_",
320
193
  "_",
321
- "_",
322
194
  ]
323
195
  else:
324
196
  big_df.columns = [
@@ -333,6 +205,7 @@ def stock_board_concept_hist_ths(
333
205
  "_",
334
206
  "_",
335
207
  "_",
208
+ "_",
336
209
  ]
337
210
  big_df = big_df[
338
211
  [
@@ -346,6 +219,9 @@ def stock_board_concept_hist_ths(
346
219
  ]
347
220
  ]
348
221
  big_df["日期"] = pd.to_datetime(big_df["日期"], errors="coerce").dt.date
222
+ big_df.index = pd.to_datetime(big_df["日期"], errors="coerce")
223
+ big_df = big_df[start_date:end_date]
224
+ big_df.reset_index(drop=True, inplace=True)
349
225
  big_df["开盘价"] = pd.to_numeric(big_df["开盘价"], errors="coerce")
350
226
  big_df["最高价"] = pd.to_numeric(big_df["最高价"], errors="coerce")
351
227
  big_df["最低价"] = pd.to_numeric(big_df["最低价"], errors="coerce")
@@ -355,15 +231,13 @@ def stock_board_concept_hist_ths(
355
231
  return big_df
356
232
 
357
233
 
358
- def stock_board_cons_ths(symbol: str = "301558") -> pd.DataFrame:
234
+ @lru_cache()
235
+ def __stock_board_concept_summary_ths() -> Dict:
359
236
  """
360
- 通过输入行业板块或者概念板块的代码获取成份股
361
- https://q.10jqka.com.cn/thshy/detail/code/881121/
362
- https://q.10jqka.com.cn/gn/detail/code/301558/
363
- :param symbol: 行业板块或者概念板块的代码
364
- :type symbol: str
365
- :return: 行业板块或者概念板块的成份股
366
- :rtype: pandas.DataFrame
237
+ 同花顺-数据中心-概念板块-概念时间表-辅助函数
238
+ https://q.10jqka.com.cn/gn/
239
+ :return: 概念时间表
240
+ :rtype: dict
367
241
  """
368
242
  js_code = py_mini_racer.MiniRacer()
369
243
  js_content = _get_file_content_ths("ths.js")
@@ -374,63 +248,81 @@ def stock_board_cons_ths(symbol: str = "301558") -> pd.DataFrame:
374
248
  "Chrome/89.0.4389.90 Safari/537.36",
375
249
  "Cookie": f"v={v_code}",
376
250
  }
377
- url = f"https://q.10jqka.com.cn/thshy/detail/field/199112/order/desc/page/1/ajax/1/code/{symbol}"
251
+ url = "http://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/1/ajax/1/"
378
252
  r = requests.get(url, headers=headers)
379
- soup = BeautifulSoup(r.text, "lxml")
380
- url_flag = "thshy"
381
- if soup.find("td", attrs={"colspan": "14"}):
382
- url = f"https://q.10jqka.com.cn/gn/detail/field/199112/order/desc/page/1/ajax/1/code/{symbol}"
253
+ soup = BeautifulSoup(r.text, features="lxml")
254
+ page_num = soup.find(name="span", attrs={"class": "page_info"}).text.split("/")[1]
255
+ big_dict = dict()
256
+ tqdm = get_tqdm()
257
+ for page in tqdm(range(1, int(page_num) + 1), leave=False):
258
+ url = f"http://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/{page}/ajax/1/"
383
259
  r = requests.get(url, headers=headers)
384
- soup = BeautifulSoup(r.text, "lxml")
385
- url_flag = "gn"
386
- try:
387
- page_num = int(soup.find_all("a", attrs={"class": "changePage"})[-1]["page"])
388
- except IndexError:
389
- page_num = 1
260
+ try:
261
+ soup = BeautifulSoup(r.text, features="lxml")
262
+ temp_dict = {
263
+ item.get_text(): item["href"].rsplit("/")[-2]
264
+ for item in soup.find_all(name="a")
265
+ if "detail" in item["href"]
266
+ }
267
+ big_dict.update(temp_dict)
268
+ except ValueError:
269
+ break
270
+ return big_dict
271
+
272
+
273
+ def stock_board_concept_summary_ths() -> pd.DataFrame:
274
+ """
275
+ 同花顺-数据中心-概念板块-概念时间表
276
+ https://q.10jqka.com.cn/gn/
277
+ :return: 概念时间表
278
+ :rtype: pandas.DataFrame
279
+ """
280
+ js_code = py_mini_racer.MiniRacer()
281
+ js_content = _get_file_content_ths("ths.js")
282
+ js_code.eval(js_content)
283
+ v_code = js_code.call("v")
284
+ headers = {
285
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
286
+ "Chrome/89.0.4389.90 Safari/537.36",
287
+ "Cookie": f"v={v_code}",
288
+ }
289
+ url = "http://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/1/ajax/1/"
290
+ r = requests.get(url, headers=headers)
291
+ soup = BeautifulSoup(r.text, features="lxml")
292
+ page_num = soup.find(name="span", attrs={"class": "page_info"}).text.split("/")[1]
390
293
  big_df = pd.DataFrame()
391
- for page in tqdm(range(1, page_num + 1), leave=False):
392
- v_code = js_code.call("v")
393
- headers = {
394
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
395
- "Chrome/89.0.4389.90 Safari/537.36",
396
- "Cookie": f"v={v_code}",
397
- }
398
- url = f"https://q.10jqka.com.cn/{url_flag}/detail/field/199112/order/desc/page/{page}/ajax/1/code/{symbol}"
294
+ tqdm = get_tqdm()
295
+ for page in tqdm(range(1, int(page_num) + 1), leave=False):
296
+ url = f"http://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/{page}/ajax/1/"
399
297
  r = requests.get(url, headers=headers)
400
- temp_df = pd.read_html(StringIO(r.text))[0]
401
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
402
- big_df.rename(
403
- {
404
- "涨跌幅(%)": "涨跌幅",
405
- "涨速(%)": "涨速",
406
- "换手(%)": "换手",
407
- "振幅(%)": "振幅",
408
- },
409
- inplace=True,
410
- axis=1,
411
- )
412
- del big_df["加自选"]
413
- big_df["代码"] = big_df["代码"].astype(str).str.zfill(6)
298
+ try:
299
+ temp_df = pd.read_html(StringIO(r.text))[0]
300
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
301
+ except ValueError:
302
+ break
303
+ big_df["日期"] = pd.to_datetime(big_df["日期"], errors="coerce").dt.date
304
+ big_df["成分股数量"] = pd.to_numeric(big_df["成分股数量"], errors="coerce")
414
305
  return big_df
415
306
 
416
307
 
417
308
  if __name__ == "__main__":
418
- stock_board_concept_graph_ths_df = stock_board_concept_graph_ths(symbol="通用航空")
419
- print(stock_board_concept_graph_ths_df)
420
-
421
309
  stock_board_concept_name_ths_df = stock_board_concept_name_ths()
422
310
  print(stock_board_concept_name_ths_df)
423
311
 
424
- stock_board_concept_cons_ths_df = stock_board_concept_cons_ths(symbol="小米概念")
425
- print(stock_board_concept_cons_ths_df)
426
-
427
- stock_board_concept_info_ths_df = stock_board_concept_info_ths(symbol="PVDF概念")
312
+ stock_board_concept_info_ths_df = stock_board_concept_info_ths(
313
+ symbol="阿里巴巴概念"
314
+ )
428
315
  print(stock_board_concept_info_ths_df)
429
316
 
430
- stock_board_concept_hist_ths_df = stock_board_concept_hist_ths(
431
- start_year="2024", symbol="新能源汽车"
317
+ stock_board_concept_index_ths_df = stock_board_concept_index_ths(
318
+ symbol="DeepSeek概念", start_date="20200101", end_date="20250321"
432
319
  )
433
- print(stock_board_concept_hist_ths_df)
320
+ print(stock_board_concept_index_ths_df)
321
+
322
+ stock_board_concept_summary_ths_df = stock_board_concept_summary_ths()
323
+ print(stock_board_concept_summary_ths_df)
434
324
 
435
- stock_board_cons_ths_df = stock_board_cons_ths(symbol="881121")
436
- print(stock_board_cons_ths_df)
325
+ for stock in stock_board_concept_name_ths_df["name"]:
326
+ print(stock)
327
+ stock_board_industry_index_ths_df = stock_board_concept_index_ths(symbol=stock)
328
+ print(stock_board_industry_index_ths_df)