akshare 1.12.99__py3-none-any.whl → 1.15.72__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.

Potentially problematic release.


This version of akshare might be problematic. Click here for more details.

Files changed (236) hide show
  1. akshare/__init__.py +441 -138
  2. akshare/air/air_hebei.py +79 -53
  3. akshare/air/air_zhenqi.py +29 -43
  4. akshare/air/sunrise_tad.py +32 -17
  5. akshare/bank/bank_cbirc_2020.py +12 -9
  6. akshare/bond/bond_cb_ths.py +17 -9
  7. akshare/bond/bond_china.py +38 -39
  8. akshare/bond/bond_china_money.py +75 -48
  9. akshare/bond/bond_info_cm.py +28 -8
  10. akshare/bond/bond_issue_cninfo.py +73 -30
  11. akshare/bond/bond_zh_cov.py +1 -1
  12. akshare/bond/bond_zh_sina.py +57 -51
  13. akshare/cal/__init__.py +0 -0
  14. akshare/cal/rv.py +170 -0
  15. akshare/cost/cost_living.py +7 -5
  16. akshare/currency/currency_safe.py +7 -6
  17. akshare/data/cninfo.js +15 -0
  18. akshare/datasets.py +10 -21
  19. akshare/economic/macro_bank.py +95 -653
  20. akshare/economic/macro_china.py +772 -1024
  21. akshare/economic/macro_china_hk.py +65 -243
  22. akshare/economic/macro_china_nbs.py +24 -7
  23. akshare/economic/macro_constitute.py +17 -12
  24. akshare/economic/macro_euro.py +13 -6
  25. akshare/economic/macro_finance_ths.py +133 -0
  26. akshare/economic/macro_info_ws.py +100 -0
  27. akshare/economic/macro_japan.py +5 -4
  28. akshare/economic/macro_other.py +12 -9
  29. akshare/economic/macro_usa.py +376 -1940
  30. akshare/economic/marco_cnbs.py +11 -6
  31. akshare/energy/energy_carbon.py +94 -125
  32. akshare/event/migration.py +3 -2
  33. akshare/exceptions.py +43 -0
  34. akshare/file_fold/calendar.json +245 -2
  35. akshare/fortune/fortune_500.py +15 -48
  36. akshare/fund/fund_amac.py +157 -75
  37. akshare/fund/fund_em.py +191 -184
  38. akshare/fund/fund_etf_em.py +16 -15
  39. akshare/fund/fund_etf_sina.py +71 -23
  40. akshare/fund/fund_etf_ths.py +93 -0
  41. akshare/fund/fund_fee_em.py +98 -0
  42. akshare/fund/fund_portfolio_em.py +60 -50
  43. akshare/fund/fund_rank_em.py +91 -82
  44. akshare/fund/fund_report_cninfo.py +63 -48
  45. akshare/fund/fund_scale_sina.py +20 -10
  46. akshare/fund/fund_xq.py +139 -109
  47. akshare/futures/cons.py +8 -31
  48. akshare/futures/cot.py +185 -137
  49. akshare/futures/futures_basis.py +97 -32
  50. akshare/futures/futures_comm_ctp.py +37 -0
  51. akshare/futures/futures_comm_qihuo.py +74 -45
  52. akshare/futures/futures_daily_bar.py +121 -184
  53. akshare/futures/futures_hf_em.py +66 -61
  54. akshare/futures/futures_hq_sina.py +79 -61
  55. akshare/futures/futures_index_ccidx.py +6 -3
  56. akshare/futures/futures_inventory_99.py +61 -272
  57. akshare/futures/futures_news_shmet.py +4 -2
  58. akshare/futures/futures_roll_yield.py +12 -25
  59. akshare/futures/futures_spot_stock_em.py +19 -13
  60. akshare/futures/futures_stock_js.py +14 -12
  61. akshare/futures/futures_to_spot.py +38 -33
  62. akshare/futures/futures_warehouse_receipt.py +75 -71
  63. akshare/futures/futures_zh_sina.py +5 -5
  64. akshare/futures/symbol_var.py +18 -13
  65. akshare/futures_derivative/futures_contract_info_czce.py +60 -52
  66. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  67. akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
  68. akshare/futures_derivative/futures_cot_sina.py +26 -19
  69. akshare/futures_derivative/futures_spot_sys.py +21 -8
  70. akshare/fx/currency_investing.py +19 -285
  71. akshare/index/index_cflp.py +29 -26
  72. akshare/index/index_cni.py +86 -88
  73. akshare/index/index_cons.py +26 -10
  74. akshare/index/index_cx.py +248 -47
  75. akshare/index/index_drewry.py +17 -16
  76. akshare/index/index_option_qvix.py +329 -0
  77. akshare/index/index_research_fund_sw.py +134 -0
  78. akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
  79. akshare/index/index_spot.py +9 -5
  80. akshare/index/index_stock_hk.py +35 -16
  81. akshare/index/index_stock_us_sina.py +1 -1
  82. akshare/index/index_stock_zh.py +180 -89
  83. akshare/index/index_stock_zh_csindex.py +15 -369
  84. akshare/index/index_sw.py +62 -34
  85. akshare/index/index_yw.py +46 -23
  86. akshare/index/index_zh_a_scope.py +48 -0
  87. akshare/index/index_zh_em.py +6 -4
  88. akshare/interest_rate/interbank_rate_em.py +14 -9
  89. akshare/movie/artist_yien.py +32 -5
  90. akshare/movie/movie_yien.py +92 -18
  91. akshare/movie/video_yien.py +28 -5
  92. akshare/news/news_baidu.py +78 -44
  93. akshare/news/news_cctv.py +38 -38
  94. akshare/news/news_stock.py +6 -3
  95. akshare/nlp/nlp_interface.py +7 -8
  96. akshare/option/cons.py +11 -11
  97. akshare/option/option_comm_qihuo.py +86 -0
  98. akshare/option/option_commodity.py +178 -51
  99. akshare/option/option_daily_stats_sse_szse.py +146 -0
  100. akshare/option/option_em.py +147 -138
  101. akshare/option/option_finance_sina.py +160 -137
  102. akshare/option/option_lhb_em.py +62 -56
  103. akshare/option/option_risk_indicator_sse.py +17 -14
  104. akshare/other/other_car_cpca.py +934 -0
  105. akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
  106. akshare/qdii/__init__.py +0 -0
  107. akshare/qdii/qdii_jsl.py +233 -0
  108. akshare/request.py +117 -0
  109. akshare/spot/spot_hog_soozhu.py +232 -0
  110. akshare/spot/spot_price_qh.py +121 -0
  111. akshare/spot/spot_sge.py +63 -10
  112. akshare/stock/stock_allotment_cninfo.py +10 -9
  113. akshare/stock/stock_board_concept_em.py +23 -14
  114. akshare/stock/stock_board_industry_em.py +40 -34
  115. akshare/stock/stock_cg_equity_mortgage.py +15 -11
  116. akshare/stock/stock_cg_guarantee.py +41 -51
  117. akshare/stock/stock_cg_lawsuit.py +36 -35
  118. akshare/stock/stock_dividend_cninfo.py +12 -6
  119. akshare/stock/stock_dzjy_em.py +347 -260
  120. akshare/stock/stock_fund_em.py +332 -84
  121. akshare/stock/stock_hk_famous.py +108 -0
  122. akshare/stock/stock_hk_sina.py +8 -7
  123. akshare/stock/stock_hold_control_cninfo.py +100 -15
  124. akshare/stock/stock_hold_control_em.py +4 -3
  125. akshare/stock/stock_hold_num_cninfo.py +18 -12
  126. akshare/stock/stock_hot_rank_em.py +2 -1
  127. akshare/stock/stock_hot_search_baidu.py +5 -2
  128. akshare/stock/stock_industry_cninfo.py +24 -18
  129. akshare/stock/stock_industry_pe_cninfo.py +45 -31
  130. akshare/stock/stock_industry_sw.py +9 -10
  131. akshare/stock/stock_info.py +25 -15
  132. akshare/stock/stock_info_em.py +5 -2
  133. akshare/stock/stock_intraday_em.py +5 -2
  134. akshare/stock/stock_intraday_sina.py +22 -18
  135. akshare/stock/stock_ipo_summary_cninfo.py +25 -10
  136. akshare/stock/stock_new_cninfo.py +32 -19
  137. akshare/stock/stock_news_cx.py +39 -0
  138. akshare/stock/stock_profile_cninfo.py +9 -8
  139. akshare/stock/stock_rank_forecast.py +8 -6
  140. akshare/stock/stock_share_changes_cninfo.py +18 -14
  141. akshare/stock/stock_share_hold.py +24 -19
  142. akshare/stock/stock_summary.py +54 -26
  143. akshare/stock/stock_us_famous.py +15 -6
  144. akshare/stock/stock_us_pink.py +7 -5
  145. akshare/stock/stock_us_sina.py +15 -12
  146. akshare/stock/stock_xq.py +38 -12
  147. akshare/stock/stock_zh_a_sina.py +53 -78
  148. akshare/stock/stock_zh_b_sina.py +32 -55
  149. akshare/stock/stock_zh_kcb_report.py +11 -9
  150. akshare/stock/stock_zh_kcb_sina.py +67 -64
  151. akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
  152. akshare/stock_feature/stock_a_high_low.py +5 -2
  153. akshare/stock_feature/stock_a_indicator.py +12 -9
  154. akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
  155. akshare/stock_feature/stock_account_em.py +58 -40
  156. akshare/stock_feature/stock_analyst_em.py +36 -27
  157. akshare/stock_feature/stock_board_industry_ths.py +136 -400
  158. akshare/stock_feature/stock_comment_em.py +118 -85
  159. akshare/stock_feature/stock_concept_futu.py +183 -0
  160. akshare/stock_feature/stock_cyq_em.py +58 -54
  161. akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
  162. akshare/stock_feature/stock_esg_sina.py +216 -11
  163. akshare/stock_feature/stock_fhps_em.py +60 -25
  164. akshare/stock_feature/stock_fhps_ths.py +25 -6
  165. akshare/stock_feature/stock_fund_flow.py +38 -25
  166. akshare/stock_feature/stock_gdfx_em.py +180 -95
  167. akshare/stock_feature/stock_gdhs.py +73 -49
  168. akshare/stock_feature/stock_gpzy_em.py +78 -46
  169. akshare/stock_feature/stock_hist_em.py +55 -23
  170. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  171. akshare/stock_feature/stock_hsgt_em.py +184 -452
  172. akshare/stock_feature/stock_info.py +52 -29
  173. akshare/stock_feature/stock_inner_trade_xq.py +39 -31
  174. akshare/stock_feature/stock_irm_cninfo.py +32 -9
  175. akshare/stock_feature/stock_jgdy_em.py +41 -38
  176. akshare/stock_feature/stock_lh_yybpm.py +36 -37
  177. akshare/stock_feature/stock_lhb_em.py +135 -71
  178. akshare/stock_feature/stock_lhb_sina.py +93 -46
  179. akshare/stock_feature/stock_margin_em.py +102 -0
  180. akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
  181. akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
  182. akshare/stock_feature/stock_market_legu.py +13 -8
  183. akshare/stock_feature/stock_pankou_em.py +72 -34
  184. akshare/stock_feature/stock_report_em.py +244 -54
  185. akshare/stock_feature/stock_research_report_em.py +48 -19
  186. akshare/stock_feature/stock_sns_sseinfo.py +15 -12
  187. akshare/stock_feature/stock_sy_em.py +86 -33
  188. akshare/stock_feature/stock_technology_ths.py +152 -120
  189. akshare/stock_feature/stock_tfp_em.py +35 -13
  190. akshare/stock_feature/stock_three_report_em.py +119 -77
  191. akshare/stock_feature/stock_ttm_lyr.py +4 -7
  192. akshare/stock_feature/stock_value_em.py +83 -0
  193. akshare/stock_feature/stock_wencai.py +21 -9
  194. akshare/stock_feature/stock_yjyg_em.py +63 -28
  195. akshare/stock_feature/stock_zf_pg.py +61 -38
  196. akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
  197. akshare/stock_feature/stock_ztb_em.py +62 -40
  198. akshare/stock_fundamental/stock_finance.py +150 -58
  199. akshare/stock_fundamental/stock_finance_ths.py +116 -31
  200. akshare/stock_fundamental/stock_mda_ym.py +5 -3
  201. akshare/stock_fundamental/stock_notice.py +29 -15
  202. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  203. akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
  204. akshare/stock_fundamental/stock_register_em.py +448 -0
  205. akshare/stock_fundamental/stock_restricted_em.py +79 -32
  206. akshare/stock_fundamental/stock_zygc.py +10 -8
  207. akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
  208. akshare/tool/trade_date_hist.py +4 -3
  209. akshare/utils/cons.py +10 -0
  210. akshare/utils/context.py +43 -0
  211. akshare/utils/demjson.py +2 -2
  212. akshare/utils/func.py +26 -0
  213. akshare/utils/tqdm.py +13 -3
  214. {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/METADATA +52 -69
  215. akshare-1.15.72.dist-info/RECORD +385 -0
  216. {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/WHEEL +1 -1
  217. tests/test_func.py +3 -5
  218. akshare/bond/bond_futures.py +0 -50
  219. akshare/bond/bond_investing.py +0 -139
  220. akshare/crypto/crypto_hist_investing.py +0 -249
  221. akshare/fortune/fortune_it_juzi.py +0 -123
  222. akshare/futures/futures_international.py +0 -170
  223. akshare/futures/futures_news_baidu.py +0 -54
  224. akshare/futures/inventory_data.py +0 -100
  225. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  226. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  227. akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
  228. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  229. akshare/index/index_fear_greed_funddb.py +0 -71
  230. akshare/index/index_investing.py +0 -232
  231. akshare/sport/sport_olympic_winter.py +0 -39
  232. akshare/stock_feature/stock_board_concept_ths.py +0 -422
  233. akshare/stock_fundamental/stock_register.py +0 -292
  234. akshare-1.12.99.dist-info/RECORD +0 -374
  235. {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/LICENSE +0 -0
  236. {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/top_level.txt +0 -0
@@ -1,16 +1,17 @@
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
  """
8
+
8
9
  from io import StringIO
9
10
 
10
11
  import pandas as pd
12
+ import py_mini_racer
11
13
  import requests
12
14
  from bs4 import BeautifulSoup
13
- from py_mini_racer import py_mini_racer
14
15
 
15
16
  from akshare.datasets import get_ths_js
16
17
  from akshare.utils.tqdm import get_tqdm
@@ -25,7 +26,7 @@ def _get_file_content_ths(file: str = "ths.js") -> str:
25
26
  :rtype: str
26
27
  """
27
28
  setting_file_path = get_ths_js(file)
28
- with open(setting_file_path) as f:
29
+ with open(setting_file_path, encoding="utf-8") as f:
29
30
  file_data = f.read()
30
31
  return file_data
31
32
 
@@ -50,30 +51,38 @@ def stock_rank_cxg_ths(symbol: str = "创月新高") -> pd.DataFrame:
50
51
  js_code.eval(js_content)
51
52
  v_code = js_code.call("v")
52
53
  headers = {
53
- "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",
54
56
  "Cookie": f"v={v_code}",
55
57
  }
56
- 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
+ )
57
62
  r = requests.get(url, headers=headers)
58
- soup = BeautifulSoup(r.text, "lxml")
63
+ soup = BeautifulSoup(r.text, features="lxml")
59
64
  try:
60
- total_page = soup.find(
61
- "span", attrs={"class": "page_info"}
62
- ).text.split("/")[1]
63
- except AttributeError as e:
65
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
66
+ "/"
67
+ )[1]
68
+ except AttributeError:
64
69
  total_page = 1
65
70
  big_df = pd.DataFrame()
66
71
  tqdm = get_tqdm()
67
72
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
68
73
  v_code = js_code.call("v")
69
74
  headers = {
70
- "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",
71
77
  "Cookie": f"v={v_code}",
72
78
  }
73
- 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
+ )
74
83
  r = requests.get(url, headers=headers)
75
84
  temp_df = pd.read_html(StringIO(r.text))[0]
76
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
85
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
77
86
  big_df.columns = [
78
87
  "序号",
79
88
  "股票代码",
@@ -87,7 +96,9 @@ def stock_rank_cxg_ths(symbol: str = "创月新高") -> pd.DataFrame:
87
96
  big_df["股票代码"] = big_df["股票代码"].astype(str).str.zfill(6)
88
97
  big_df["涨跌幅"] = big_df["涨跌幅"].str.strip("%")
89
98
  big_df["换手率"] = big_df["换手率"].str.strip("%")
90
- big_df["前期高点日期"] = pd.to_datetime(big_df["前期高点日期"], errors="coerce").dt.date
99
+ big_df["前期高点日期"] = pd.to_datetime(
100
+ big_df["前期高点日期"], errors="coerce"
101
+ ).dt.date
91
102
  big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
92
103
  big_df["换手率"] = pd.to_numeric(big_df["换手率"], errors="coerce")
93
104
  big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
@@ -115,30 +126,38 @@ def stock_rank_cxd_ths(symbol: str = "创月新低") -> pd.DataFrame:
115
126
  js_code.eval(js_content)
116
127
  v_code = js_code.call("v")
117
128
  headers = {
118
- "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",
119
131
  "Cookie": f"v={v_code}",
120
132
  }
121
- 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
+ )
122
137
  r = requests.get(url, headers=headers)
123
- soup = BeautifulSoup(r.text, "lxml")
138
+ soup = BeautifulSoup(r.text, features="lxml")
124
139
  try:
125
- total_page = soup.find(
126
- "span", attrs={"class": "page_info"}
127
- ).text.split("/")[1]
128
- except AttributeError as e:
140
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
141
+ "/"
142
+ )[1]
143
+ except AttributeError:
129
144
  total_page = 1
130
145
  big_df = pd.DataFrame()
131
146
  tqdm = get_tqdm()
132
147
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
133
148
  v_code = js_code.call("v")
134
149
  headers = {
135
- "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",
136
152
  "Cookie": f"v={v_code}",
137
153
  }
138
- 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
+ )
139
158
  r = requests.get(url, headers=headers)
140
159
  temp_df = pd.read_html(StringIO(r.text))[0]
141
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
160
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
142
161
  big_df.columns = [
143
162
  "序号",
144
163
  "股票代码",
@@ -152,7 +171,9 @@ def stock_rank_cxd_ths(symbol: str = "创月新低") -> pd.DataFrame:
152
171
  big_df["股票代码"] = big_df["股票代码"].astype(str).str.zfill(6)
153
172
  big_df["涨跌幅"] = big_df["涨跌幅"].str.strip("%")
154
173
  big_df["换手率"] = big_df["换手率"].str.strip("%")
155
- big_df["前期低点日期"] = pd.to_datetime(big_df["前期低点日期"], errors="coerce").dt.date
174
+ big_df["前期低点日期"] = pd.to_datetime(
175
+ big_df["前期低点日期"], errors="coerce"
176
+ ).dt.date
156
177
  big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
157
178
  big_df["换手率"] = pd.to_numeric(big_df["换手率"], errors="coerce")
158
179
  big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
@@ -172,30 +193,32 @@ def stock_rank_lxsz_ths() -> pd.DataFrame:
172
193
  js_code.eval(js_content)
173
194
  v_code = js_code.call("v")
174
195
  headers = {
175
- "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",
176
198
  "Cookie": f"v={v_code}",
177
199
  }
178
- url = f"http://data.10jqka.com.cn/rank/lxsz/field/lxts/order/desc/page/1/ajax/1/free/1/"
200
+ url = "http://data.10jqka.com.cn/rank/lxsz/field/lxts/order/desc/page/1/ajax/1/free/1/"
179
201
  r = requests.get(url, headers=headers)
180
- soup = BeautifulSoup(r.text, "lxml")
202
+ soup = BeautifulSoup(r.text, features="lxml")
181
203
  try:
182
- total_page = soup.find(
183
- "span", attrs={"class": "page_info"}
184
- ).text.split("/")[1]
185
- except AttributeError as e:
204
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
205
+ "/"
206
+ )[1]
207
+ except AttributeError:
186
208
  total_page = 1
187
209
  big_df = pd.DataFrame()
188
210
  tqdm = get_tqdm()
189
211
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
190
212
  v_code = js_code.call("v")
191
213
  headers = {
192
- "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",
193
216
  "Cookie": f"v={v_code}",
194
217
  }
195
218
  url = f"http://data.10jqka.com.cn/rank/lxsz/field/lxts/order/desc/page/{page}/ajax/1/free/1/"
196
219
  r = requests.get(url, headers=headers)
197
220
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
198
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
221
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
199
222
  big_df.columns = [
200
223
  "序号",
201
224
  "股票代码",
@@ -231,30 +254,32 @@ def stock_rank_lxxd_ths() -> pd.DataFrame:
231
254
  js_code.eval(js_content)
232
255
  v_code = js_code.call("v")
233
256
  headers = {
234
- "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",
235
259
  "Cookie": f"v={v_code}",
236
260
  }
237
- url = f"http://data.10jqka.com.cn/rank/lxxd/field/lxts/order/desc/page/1/ajax/1/free/1/"
261
+ url = "http://data.10jqka.com.cn/rank/lxxd/field/lxts/order/desc/page/1/ajax/1/free/1/"
238
262
  r = requests.get(url, headers=headers)
239
- soup = BeautifulSoup(r.text, "lxml")
263
+ soup = BeautifulSoup(r.text, features="lxml")
240
264
  try:
241
- total_page = soup.find(
242
- "span", attrs={"class": "page_info"}
243
- ).text.split("/")[1]
244
- except AttributeError as e:
265
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
266
+ "/"
267
+ )[1]
268
+ except AttributeError:
245
269
  total_page = 1
246
270
  big_df = pd.DataFrame()
247
271
  tqdm = get_tqdm()
248
272
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
249
273
  v_code = js_code.call("v")
250
274
  headers = {
251
- "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",
252
277
  "Cookie": f"v={v_code}",
253
278
  }
254
279
  url = f"http://data.10jqka.com.cn/rank/lxxd/field/lxts/order/desc/page/{page}/ajax/1/free/1/"
255
280
  r = requests.get(url, headers=headers)
256
281
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
257
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
282
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
258
283
  big_df.columns = [
259
284
  "序号",
260
285
  "股票代码",
@@ -290,30 +315,32 @@ def stock_rank_cxfl_ths() -> pd.DataFrame:
290
315
  js_code.eval(js_content)
291
316
  v_code = js_code.call("v")
292
317
  headers = {
293
- "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",
294
320
  "Cookie": f"v={v_code}",
295
321
  }
296
- url = f"http://data.10jqka.com.cn/rank/cxfl/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
322
+ url = "http://data.10jqka.com.cn/rank/cxfl/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
297
323
  r = requests.get(url, headers=headers)
298
- soup = BeautifulSoup(r.text, "lxml")
324
+ soup = BeautifulSoup(r.text, features="lxml")
299
325
  try:
300
- total_page = soup.find(
301
- "span", attrs={"class": "page_info"}
302
- ).text.split("/")[1]
303
- except AttributeError as e:
326
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
327
+ "/"
328
+ )[1]
329
+ except AttributeError:
304
330
  total_page = 1
305
331
  big_df = pd.DataFrame()
306
332
  tqdm = get_tqdm()
307
333
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
308
334
  v_code = js_code.call("v")
309
335
  headers = {
310
- "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",
311
338
  "Cookie": f"v={v_code}",
312
339
  }
313
340
  url = f"http://data.10jqka.com.cn/rank/cxfl/field/count/order/desc/ajax/1/free/1/page/{page}/free/1/"
314
341
  r = requests.get(url, headers=headers)
315
342
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
316
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
343
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
317
344
  big_df.columns = [
318
345
  "序号",
319
346
  "股票代码",
@@ -348,30 +375,32 @@ def stock_rank_cxsl_ths() -> pd.DataFrame:
348
375
  js_code.eval(js_content)
349
376
  v_code = js_code.call("v")
350
377
  headers = {
351
- "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",
352
380
  "Cookie": f"v={v_code}",
353
381
  }
354
- url = f"http://data.10jqka.com.cn/rank/cxsl/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
382
+ url = "http://data.10jqka.com.cn/rank/cxsl/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
355
383
  r = requests.get(url, headers=headers)
356
- soup = BeautifulSoup(r.text, "lxml")
384
+ soup = BeautifulSoup(r.text, features="lxml")
357
385
  try:
358
- total_page = soup.find(
359
- "span", attrs={"class": "page_info"}
360
- ).text.split("/")[1]
361
- except AttributeError as e:
386
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
387
+ "/"
388
+ )[1]
389
+ except AttributeError:
362
390
  total_page = 1
363
391
  big_df = pd.DataFrame()
364
392
  tqdm = get_tqdm()
365
393
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
366
394
  v_code = js_code.call("v")
367
395
  headers = {
368
- "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",
369
398
  "Cookie": f"v={v_code}",
370
399
  }
371
400
  url = f"http://data.10jqka.com.cn/rank/cxsl/field/count/order/desc/ajax/1/free/1/page/{page}/free/1/"
372
401
  r = requests.get(url, headers=headers)
373
402
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
374
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
403
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
375
404
  big_df.columns = [
376
405
  "序号",
377
406
  "股票代码",
@@ -418,30 +447,35 @@ def stock_rank_xstp_ths(symbol: str = "500日均线") -> pd.DataFrame:
418
447
  js_code.eval(js_content)
419
448
  v_code = js_code.call("v")
420
449
  headers = {
421
- "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",
422
452
  "Cookie": f"v={v_code}",
423
453
  }
424
454
  url = f"http://data.10jqka.com.cn/rank/xstp/board/{symbol_map[symbol]}/order/asc/ajax/1/free/1/page/1/free/1/"
425
455
  r = requests.get(url, headers=headers)
426
- soup = BeautifulSoup(r.text, "lxml")
456
+ soup = BeautifulSoup(r.text, features="lxml")
427
457
  try:
428
- total_page = soup.find(
429
- "span", attrs={"class": "page_info"}
430
- ).text.split("/")[1]
431
- except AttributeError as e:
458
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
459
+ "/"
460
+ )[1]
461
+ except AttributeError:
432
462
  total_page = 1
433
463
  big_df = pd.DataFrame()
434
464
  tqdm = get_tqdm()
435
465
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
436
466
  v_code = js_code.call("v")
437
467
  headers = {
438
- "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",
439
470
  "Cookie": f"v={v_code}",
440
471
  }
441
- 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
+ )
442
476
  r = requests.get(url, headers=headers)
443
477
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
444
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
478
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
445
479
  big_df.columns = [
446
480
  "序号",
447
481
  "股票代码",
@@ -485,30 +519,35 @@ def stock_rank_xxtp_ths(symbol: str = "500日均线") -> pd.DataFrame:
485
519
  js_code.eval(js_content)
486
520
  v_code = js_code.call("v")
487
521
  headers = {
488
- "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",
489
524
  "Cookie": f"v={v_code}",
490
525
  }
491
526
  url = f"http://data.10jqka.com.cn/rank/xxtp/board/{symbol_map[symbol]}/order/asc/ajax/1/free/1/page/1/free/1/"
492
527
  r = requests.get(url, headers=headers)
493
- soup = BeautifulSoup(r.text, "lxml")
528
+ soup = BeautifulSoup(r.text, features="lxml")
494
529
  try:
495
- total_page = soup.find(
496
- "span", attrs={"class": "page_info"}
497
- ).text.split("/")[1]
498
- except AttributeError as e:
530
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
531
+ "/"
532
+ )[1]
533
+ except AttributeError:
499
534
  total_page = 1
500
535
  big_df = pd.DataFrame()
501
536
  tqdm = get_tqdm()
502
537
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
503
538
  v_code = js_code.call("v")
504
539
  headers = {
505
- "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",
506
542
  "Cookie": f"v={v_code}",
507
543
  }
508
- 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
+ )
509
548
  r = requests.get(url, headers=headers)
510
549
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
511
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
550
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
512
551
  big_df.columns = [
513
552
  "序号",
514
553
  "股票代码",
@@ -540,30 +579,32 @@ def stock_rank_ljqs_ths() -> pd.DataFrame:
540
579
  js_code.eval(js_content)
541
580
  v_code = js_code.call("v")
542
581
  headers = {
543
- "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",
544
584
  "Cookie": f"v={v_code}",
545
585
  }
546
- url = f"http://data.10jqka.com.cn/rank/ljqs/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
586
+ url = "http://data.10jqka.com.cn/rank/ljqs/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
547
587
  r = requests.get(url, headers=headers)
548
- soup = BeautifulSoup(r.text, "lxml")
588
+ soup = BeautifulSoup(r.text, features="lxml")
549
589
  try:
550
- total_page = soup.find(
551
- "span", attrs={"class": "page_info"}
552
- ).text.split("/")[1]
553
- except AttributeError as e:
590
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
591
+ "/"
592
+ )[1]
593
+ except AttributeError:
554
594
  total_page = 1
555
595
  big_df = pd.DataFrame()
556
596
  tqdm = get_tqdm()
557
597
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
558
598
  v_code = js_code.call("v")
559
599
  headers = {
560
- "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",
561
602
  "Cookie": f"v={v_code}",
562
603
  }
563
604
  url = f"http://data.10jqka.com.cn/rank/ljqs/field/count/order/desc/ajax/1/free/1/page/{page}/free/1/"
564
605
  r = requests.get(url, headers=headers)
565
606
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
566
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
607
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
567
608
  big_df.columns = [
568
609
  "序号",
569
610
  "股票代码",
@@ -596,30 +637,32 @@ def stock_rank_ljqd_ths() -> pd.DataFrame:
596
637
  js_code.eval(js_content)
597
638
  v_code = js_code.call("v")
598
639
  headers = {
599
- "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",
600
642
  "Cookie": f"v={v_code}",
601
643
  }
602
- url = f"http://data.10jqka.com.cn/rank/ljqd/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
644
+ url = "http://data.10jqka.com.cn/rank/ljqd/field/count/order/desc/ajax/1/free/1/page/1/free/1/"
603
645
  r = requests.get(url, headers=headers)
604
- soup = BeautifulSoup(r.text, "lxml")
646
+ soup = BeautifulSoup(r.text, features="lxml")
605
647
  try:
606
- total_page = soup.find(
607
- "span", attrs={"class": "page_info"}
608
- ).text.split("/")[1]
609
- except AttributeError as e:
648
+ total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split(
649
+ "/"
650
+ )[1]
651
+ except AttributeError:
610
652
  total_page = 1
611
653
  big_df = pd.DataFrame()
612
654
  tqdm = get_tqdm()
613
655
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
614
656
  v_code = js_code.call("v")
615
657
  headers = {
616
- "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",
617
660
  "Cookie": f"v={v_code}",
618
661
  }
619
662
  url = f"http://data.10jqka.com.cn/rank/ljqd/field/count/order/desc/ajax/1/free/1/page/{page}/free/1/"
620
663
  r = requests.get(url, headers=headers)
621
664
  temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
622
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
665
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
623
666
  big_df.columns = [
624
667
  "序号",
625
668
  "股票代码",
@@ -650,32 +693,17 @@ def stock_rank_xzjp_ths() -> pd.DataFrame:
650
693
  js_code = py_mini_racer.MiniRacer()
651
694
  js_content = _get_file_content_ths("ths.js")
652
695
  js_code.eval(js_content)
696
+ big_df = pd.DataFrame()
653
697
  v_code = js_code.call("v")
654
698
  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",
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",
656
701
  "Cookie": f"v={v_code}",
657
702
  }
658
- url = f"http://data.10jqka.com.cn/ajax/xzjp/field/DECLAREDATE/order/desc/ajax/1/free/1/"
703
+ url = "http://data.10jqka.com.cn/ajax/xzjp/field/DECLAREDATE/order/desc/ajax/1/free/1/"
659
704
  r = requests.get(url, headers=headers)
660
- soup = BeautifulSoup(r.text, "lxml")
661
- try:
662
- total_page = soup.find(
663
- "span", attrs={"class": "page_info"}
664
- ).text.split("/")[1]
665
- except AttributeError as e:
666
- total_page = 1
667
- big_df = pd.DataFrame()
668
- tqdm = get_tqdm()
669
- for page in tqdm(range(1, int(total_page) + 1), leave=False):
670
- v_code = js_code.call("v")
671
- headers = {
672
- "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",
673
- "Cookie": f"v={v_code}",
674
- }
675
- url = f"http://data.10jqka.com.cn/ajax/xzjp/field/DECLAREDATE/order/desc/ajax/1/free/1/"
676
- r = requests.get(url, headers=headers)
677
- temp_df = pd.read_html(StringIO(r.text), converters={"股票代码": str})[0]
678
- 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)
679
707
  big_df.columns = [
680
708
  "序号",
681
709
  "举牌公告日",
@@ -692,10 +720,14 @@ def stock_rank_xzjp_ths() -> pd.DataFrame:
692
720
  "历史数据",
693
721
  ]
694
722
  big_df["涨跌幅"] = big_df["涨跌幅"].astype(str).str.zfill(6)
695
- big_df["增持数量占总股本比例"] = big_df["增持数量占总股本比例"].astype(str).str.strip("%")
723
+ big_df["增持数量占总股本比例"] = (
724
+ big_df["增持数量占总股本比例"].astype(str).str.strip("%")
725
+ )
696
726
  big_df["变动后持股比例"] = big_df["变动后持股比例"].astype(str).str.strip("%")
697
727
  big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
698
- big_df["增持数量占总股本比例"] = pd.to_numeric(big_df["增持数量占总股本比例"], errors="coerce")
728
+ big_df["增持数量占总股本比例"] = pd.to_numeric(
729
+ big_df["增持数量占总股本比例"], errors="coerce"
730
+ )
699
731
  big_df["变动后持股比例"] = pd.to_numeric(big_df["变动后持股比例"], errors="coerce")
700
732
  big_df["举牌公告日"] = pd.to_datetime(big_df["举牌公告日"], errors="coerce").dt.date
701
733
  big_df["股票代码"] = big_df["股票代码"].astype(str).str.zfill(6)
@@ -1,15 +1,16 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/3/4 18:00
4
+ Date: 2024/4/29 15:00
5
5
  Desc: 东方财富网-数据中心-特色数据-停复牌信息
6
6
  https://data.eastmoney.com/tfpxx/
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
 
11
12
 
12
- def stock_tfp_em(date: str = "20221109") -> pd.DataFrame:
13
+ def stock_tfp_em(date: str = "20240426") -> pd.DataFrame:
13
14
  """
14
15
  东方财富网-数据中心-特色数据-停复牌信息
15
16
  https://data.eastmoney.com/tfpxx/
@@ -32,10 +33,17 @@ def stock_tfp_em(date: str = "20221109") -> pd.DataFrame:
32
33
  }
33
34
  r = requests.get(url, params=params)
34
35
  data_json = r.json()
35
- temp_df = pd.DataFrame(data_json["result"]["data"])
36
- temp_df.reset_index(inplace=True)
37
- temp_df["index"] = temp_df.index + 1
38
- temp_df.columns = [
36
+ total_page = data_json["result"]["pages"]
37
+ big_df = pd.DataFrame()
38
+ for page in range(1, total_page + 1):
39
+ params.update({"pageNumber": page})
40
+ r = requests.get(url, params=params)
41
+ data_json = r.json()
42
+ temp_df = pd.DataFrame(data_json["result"]["data"])
43
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
44
+
45
+ big_df.reset_index(inplace=True)
46
+ big_df.columns = [
39
47
  "序号",
40
48
  "代码",
41
49
  "名称",
@@ -49,15 +57,29 @@ def stock_tfp_em(date: str = "20221109") -> pd.DataFrame:
49
57
  "-",
50
58
  "-",
51
59
  ]
52
- temp_df = temp_df[
53
- ["序号", "代码", "名称", "停牌时间", "停牌截止时间", "停牌期限", "停牌原因", "所属市场", "预计复牌时间"]
60
+ big_df = big_df[
61
+ [
62
+ "序号",
63
+ "代码",
64
+ "名称",
65
+ "停牌时间",
66
+ "停牌截止时间",
67
+ "停牌期限",
68
+ "停牌原因",
69
+ "所属市场",
70
+ "预计复牌时间",
71
+ ]
54
72
  ]
55
- temp_df["停牌时间"] = pd.to_datetime(temp_df["停牌时间"]).dt.date
56
- temp_df["停牌截止时间"] = pd.to_datetime(temp_df["停牌截止时间"]).dt.date
57
- temp_df["预计复牌时间"] = pd.to_datetime(temp_df["预计复牌时间"]).dt.date
58
- return temp_df
73
+ big_df["停牌时间"] = pd.to_datetime(big_df["停牌时间"], errors="coerce").dt.date
74
+ big_df["停牌截止时间"] = pd.to_datetime(
75
+ big_df["停牌截止时间"], errors="coerce"
76
+ ).dt.date
77
+ big_df["预计复牌时间"] = pd.to_datetime(
78
+ big_df["预计复牌时间"], errors="coerce"
79
+ ).dt.date
80
+ return big_df
59
81
 
60
82
 
61
83
  if __name__ == "__main__":
62
- stock_tfp_em_df = stock_tfp_em(date="20220523")
84
+ stock_tfp_em_df = stock_tfp_em(date="20240426")
63
85
  print(stock_tfp_em_df)