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
  # -*- coding:utf-8 -*-
2
2
  # !/usr/bin/env python
3
3
  """
4
- Date: 2024/2/7 23:00
4
+ Date: 2024/9/21 19:00
5
5
  Desc: 同花顺-数据中心-技术选股
6
6
  https://data.10jqka.com.cn/rank/cxg/
7
7
  """
@@ -9,9 +9,9 @@ https://data.10jqka.com.cn/rank/cxg/
9
9
  from io import StringIO
10
10
 
11
11
  import pandas as pd
12
+ import py_mini_racer
12
13
  import requests
13
14
  from bs4 import BeautifulSoup
14
- import py_mini_racer
15
15
 
16
16
  from akshare.datasets import get_ths_js
17
17
  from akshare.utils.tqdm import get_tqdm
@@ -26,7 +26,7 @@ def _get_file_content_ths(file: str = "ths.js") -> str:
26
26
  :rtype: str
27
27
  """
28
28
  setting_file_path = get_ths_js(file)
29
- with open(setting_file_path) as f:
29
+ with open(setting_file_path, encoding="utf-8") as f:
30
30
  file_data = f.read()
31
31
  return file_data
32
32
 
@@ -51,14 +51,20 @@ def stock_rank_cxg_ths(symbol: str = "创月新高") -> pd.DataFrame:
51
51
  js_code.eval(js_content)
52
52
  v_code = js_code.call("v")
53
53
  headers = {
54
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
54
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
55
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
55
56
  "Cookie": f"v={v_code}",
56
57
  }
57
- url = f"http://data.10jqka.com.cn/rank/cxg/board/{symbol_map[symbol]}/field/stockcode/order/asc/page/1/ajax/1/free/1/"
58
+ url = (
59
+ f"http://data.10jqka.com.cn/rank/cxg/board/{symbol_map[symbol]}/field/"
60
+ f"stockcode/order/asc/page/1/ajax/1/free/1/"
61
+ )
58
62
  r = requests.get(url, headers=headers)
59
- soup = BeautifulSoup(r.text, "lxml")
63
+ soup = BeautifulSoup(r.text, features="lxml")
60
64
  try:
61
- total_page = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
65
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
66
+ "/"
67
+ )[1]
62
68
  except AttributeError:
63
69
  total_page = 1
64
70
  big_df = pd.DataFrame()
@@ -66,13 +72,17 @@ def stock_rank_cxg_ths(symbol: str = "创月新高") -> pd.DataFrame:
66
72
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
67
73
  v_code = js_code.call("v")
68
74
  headers = {
69
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
75
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
76
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
70
77
  "Cookie": f"v={v_code}",
71
78
  }
72
- url = f"http://data.10jqka.com.cn/rank/cxg/board/{symbol_map[symbol]}/field/stockcode/order/asc/page/{page}/ajax/1/free/1/"
79
+ url = (
80
+ f"http://data.10jqka.com.cn/rank/cxg/board/{symbol_map[symbol]}/field/stockcode/"
81
+ f"order/asc/page/{page}/ajax/1/free/1/"
82
+ )
73
83
  r = requests.get(url, headers=headers)
74
84
  temp_df = pd.read_html(StringIO(r.text))[0]
75
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
85
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
76
86
  big_df.columns = [
77
87
  "序号",
78
88
  "股票代码",
@@ -116,14 +126,20 @@ def stock_rank_cxd_ths(symbol: str = "创月新低") -> pd.DataFrame:
116
126
  js_code.eval(js_content)
117
127
  v_code = js_code.call("v")
118
128
  headers = {
119
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
129
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
130
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
120
131
  "Cookie": f"v={v_code}",
121
132
  }
122
- url = f"http://data.10jqka.com.cn/rank/cxd/board/{symbol_map[symbol]}/field/stockcode/order/asc/page/1/ajax/1/free/1/"
133
+ url = (
134
+ f"http://data.10jqka.com.cn/rank/cxd/board/{symbol_map[symbol]}/field/"
135
+ f"stockcode/order/asc/page/1/ajax/1/free/1/"
136
+ )
123
137
  r = requests.get(url, headers=headers)
124
- soup = BeautifulSoup(r.text, "lxml")
138
+ soup = BeautifulSoup(r.text, features="lxml")
125
139
  try:
126
- total_page = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
140
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
141
+ "/"
142
+ )[1]
127
143
  except AttributeError:
128
144
  total_page = 1
129
145
  big_df = pd.DataFrame()
@@ -131,13 +147,17 @@ def stock_rank_cxd_ths(symbol: str = "创月新低") -> pd.DataFrame:
131
147
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
132
148
  v_code = js_code.call("v")
133
149
  headers = {
134
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
150
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
151
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
135
152
  "Cookie": f"v={v_code}",
136
153
  }
137
- url = f"http://data.10jqka.com.cn/rank/cxd/board/{symbol_map[symbol]}/field/stockcode/order/asc/page/{page}/ajax/1/free/1/"
154
+ url = (
155
+ f"http://data.10jqka.com.cn/rank/cxd/board/{symbol_map[symbol]}/field/"
156
+ f"stockcode/order/asc/page/{page}/ajax/1/free/1/"
157
+ )
138
158
  r = requests.get(url, headers=headers)
139
159
  temp_df = pd.read_html(StringIO(r.text))[0]
140
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
160
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
141
161
  big_df.columns = [
142
162
  "序号",
143
163
  "股票代码",
@@ -173,14 +193,17 @@ def stock_rank_lxsz_ths() -> pd.DataFrame:
173
193
  js_code.eval(js_content)
174
194
  v_code = js_code.call("v")
175
195
  headers = {
176
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
196
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
197
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
177
198
  "Cookie": f"v={v_code}",
178
199
  }
179
200
  url = "http://data.10jqka.com.cn/rank/lxsz/field/lxts/order/desc/page/1/ajax/1/free/1/"
180
201
  r = requests.get(url, headers=headers)
181
- soup = BeautifulSoup(r.text, "lxml")
202
+ soup = BeautifulSoup(r.text, features="lxml")
182
203
  try:
183
- total_page = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
204
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
205
+ "/"
206
+ )[1]
184
207
  except AttributeError:
185
208
  total_page = 1
186
209
  big_df = pd.DataFrame()
@@ -188,13 +211,14 @@ def stock_rank_lxsz_ths() -> pd.DataFrame:
188
211
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
189
212
  v_code = js_code.call("v")
190
213
  headers = {
191
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
214
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
215
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
192
216
  "Cookie": f"v={v_code}",
193
217
  }
194
218
  url = f"http://data.10jqka.com.cn/rank/lxsz/field/lxts/order/desc/page/{page}/ajax/1/free/1/"
195
219
  r = requests.get(url, headers=headers)
196
220
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
197
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
221
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
198
222
  big_df.columns = [
199
223
  "序号",
200
224
  "股票代码",
@@ -230,14 +254,17 @@ def stock_rank_lxxd_ths() -> pd.DataFrame:
230
254
  js_code.eval(js_content)
231
255
  v_code = js_code.call("v")
232
256
  headers = {
233
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
257
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
258
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
234
259
  "Cookie": f"v={v_code}",
235
260
  }
236
261
  url = "http://data.10jqka.com.cn/rank/lxxd/field/lxts/order/desc/page/1/ajax/1/free/1/"
237
262
  r = requests.get(url, headers=headers)
238
- soup = BeautifulSoup(r.text, "lxml")
263
+ soup = BeautifulSoup(r.text, features="lxml")
239
264
  try:
240
- total_page = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
265
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
266
+ "/"
267
+ )[1]
241
268
  except AttributeError:
242
269
  total_page = 1
243
270
  big_df = pd.DataFrame()
@@ -245,13 +272,14 @@ def stock_rank_lxxd_ths() -> pd.DataFrame:
245
272
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
246
273
  v_code = js_code.call("v")
247
274
  headers = {
248
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
275
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
276
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
249
277
  "Cookie": f"v={v_code}",
250
278
  }
251
279
  url = f"http://data.10jqka.com.cn/rank/lxxd/field/lxts/order/desc/page/{page}/ajax/1/free/1/"
252
280
  r = requests.get(url, headers=headers)
253
281
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
254
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
282
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
255
283
  big_df.columns = [
256
284
  "序号",
257
285
  "股票代码",
@@ -287,14 +315,17 @@ def stock_rank_cxfl_ths() -> pd.DataFrame:
287
315
  js_code.eval(js_content)
288
316
  v_code = js_code.call("v")
289
317
  headers = {
290
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
318
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
319
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
291
320
  "Cookie": f"v={v_code}",
292
321
  }
293
322
  url = "http://data.10jqka.com.cn/rank/cxfl/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
294
323
  r = requests.get(url, headers=headers)
295
- soup = BeautifulSoup(r.text, "lxml")
324
+ soup = BeautifulSoup(r.text, features="lxml")
296
325
  try:
297
- total_page = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
326
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
327
+ "/"
328
+ )[1]
298
329
  except AttributeError:
299
330
  total_page = 1
300
331
  big_df = pd.DataFrame()
@@ -302,13 +333,14 @@ def stock_rank_cxfl_ths() -> pd.DataFrame:
302
333
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
303
334
  v_code = js_code.call("v")
304
335
  headers = {
305
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
336
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
337
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
306
338
  "Cookie": f"v={v_code}",
307
339
  }
308
340
  url = f"http://data.10jqka.com.cn/rank/cxfl/field/count/order/desc/ajax/1/free/1/page/{page}/free/1/"
309
341
  r = requests.get(url, headers=headers)
310
342
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
311
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
343
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
312
344
  big_df.columns = [
313
345
  "序号",
314
346
  "股票代码",
@@ -343,14 +375,17 @@ def stock_rank_cxsl_ths() -> pd.DataFrame:
343
375
  js_code.eval(js_content)
344
376
  v_code = js_code.call("v")
345
377
  headers = {
346
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
378
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
379
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
347
380
  "Cookie": f"v={v_code}",
348
381
  }
349
382
  url = "http://data.10jqka.com.cn/rank/cxsl/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
350
383
  r = requests.get(url, headers=headers)
351
- soup = BeautifulSoup(r.text, "lxml")
384
+ soup = BeautifulSoup(r.text, features="lxml")
352
385
  try:
353
- total_page = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
386
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
387
+ "/"
388
+ )[1]
354
389
  except AttributeError:
355
390
  total_page = 1
356
391
  big_df = pd.DataFrame()
@@ -358,13 +393,14 @@ def stock_rank_cxsl_ths() -> pd.DataFrame:
358
393
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
359
394
  v_code = js_code.call("v")
360
395
  headers = {
361
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
396
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
397
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
362
398
  "Cookie": f"v={v_code}",
363
399
  }
364
400
  url = f"http://data.10jqka.com.cn/rank/cxsl/field/count/order/desc/ajax/1/free/1/page/{page}/free/1/"
365
401
  r = requests.get(url, headers=headers)
366
402
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
367
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
403
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
368
404
  big_df.columns = [
369
405
  "序号",
370
406
  "股票代码",
@@ -411,14 +447,17 @@ def stock_rank_xstp_ths(symbol: str = "500日均线") -> pd.DataFrame:
411
447
  js_code.eval(js_content)
412
448
  v_code = js_code.call("v")
413
449
  headers = {
414
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
450
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
451
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
415
452
  "Cookie": f"v={v_code}",
416
453
  }
417
454
  url = f"http://data.10jqka.com.cn/rank/xstp/board/{symbol_map[symbol]}/order/asc/ajax/1/free/1/page/1/free/1/"
418
455
  r = requests.get(url, headers=headers)
419
- soup = BeautifulSoup(r.text, "lxml")
456
+ soup = BeautifulSoup(r.text, features="lxml")
420
457
  try:
421
- total_page = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
458
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
459
+ "/"
460
+ )[1]
422
461
  except AttributeError:
423
462
  total_page = 1
424
463
  big_df = pd.DataFrame()
@@ -426,13 +465,17 @@ def stock_rank_xstp_ths(symbol: str = "500日均线") -> pd.DataFrame:
426
465
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
427
466
  v_code = js_code.call("v")
428
467
  headers = {
429
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
468
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
469
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
430
470
  "Cookie": f"v={v_code}",
431
471
  }
432
- url = f"http://data.10jqka.com.cn/rank/xstp/board/{symbol_map[symbol]}/order/asc/ajax/1/free/1/page/{page}/free/1/"
472
+ url = (
473
+ f"http://data.10jqka.com.cn/rank/xstp/board/{symbol_map[symbol]}/order/"
474
+ f"asc/ajax/1/free/1/page/{page}/free/1/"
475
+ )
433
476
  r = requests.get(url, headers=headers)
434
477
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
435
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
478
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
436
479
  big_df.columns = [
437
480
  "序号",
438
481
  "股票代码",
@@ -476,14 +519,17 @@ def stock_rank_xxtp_ths(symbol: str = "500日均线") -> pd.DataFrame:
476
519
  js_code.eval(js_content)
477
520
  v_code = js_code.call("v")
478
521
  headers = {
479
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
522
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
523
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
480
524
  "Cookie": f"v={v_code}",
481
525
  }
482
526
  url = f"http://data.10jqka.com.cn/rank/xxtp/board/{symbol_map[symbol]}/order/asc/ajax/1/free/1/page/1/free/1/"
483
527
  r = requests.get(url, headers=headers)
484
- soup = BeautifulSoup(r.text, "lxml")
528
+ soup = BeautifulSoup(r.text, features="lxml")
485
529
  try:
486
- total_page = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
530
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
531
+ "/"
532
+ )[1]
487
533
  except AttributeError:
488
534
  total_page = 1
489
535
  big_df = pd.DataFrame()
@@ -491,13 +537,17 @@ def stock_rank_xxtp_ths(symbol: str = "500日均线") -> pd.DataFrame:
491
537
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
492
538
  v_code = js_code.call("v")
493
539
  headers = {
494
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
540
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
541
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
495
542
  "Cookie": f"v={v_code}",
496
543
  }
497
- url = f"http://data.10jqka.com.cn/rank/xxtp/board/{symbol_map[symbol]}/order/asc/ajax/1/free/1/page/{page}/free/1/"
544
+ url = (
545
+ f"http://data.10jqka.com.cn/rank/xxtp/board/{symbol_map[symbol]}/order/"
546
+ f"asc/ajax/1/free/1/page/{page}/free/1/"
547
+ )
498
548
  r = requests.get(url, headers=headers)
499
549
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
500
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
550
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
501
551
  big_df.columns = [
502
552
  "序号",
503
553
  "股票代码",
@@ -529,14 +579,17 @@ def stock_rank_ljqs_ths() -> pd.DataFrame:
529
579
  js_code.eval(js_content)
530
580
  v_code = js_code.call("v")
531
581
  headers = {
532
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
582
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
583
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
533
584
  "Cookie": f"v={v_code}",
534
585
  }
535
586
  url = "http://data.10jqka.com.cn/rank/ljqs/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
536
587
  r = requests.get(url, headers=headers)
537
- soup = BeautifulSoup(r.text, "lxml")
588
+ soup = BeautifulSoup(r.text, features="lxml")
538
589
  try:
539
- total_page = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
590
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
591
+ "/"
592
+ )[1]
540
593
  except AttributeError:
541
594
  total_page = 1
542
595
  big_df = pd.DataFrame()
@@ -544,13 +597,14 @@ def stock_rank_ljqs_ths() -> pd.DataFrame:
544
597
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
545
598
  v_code = js_code.call("v")
546
599
  headers = {
547
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
600
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
601
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
548
602
  "Cookie": f"v={v_code}",
549
603
  }
550
604
  url = f"http://data.10jqka.com.cn/rank/ljqs/field/count/order/desc/ajax/1/free/1/page/{page}/free/1/"
551
605
  r = requests.get(url, headers=headers)
552
606
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
553
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
607
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
554
608
  big_df.columns = [
555
609
  "序号",
556
610
  "股票代码",
@@ -583,14 +637,17 @@ def stock_rank_ljqd_ths() -> pd.DataFrame:
583
637
  js_code.eval(js_content)
584
638
  v_code = js_code.call("v")
585
639
  headers = {
586
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
640
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
641
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
587
642
  "Cookie": f"v={v_code}",
588
643
  }
589
644
  url = "http://data.10jqka.com.cn/rank/ljqd/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
590
645
  r = requests.get(url, headers=headers)
591
- soup = BeautifulSoup(r.text, "lxml")
646
+ soup = BeautifulSoup(r.text, features="lxml")
592
647
  try:
593
- total_page = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
648
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
649
+ "/"
650
+ )[1]
594
651
  except AttributeError:
595
652
  total_page = 1
596
653
  big_df = pd.DataFrame()
@@ -598,13 +655,14 @@ def stock_rank_ljqd_ths() -> pd.DataFrame:
598
655
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
599
656
  v_code = js_code.call("v")
600
657
  headers = {
601
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
658
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
659
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
602
660
  "Cookie": f"v={v_code}",
603
661
  }
604
662
  url = f"http://data.10jqka.com.cn/rank/ljqd/field/count/order/desc/ajax/1/free/1/page/{page}/free/1/"
605
663
  r = requests.get(url, headers=headers)
606
664
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
607
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
665
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
608
666
  big_df.columns = [
609
667
  "序号",
610
668
  "股票代码",
@@ -635,30 +693,17 @@ def stock_rank_xzjp_ths() -> pd.DataFrame:
635
693
  js_code = py_mini_racer.MiniRacer()
636
694
  js_content = _get_file_content_ths("ths.js")
637
695
  js_code.eval(js_content)
696
+ big_df = pd.DataFrame()
638
697
  v_code = js_code.call("v")
639
698
  headers = {
640
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
699
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
700
+ "(KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
641
701
  "Cookie": f"v={v_code}",
642
702
  }
643
703
  url = "http://data.10jqka.com.cn/ajax/xzjp/field/DECLAREDATE/order/desc/ajax/1/free/1/"
644
704
  r = requests.get(url, headers=headers)
645
- soup = BeautifulSoup(r.text, "lxml")
646
- try:
647
- total_page = soup.find("span", attrs={"class": "page_info"}).text.split("/")[1]
648
- except AttributeError:
649
- total_page = 1
650
- big_df = pd.DataFrame()
651
- tqdm = get_tqdm()
652
- for page in tqdm(range(1, int(total_page) + 1), leave=False):
653
- v_code = js_code.call("v")
654
- headers = {
655
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
656
- "Cookie": f"v={v_code}",
657
- }
658
- url = "http://data.10jqka.com.cn/ajax/xzjp/field/DECLAREDATE/order/desc/ajax/1/free/1/"
659
- r = requests.get(url, headers=headers)
660
- temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
661
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
705
+ temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
706
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
662
707
  big_df.columns = [
663
708
  "序号",
664
709
  "举牌公告日",
@@ -14,7 +14,7 @@ def stock_tfp_em(date: str = "20240426") -> pd.DataFrame:
14
14
  """
15
15
  东方财富网-数据中心-特色数据-停复牌信息
16
16
  https://data.eastmoney.com/tfpxx/
17
- :param date: specific date as "2020-03-19"
17
+ :param date: 查询参数 "20240426"
18
18
  :type date: str
19
19
  :return: 停复牌信息表
20
20
  :rtype: pandas.DataFrame
@@ -56,6 +56,7 @@ def stock_tfp_em(date: str = "20240426") -> pd.DataFrame:
56
56
  "预计复牌时间",
57
57
  "-",
58
58
  "-",
59
+ "-",
59
60
  ]
60
61
  big_df = big_df[
61
62
  [
@@ -1,7 +1,7 @@
1
1
  # -*- coding:utf-8 -*-
2
2
  # !/usr/bin/env python
3
3
  """
4
- Date: 2024/5/21 22:00
4
+ Date: 2025/5/8 20:00
5
5
  Desc: 东方财富-股票-财务分析
6
6
  """
7
7
 
@@ -68,6 +68,8 @@ def stock_balance_sheet_by_report_em(symbol: str = "SH600519") -> pd.DataFrame:
68
68
  }
69
69
  r = requests.get(url, params=params)
70
70
  data_json = r.json()
71
+ if "data" not in data_json.keys():
72
+ break
71
73
  temp_df = pd.DataFrame(data_json["data"])
72
74
  for col in temp_df.columns:
73
75
  if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
@@ -100,7 +102,7 @@ def stock_balance_sheet_by_yearly_em(symbol: str = "SH600036") -> pd.DataFrame:
100
102
  try:
101
103
  temp_df = pd.DataFrame(data_json["data"])
102
104
  except: # noqa: E722
103
- company_type = 3
105
+ company_type = '3'
104
106
  params.update({"companyType": company_type})
105
107
  r = requests.get(url, params=params)
106
108
  data_json = r.json()
@@ -124,6 +126,8 @@ def stock_balance_sheet_by_yearly_em(symbol: str = "SH600036") -> pd.DataFrame:
124
126
  }
125
127
  r = requests.get(url, params=params)
126
128
  data_json = r.json()
129
+ if "data" not in data_json.keys():
130
+ break
127
131
  temp_df = pd.DataFrame(data_json["data"])
128
132
  for col in temp_df.columns:
129
133
  if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
@@ -171,6 +175,8 @@ def stock_profit_sheet_by_report_em(symbol: str = "SH600519") -> pd.DataFrame:
171
175
  }
172
176
  r = requests.get(url, params=params)
173
177
  data_json = r.json()
178
+ if "data" not in data_json.keys():
179
+ break
174
180
  temp_df = pd.DataFrame(data_json["data"])
175
181
  for col in temp_df.columns:
176
182
  if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
@@ -218,6 +224,8 @@ def stock_profit_sheet_by_yearly_em(symbol: str = "SH600519") -> pd.DataFrame:
218
224
  }
219
225
  r = requests.get(url, params=params)
220
226
  data_json = r.json()
227
+ if "data" not in data_json.keys():
228
+ break
221
229
  temp_df = pd.DataFrame(data_json["data"])
222
230
  for col in temp_df.columns:
223
231
  if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
@@ -267,6 +275,8 @@ def stock_profit_sheet_by_quarterly_em(
267
275
  }
268
276
  r = requests.get(url, params=params)
269
277
  data_json = r.json()
278
+ if "data" not in data_json.keys():
279
+ break
270
280
  temp_df = pd.DataFrame(data_json["data"])
271
281
  for col in temp_df.columns:
272
282
  if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
@@ -316,6 +326,8 @@ def stock_cash_flow_sheet_by_report_em(
316
326
  }
317
327
  r = requests.get(url, params=params)
318
328
  data_json = r.json()
329
+ if "data" not in data_json.keys():
330
+ break
319
331
  temp_df = pd.DataFrame(data_json["data"])
320
332
  for col in temp_df.columns:
321
333
  if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
@@ -365,6 +377,8 @@ def stock_cash_flow_sheet_by_yearly_em(
365
377
  }
366
378
  r = requests.get(url, params=params)
367
379
  data_json = r.json()
380
+ if "data" not in data_json.keys():
381
+ break
368
382
  temp_df = pd.DataFrame(data_json["data"])
369
383
  for col in temp_df.columns:
370
384
  if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
@@ -414,6 +428,8 @@ def stock_cash_flow_sheet_by_quarterly_em(
414
428
  }
415
429
  r = requests.get(url, params=params)
416
430
  data_json = r.json()
431
+ if "data" not in data_json.keys():
432
+ break
417
433
  temp_df = pd.DataFrame(data_json["data"])
418
434
  for col in temp_df.columns:
419
435
  if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
@@ -437,15 +453,15 @@ def __get_report_date_list_delisted_em(symbol: str = "SZ000013") -> list:
437
453
  url = "https://datacenter.eastmoney.com/securities/api/data/get"
438
454
  params = {
439
455
  "type": "RPT_F10_FINANCE_GINCOME",
440
- "sty": "SECURITY_CODE,REPORT_DATE,REPORT_TYPE,REPORT_DATE_NAME",
441
- "filter": f'(SECURITY_CODE="{symbol[2:]}")',
456
+ "sty": "SECUCODE,SECURITY_CODE,REPORT_DATE,REPORT_TYPE,REPORT_DATE_NAME",
457
+ "filter": f'(SECUCODE="{symbol[2:]}.{symbol[:2]}")',
442
458
  "p": "1",
443
459
  "ps": "200",
444
460
  "sr": "-1",
445
461
  "st": "REPORT_DATE",
446
462
  "source": "HSF10",
447
463
  "client": "PC",
448
- "v": "05767841728614413",
464
+ "v": "07306678536291241",
449
465
  }
450
466
  r = requests.get(url, params=params)
451
467
  data_json = r.json()
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/4/11 20:40
4
+ Date: 2025/10/30 15:00
5
5
  Desc: 全部A股-等权重市盈率、中位数市盈率
6
6
  https://www.legulegu.com/stockdata/a-ttm-lyr
7
7
  """
@@ -14,27 +14,36 @@ from akshare.stock_feature.stock_a_indicator import get_token_lg, get_cookie_csr
14
14
  def stock_a_ttm_lyr() -> pd.DataFrame:
15
15
  """
16
16
  全部 A 股-等权重市盈率、中位数市盈率
17
- https://www.legulegu.com/stockdata/a-ttm-lyr
18
17
  :return: 全部A股-等权重市盈率、中位数市盈率
19
18
  :rtype: pandas.DataFrame
20
19
  """
20
+
21
21
  url = "https://legulegu.com/api/stock-data/market-ttm-lyr"
22
22
  params = {
23
23
  "marketId": "5",
24
24
  "token": get_token_lg(),
25
25
  }
26
- r = requests.get(
26
+ # 获取 cookie 和 headers
27
+ csrf_data = get_cookie_csrf(url="https://www.legulegu.com/stockdata/a-ttm-lyr")
28
+ # 使用返回的 headers(已经是副本)
29
+ request_headers = csrf_data['headers'].copy()
30
+ request_headers.update({
31
+ "host": "www.legulegu.com",
32
+ "referer": "https://www.legulegu.com/stockdata/a-ttm-lyr",
33
+ })
34
+ # 使用独立的 session
35
+ session = requests.Session()
36
+ r = session.get(
27
37
  url,
28
38
  params=params,
29
- **get_cookie_csrf(url="https://www.legulegu.com/stockdata/a-ttm-lyr")
39
+ cookies=csrf_data['cookies'],
40
+ headers=request_headers,
30
41
  )
31
42
  data_json = r.json()
32
43
  temp_df = pd.DataFrame(data_json["data"])
33
- temp_df["date"] = (
34
- pd.to_datetime(temp_df["date"], unit="ms", utc=True)
35
- .dt.tz_convert("Asia/Shanghai")
36
- .dt.date
37
- )
44
+ temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
45
+ # 关闭 session
46
+ session.close()
38
47
  return temp_df
39
48
 
40
49