akshare 1.12.99__py3-none-any.whl → 1.15.73__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 +442 -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.73.dist-info}/METADATA +52 -69
  215. akshare-1.15.73.dist-info/RECORD +385 -0
  216. {akshare-1.12.99.dist-info → akshare-1.15.73.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.73.dist-info}/LICENSE +0 -0
  236. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/top_level.txt +0 -0
@@ -1,422 +0,0 @@
1
- #!/usr/bin/env python
2
- # -*- coding:utf-8 -*-
3
- """
4
- Date: 2023/10/15 18:00
5
- Desc: 同花顺-板块-概念板块
6
- http://q.10jqka.com.cn/gn/detail/code/301558/
7
- """
8
- from datetime import datetime
9
- from functools import lru_cache
10
- from io import StringIO
11
-
12
- import pandas as pd
13
- import requests
14
- from bs4 import BeautifulSoup
15
- from py_mini_racer import py_mini_racer
16
- from tqdm import tqdm
17
-
18
- from akshare.datasets import get_ths_js
19
- from akshare.utils import demjson
20
-
21
-
22
- def stock_board_concept_graph_ths(symbol: str = "通用航空") -> pd.DataFrame:
23
- """
24
- 同花顺-板块-概念板块-概念图谱
25
- http://q.10jqka.com.cn/gn/detail/code/301558/
26
- :param symbol: 板块名称
27
- :type symbol: str
28
- :return: 概念图谱
29
- :rtype: pandas.DataFrame
30
- """
31
- stock_board_ths_map_df = stock_board_concept_name_ths()
32
- symbol = (
33
- stock_board_ths_map_df[stock_board_ths_map_df["概念名称"] == symbol]["网址"]
34
- .values[0]
35
- .split("/")[-2]
36
- )
37
- url = f"http://q.10jqka.com.cn/gn/detail/code/{symbol}"
38
- headers = {
39
- "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",
40
- }
41
- r = requests.get(url, headers=headers)
42
- temp_df = pd.read_html(StringIO(r.text))[0]
43
- new_list = []
44
- for col in temp_df.columns:
45
- temp_list = temp_df[col].values[0].split(" ")
46
- for i, item in enumerate(temp_list):
47
- if i % 2 != 0:
48
- price_pct, pct = item.split(" ")
49
- price_pct = price_pct.strip("%").strip("+").strip("-")
50
- pct = pct.strip("-").strip("+")
51
- new_list.append([col, temp_list[i - 1], price_pct, pct])
52
- temp_df = pd.DataFrame(new_list, columns=["产业链", "名称", "涨跌幅", "现价"])
53
- temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
54
- temp_df["现价"] = pd.to_numeric(temp_df["现价"], errors="coerce")
55
- return temp_df
56
-
57
-
58
- def _get_file_content_ths(file: str = "ths.js") -> str:
59
- """
60
- 获取 JS 文件的内容
61
- :param file: JS 文件名
62
- :type file: str
63
- :return: 文件内容
64
- :rtype: str
65
- """
66
- setting_file_path = get_ths_js(file)
67
- with open(setting_file_path) as f:
68
- file_data = f.read()
69
- return file_data
70
-
71
-
72
- @lru_cache()
73
- def stock_board_concept_name_ths() -> pd.DataFrame:
74
- """
75
- 同花顺-板块-概念板块-概念
76
- http://q.10jqka.com.cn/gn/detail/code/301558/
77
- :return: 所有概念板块的名称和链接
78
- :rtype: pandas.DataFrame
79
- """
80
- url = "http://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/1/ajax/1/"
81
- js_code = py_mini_racer.MiniRacer()
82
- js_content = _get_file_content_ths("ths.js")
83
- js_code.eval(js_content)
84
- v_code = js_code.call("v")
85
- headers = {
86
- "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",
87
- "Cookie": f"v={v_code}",
88
- }
89
- r = requests.get(url, headers=headers)
90
- soup = BeautifulSoup(r.text, features="lxml")
91
- total_page = soup.find(name="span", attrs={"class": "page_info"}).text.split("/")[1]
92
- big_df = pd.DataFrame()
93
- for page in tqdm(range(1, int(total_page) + 1), leave=False):
94
- url = f"http://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/{page}/ajax/1/"
95
- js_code = py_mini_racer.MiniRacer()
96
- js_content = _get_file_content_ths("ths.js")
97
- js_code.eval(js_content)
98
- v_code = js_code.call("v")
99
- headers = {
100
- "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",
101
- "Cookie": f"v={v_code}",
102
- }
103
- r = requests.get(url, headers=headers)
104
- soup = BeautifulSoup(r.text, features="lxml")
105
- url_list = []
106
- for item in (
107
- soup.find(name="table", attrs={"class": "m-table m-pager-table"})
108
- .find("tbody")
109
- .find_all("tr")
110
- ):
111
- inner_url = item.find_all("td")[1].find("a")["href"]
112
- url_list.append(inner_url)
113
- temp_df = pd.read_html(StringIO(r.text))[0]
114
- temp_df["网址"] = url_list
115
- big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
116
- big_df = big_df[["日期", "概念名称", "成分股数量", "网址"]]
117
- big_df["日期"] = pd.to_datetime(big_df["日期"], errors="coerce").dt.date
118
- big_df["成分股数量"] = pd.to_numeric(big_df["成分股数量"], errors="coerce")
119
- big_df["代码"] = big_df["网址"].str.split("/", expand=True).iloc[:, 6]
120
- big_df.drop_duplicates(keep="last", inplace=True)
121
- big_df.reset_index(inplace=True, drop=True)
122
-
123
- # 处理遗漏的板块
124
- url = "http://q.10jqka.com.cn/gn/detail/code/301558/"
125
- r = requests.get(url, headers=headers)
126
- soup = BeautifulSoup(r.text, "lxml")
127
- need_list = [
128
- item.find_all("a") for item in soup.find_all(attrs={"class": "cate_group"})
129
- ]
130
- temp_list = []
131
- for item in need_list:
132
- temp_list.extend(item)
133
- temp_df = pd.DataFrame(
134
- [
135
- [item.text for item in temp_list],
136
- [item["href"] for item in temp_list],
137
- ]
138
- ).T
139
- temp_df.columns = ["概念名称", "网址"]
140
- temp_df["日期"] = None
141
- temp_df["成分股数量"] = None
142
- temp_df["代码"] = temp_df["网址"].str.split("/", expand=True).iloc[:, 6].tolist()
143
- temp_df = temp_df[["日期", "概念名称", "成分股数量", "网址", "代码"]]
144
- big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
145
- big_df.drop_duplicates(subset=["概念名称"], keep="first", inplace=True)
146
- return big_df
147
-
148
-
149
- def _stock_board_concept_code_ths() -> dict:
150
- """
151
- 同花顺-板块-概念板块-概念
152
- http://q.10jqka.com.cn/gn/detail/code/301558/
153
- :return: 所有概念板块的名称和链接
154
- :rtype: pandas.DataFrame
155
- """
156
- _stock_board_concept_name_ths_df = stock_board_concept_name_ths()
157
- name_list = _stock_board_concept_name_ths_df["概念名称"].tolist()
158
- url_list = [
159
- item.split("/")[-2] for item in _stock_board_concept_name_ths_df["网址"].tolist()
160
- ]
161
- temp_map = dict(zip(name_list, url_list))
162
- return temp_map
163
-
164
-
165
- def stock_board_concept_cons_ths(symbol: str = "阿里巴巴概念") -> pd.DataFrame:
166
- """
167
- 同花顺-板块-概念板块-成份股
168
- http://q.10jqka.com.cn/gn/detail/code/301558/
169
- :param symbol: 板块名称
170
- :type symbol: str
171
- :return: 成份股
172
- :rtype: pandas.DataFrame
173
- """
174
- stock_board_ths_map_df = stock_board_concept_name_ths()
175
- symbol = (
176
- stock_board_ths_map_df[stock_board_ths_map_df["概念名称"] == symbol]["网址"]
177
- .values[0]
178
- .split("/")[-2]
179
- )
180
- js_code = py_mini_racer.MiniRacer()
181
- js_content = _get_file_content_ths("ths.js")
182
- js_code.eval(js_content)
183
- v_code = js_code.call("v")
184
- headers = {
185
- "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",
186
- "Cookie": f"v={v_code}",
187
- }
188
- url = f"http://q.10jqka.com.cn/gn/detail/field/264648/order/desc/page/1/ajax/1/code/{symbol}"
189
- r = requests.get(url, headers=headers)
190
- soup = BeautifulSoup(r.text, features="lxml")
191
- try:
192
- page_num = int(soup.find_all(name="a", attrs={"class": "changePage"})[-1]["page"])
193
- except IndexError as e:
194
- page_num = 1
195
- big_df = pd.DataFrame()
196
- for page in tqdm(range(1, page_num + 1), leave=False):
197
- v_code = js_code.call("v")
198
- headers = {
199
- "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",
200
- "Cookie": f"v={v_code}",
201
- }
202
- url = f"http://q.10jqka.com.cn/gn/detail/field/264648/order/desc/page/{page}/ajax/1/code/{symbol}"
203
- r = requests.get(url, headers=headers)
204
- temp_df = pd.read_html(StringIO(r.text))[0]
205
- big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
206
- big_df.rename(
207
- mapper={
208
- "涨跌幅(%)": "涨跌幅",
209
- "涨速(%)": "涨速",
210
- "换手(%)": "换手",
211
- "振幅(%)": "振幅",
212
- },
213
- inplace=True,
214
- axis=1,
215
- )
216
- del big_df["加自选"]
217
- big_df["代码"] = big_df["代码"].astype(str).str.zfill(6)
218
- big_df = big_df[big_df["代码"] != "暂无成份股数据"]
219
- return big_df
220
-
221
-
222
- def stock_board_concept_info_ths(symbol: str = "阿里巴巴概念") -> pd.DataFrame:
223
- """
224
- 同花顺-板块-概念板块-板块简介
225
- http://q.10jqka.com.cn/gn/detail/code/301558/
226
- :param symbol: 板块简介
227
- :type symbol: str
228
- :return: 板块简介
229
- :rtype: pandas.DataFrame
230
- """
231
- stock_board_ths_map_df = stock_board_concept_name_ths()
232
- symbol_code = (
233
- stock_board_ths_map_df[stock_board_ths_map_df["概念名称"] == symbol]["网址"]
234
- .values[0]
235
- .split("/")[-2]
236
- )
237
- url = f"http://q.10jqka.com.cn/gn/detail/code/{symbol_code}/"
238
- headers = {
239
- "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",
240
- }
241
- r = requests.get(url, headers=headers)
242
- soup = BeautifulSoup(r.text, features="lxml")
243
- name_list = [
244
- item.text
245
- for item in soup.find(name="div", attrs={"class": "board-infos"}).find_all("dt")
246
- ]
247
- value_list = [
248
- item.text.strip().replace("\n", "/")
249
- for item in soup.find(name="div", attrs={"class": "board-infos"}).find_all("dd")
250
- ]
251
- temp_df = pd.DataFrame([name_list, value_list]).T
252
- temp_df.columns = ["项目", "值"]
253
- return temp_df
254
-
255
-
256
- def stock_board_concept_hist_ths(
257
- start_year: str = "2000", symbol: str = "安防"
258
- ) -> pd.DataFrame:
259
- """
260
- 同花顺-板块-概念板块-指数数据
261
- http://q.10jqka.com.cn/gn/detail/code/301558/
262
- :param start_year: 开始年份; e.g., 2019
263
- :type start_year: str
264
- :param symbol: 板块简介
265
- :type symbol: str
266
- :return: 板块简介
267
- :rtype: pandas.DataFrame
268
- """
269
- code_map = _stock_board_concept_code_ths()
270
- symbol_url = f"http://q.10jqka.com.cn/gn/detail/code/{code_map[symbol]}/"
271
- headers = {
272
- "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",
273
- }
274
- r = requests.get(symbol_url, headers=headers)
275
- soup = BeautifulSoup(r.text, "lxml")
276
- symbol_code = soup.find("div", attrs={"class": "board-hq"}).find("span").text
277
- big_df = pd.DataFrame()
278
- current_year = datetime.now().year
279
- for year in tqdm(range(int(start_year), current_year + 1), leave=False):
280
- url = f"http://d.10jqka.com.cn/v4/line/bk_{symbol_code}/01/{year}.js"
281
- headers = {
282
- "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",
283
- "Referer": "http://q.10jqka.com.cn",
284
- "Host": "d.10jqka.com.cn",
285
- }
286
- r = requests.get(url, headers=headers)
287
- data_text = r.text
288
- try:
289
- demjson.decode(data_text[data_text.find("{") : -1])
290
- except:
291
- continue
292
- temp_df = demjson.decode(data_text[data_text.find("{") : -1])
293
- temp_df = pd.DataFrame(temp_df["data"].split(";"))
294
- temp_df = temp_df.iloc[:, 0].str.split(",", expand=True)
295
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
296
- if big_df.columns.shape[0] == 12:
297
- big_df.columns = [
298
- "日期",
299
- "开盘价",
300
- "最高价",
301
- "最低价",
302
- "收盘价",
303
- "成交量",
304
- "成交额",
305
- "_",
306
- "_",
307
- "_",
308
- "_",
309
- "_",
310
- ]
311
- else:
312
- big_df.columns = [
313
- "日期",
314
- "开盘价",
315
- "最高价",
316
- "最低价",
317
- "收盘价",
318
- "成交量",
319
- "成交额",
320
- "_",
321
- "_",
322
- "_",
323
- "_",
324
- ]
325
- big_df = big_df[
326
- [
327
- "日期",
328
- "开盘价",
329
- "最高价",
330
- "最低价",
331
- "收盘价",
332
- "成交量",
333
- "成交额",
334
- ]
335
- ]
336
- big_df["日期"] = pd.to_datetime(big_df["日期"], errors="coerce").dt.date
337
- big_df["开盘价"] = pd.to_numeric(big_df["开盘价"], errors="coerce")
338
- big_df["最高价"] = pd.to_numeric(big_df["最高价"], errors="coerce")
339
- big_df["最低价"] = pd.to_numeric(big_df["最低价"], errors="coerce")
340
- big_df["收盘价"] = pd.to_numeric(big_df["收盘价"], errors="coerce")
341
- big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
342
- big_df["成交额"] = pd.to_numeric(big_df["成交额"], errors="coerce")
343
- return big_df
344
-
345
-
346
- def stock_board_cons_ths(symbol: str = "301558") -> pd.DataFrame:
347
- """
348
- 通过输入行业板块或者概念板块的代码获取成份股
349
- http://q.10jqka.com.cn/thshy/detail/code/881121/
350
- http://q.10jqka.com.cn/gn/detail/code/301558/
351
- :param symbol: 行业板块或者概念板块的代码
352
- :type symbol: str
353
- :return: 行业板块或者概念板块的成份股
354
- :rtype: pandas.DataFrame
355
- """
356
- js_code = py_mini_racer.MiniRacer()
357
- js_content = _get_file_content_ths("ths.js")
358
- js_code.eval(js_content)
359
- v_code = js_code.call("v")
360
- 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",
362
- "Cookie": f"v={v_code}",
363
- }
364
- url = f"http://q.10jqka.com.cn/thshy/detail/field/199112/order/desc/page/1/ajax/1/code/{symbol}"
365
- r = requests.get(url, headers=headers)
366
- soup = BeautifulSoup(r.text, "lxml")
367
- url_flag = "thshy"
368
- if soup.find("td", attrs={"colspan": "14"}):
369
- url = f"http://q.10jqka.com.cn/gn/detail/field/199112/order/desc/page/1/ajax/1/code/{symbol}"
370
- r = requests.get(url, headers=headers)
371
- soup = BeautifulSoup(r.text, "lxml")
372
- url_flag = "gn"
373
- try:
374
- page_num = int(soup.find_all("a", attrs={"class": "changePage"})[-1]["page"])
375
- except IndexError as e:
376
- page_num = 1
377
- big_df = pd.DataFrame()
378
- for page in tqdm(range(1, page_num + 1), leave=False):
379
- v_code = js_code.call("v")
380
- headers = {
381
- "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",
382
- "Cookie": f"v={v_code}",
383
- }
384
- url = f"http://q.10jqka.com.cn/{url_flag}/detail/field/199112/order/desc/page/{page}/ajax/1/code/{symbol}"
385
- r = requests.get(url, headers=headers)
386
- temp_df = pd.read_html(StringIO(r.text))[0]
387
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
388
- big_df.rename(
389
- {
390
- "涨跌幅(%)": "涨跌幅",
391
- "涨速(%)": "涨速",
392
- "换手(%)": "换手",
393
- "振幅(%)": "振幅",
394
- },
395
- inplace=True,
396
- axis=1,
397
- )
398
- del big_df["加自选"]
399
- big_df["代码"] = big_df["代码"].astype(str).str.zfill(6)
400
- return big_df
401
-
402
-
403
- if __name__ == "__main__":
404
- stock_board_concept_graph_ths_df = stock_board_concept_graph_ths(symbol="通用航空")
405
- print(stock_board_concept_graph_ths_df)
406
-
407
- stock_board_concept_name_ths_df = stock_board_concept_name_ths()
408
- print(stock_board_concept_name_ths_df)
409
-
410
- stock_board_concept_cons_ths_df = stock_board_concept_cons_ths(symbol="小米概念")
411
- print(stock_board_concept_cons_ths_df)
412
-
413
- stock_board_concept_info_ths_df = stock_board_concept_info_ths(symbol="PVDF概念")
414
- print(stock_board_concept_info_ths_df)
415
-
416
- stock_board_concept_hist_ths_df = stock_board_concept_hist_ths(
417
- start_year="2023", symbol="新能源汽车"
418
- )
419
- print(stock_board_concept_hist_ths_df)
420
-
421
- stock_board_cons_ths_df = stock_board_cons_ths(symbol="881121")
422
- print(stock_board_cons_ths_df)