akshare 1.12.95__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 (240) hide show
  1. akshare/__init__.py +446 -139
  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_convert.py +40 -16
  10. akshare/bond/bond_info_cm.py +28 -8
  11. akshare/bond/bond_issue_cninfo.py +73 -30
  12. akshare/bond/{bond_zh_cov_sina.py → bond_zh_cov.py} +41 -17
  13. akshare/bond/bond_zh_sina.py +57 -51
  14. akshare/cal/__init__.py +0 -0
  15. akshare/cal/rv.py +170 -0
  16. akshare/cost/cost_living.py +7 -5
  17. akshare/currency/currency_safe.py +7 -6
  18. akshare/data/cninfo.js +15 -0
  19. akshare/datasets.py +10 -21
  20. akshare/economic/macro_bank.py +95 -653
  21. akshare/economic/macro_china.py +772 -1024
  22. akshare/economic/macro_china_hk.py +65 -243
  23. akshare/economic/macro_china_nbs.py +24 -7
  24. akshare/economic/macro_constitute.py +17 -12
  25. akshare/economic/macro_euro.py +13 -6
  26. akshare/economic/macro_finance_ths.py +133 -0
  27. akshare/economic/macro_info_ws.py +100 -0
  28. akshare/economic/macro_japan.py +5 -4
  29. akshare/economic/macro_other.py +12 -9
  30. akshare/economic/macro_usa.py +376 -1940
  31. akshare/economic/marco_cnbs.py +11 -6
  32. akshare/energy/energy_carbon.py +94 -125
  33. akshare/event/migration.py +3 -2
  34. akshare/exceptions.py +43 -0
  35. akshare/file_fold/calendar.json +245 -2
  36. akshare/fortune/fortune_500.py +15 -48
  37. akshare/fund/fund_amac.py +157 -75
  38. akshare/fund/fund_em.py +191 -184
  39. akshare/fund/fund_etf_em.py +20 -19
  40. akshare/fund/fund_etf_sina.py +71 -23
  41. akshare/fund/fund_etf_ths.py +93 -0
  42. akshare/fund/fund_fee_em.py +98 -0
  43. akshare/fund/fund_lof_em.py +10 -8
  44. akshare/fund/fund_portfolio_em.py +60 -50
  45. akshare/fund/fund_rank_em.py +91 -82
  46. akshare/fund/fund_report_cninfo.py +63 -48
  47. akshare/fund/fund_scale_sina.py +20 -10
  48. akshare/fund/fund_xq.py +139 -109
  49. akshare/futures/cons.py +8 -31
  50. akshare/futures/cot.py +185 -137
  51. akshare/futures/futures_basis.py +97 -32
  52. akshare/futures/futures_comm_ctp.py +37 -0
  53. akshare/futures/futures_comm_qihuo.py +74 -45
  54. akshare/futures/futures_daily_bar.py +121 -184
  55. akshare/futures/futures_hf_em.py +66 -61
  56. akshare/futures/futures_hq_sina.py +79 -61
  57. akshare/futures/futures_index_ccidx.py +6 -3
  58. akshare/futures/futures_inventory_99.py +61 -272
  59. akshare/futures/futures_news_shmet.py +4 -2
  60. akshare/futures/futures_roll_yield.py +12 -25
  61. akshare/futures/futures_spot_stock_em.py +19 -13
  62. akshare/futures/futures_stock_js.py +14 -12
  63. akshare/futures/futures_to_spot.py +38 -33
  64. akshare/futures/futures_warehouse_receipt.py +75 -71
  65. akshare/futures/futures_zh_sina.py +73 -50
  66. akshare/futures/symbol_var.py +18 -13
  67. akshare/futures_derivative/futures_contract_info_czce.py +60 -52
  68. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  69. akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
  70. akshare/futures_derivative/futures_cot_sina.py +26 -19
  71. akshare/futures_derivative/futures_spot_sys.py +21 -8
  72. akshare/fx/currency_investing.py +19 -285
  73. akshare/index/index_cflp.py +29 -26
  74. akshare/index/index_cni.py +86 -88
  75. akshare/index/index_cons.py +26 -10
  76. akshare/index/index_cx.py +248 -47
  77. akshare/index/index_drewry.py +17 -16
  78. akshare/index/index_hog.py +27 -26
  79. akshare/index/index_option_qvix.py +329 -0
  80. akshare/index/index_research_fund_sw.py +134 -0
  81. akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
  82. akshare/index/index_spot.py +9 -5
  83. akshare/index/index_stock_hk.py +35 -16
  84. akshare/index/index_stock_us_sina.py +1 -1
  85. akshare/index/index_stock_zh.py +180 -89
  86. akshare/index/index_stock_zh_csindex.py +15 -369
  87. akshare/index/index_sw.py +62 -34
  88. akshare/index/index_yw.py +46 -23
  89. akshare/index/index_zh_a_scope.py +48 -0
  90. akshare/index/index_zh_em.py +17 -14
  91. akshare/interest_rate/interbank_rate_em.py +14 -9
  92. akshare/movie/artist_yien.py +32 -5
  93. akshare/movie/movie_yien.py +92 -18
  94. akshare/movie/video_yien.py +28 -5
  95. akshare/news/news_baidu.py +78 -44
  96. akshare/news/news_cctv.py +38 -38
  97. akshare/news/news_stock.py +6 -3
  98. akshare/nlp/nlp_interface.py +7 -8
  99. akshare/option/cons.py +11 -11
  100. akshare/option/option_comm_qihuo.py +86 -0
  101. akshare/option/option_commodity.py +178 -51
  102. akshare/option/option_daily_stats_sse_szse.py +146 -0
  103. akshare/option/option_em.py +147 -138
  104. akshare/option/option_finance_sina.py +160 -137
  105. akshare/option/option_lhb_em.py +62 -56
  106. akshare/option/option_risk_indicator_sse.py +17 -14
  107. akshare/other/other_car_cpca.py +934 -0
  108. akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
  109. akshare/qdii/__init__.py +0 -0
  110. akshare/qdii/qdii_jsl.py +233 -0
  111. akshare/request.py +117 -0
  112. akshare/spot/spot_hog_soozhu.py +232 -0
  113. akshare/spot/spot_price_qh.py +121 -0
  114. akshare/spot/spot_sge.py +63 -10
  115. akshare/stock/stock_allotment_cninfo.py +10 -9
  116. akshare/stock/stock_ask_bid_em.py +27 -3
  117. akshare/stock/stock_board_concept_em.py +23 -14
  118. akshare/stock/stock_board_industry_em.py +40 -34
  119. akshare/stock/stock_cg_equity_mortgage.py +15 -11
  120. akshare/stock/stock_cg_guarantee.py +41 -51
  121. akshare/stock/stock_cg_lawsuit.py +36 -35
  122. akshare/stock/stock_dividend_cninfo.py +12 -6
  123. akshare/stock/stock_dzjy_em.py +347 -260
  124. akshare/stock/stock_fund_em.py +332 -84
  125. akshare/stock/stock_hk_famous.py +108 -0
  126. akshare/stock/stock_hk_sina.py +8 -7
  127. akshare/stock/stock_hold_control_cninfo.py +100 -15
  128. akshare/stock/stock_hold_control_em.py +4 -3
  129. akshare/stock/stock_hold_num_cninfo.py +18 -12
  130. akshare/stock/stock_hot_rank_em.py +2 -1
  131. akshare/stock/stock_hot_search_baidu.py +5 -2
  132. akshare/stock/stock_industry_cninfo.py +24 -18
  133. akshare/stock/stock_industry_pe_cninfo.py +45 -31
  134. akshare/stock/stock_industry_sw.py +9 -10
  135. akshare/stock/stock_info.py +25 -15
  136. akshare/stock/stock_info_em.py +5 -2
  137. akshare/stock/stock_intraday_em.py +5 -2
  138. akshare/stock/stock_intraday_sina.py +22 -18
  139. akshare/stock/stock_ipo_summary_cninfo.py +25 -10
  140. akshare/stock/stock_new_cninfo.py +32 -19
  141. akshare/stock/stock_news_cx.py +39 -0
  142. akshare/stock/stock_profile_cninfo.py +9 -8
  143. akshare/stock/stock_rank_forecast.py +8 -6
  144. akshare/stock/stock_share_changes_cninfo.py +18 -14
  145. akshare/stock/stock_share_hold.py +24 -19
  146. akshare/stock/stock_summary.py +54 -26
  147. akshare/stock/stock_us_famous.py +15 -6
  148. akshare/stock/stock_us_pink.py +7 -5
  149. akshare/stock/stock_us_sina.py +15 -12
  150. akshare/stock/stock_xq.py +38 -12
  151. akshare/stock/stock_zh_a_sina.py +53 -78
  152. akshare/stock/stock_zh_b_sina.py +32 -55
  153. akshare/stock/stock_zh_kcb_report.py +11 -9
  154. akshare/stock/stock_zh_kcb_sina.py +67 -64
  155. akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
  156. akshare/stock_feature/stock_a_high_low.py +5 -2
  157. akshare/stock_feature/stock_a_indicator.py +12 -9
  158. akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
  159. akshare/stock_feature/stock_account_em.py +58 -40
  160. akshare/stock_feature/stock_analyst_em.py +36 -27
  161. akshare/stock_feature/stock_board_industry_ths.py +136 -400
  162. akshare/stock_feature/stock_comment_em.py +118 -85
  163. akshare/stock_feature/stock_concept_futu.py +183 -0
  164. akshare/stock_feature/stock_cyq_em.py +58 -54
  165. akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
  166. akshare/stock_feature/stock_esg_sina.py +216 -11
  167. akshare/stock_feature/stock_fhps_em.py +60 -25
  168. akshare/stock_feature/stock_fhps_ths.py +25 -6
  169. akshare/stock_feature/stock_fund_flow.py +38 -25
  170. akshare/stock_feature/stock_gdfx_em.py +180 -95
  171. akshare/stock_feature/stock_gdhs.py +73 -49
  172. akshare/stock_feature/stock_gpzy_em.py +78 -46
  173. akshare/stock_feature/stock_hist_em.py +164 -111
  174. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  175. akshare/stock_feature/stock_hsgt_em.py +184 -452
  176. akshare/stock_feature/stock_info.py +52 -29
  177. akshare/stock_feature/stock_inner_trade_xq.py +39 -31
  178. akshare/stock_feature/stock_irm_cninfo.py +32 -9
  179. akshare/stock_feature/stock_jgdy_em.py +41 -38
  180. akshare/stock_feature/stock_lh_yybpm.py +36 -37
  181. akshare/stock_feature/stock_lhb_em.py +135 -71
  182. akshare/stock_feature/stock_lhb_sina.py +93 -46
  183. akshare/stock_feature/stock_margin_em.py +102 -0
  184. akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
  185. akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
  186. akshare/stock_feature/stock_market_legu.py +13 -8
  187. akshare/stock_feature/stock_pankou_em.py +72 -34
  188. akshare/stock_feature/stock_report_em.py +244 -54
  189. akshare/stock_feature/stock_research_report_em.py +48 -19
  190. akshare/stock_feature/stock_sns_sseinfo.py +15 -12
  191. akshare/stock_feature/stock_sy_em.py +86 -33
  192. akshare/stock_feature/stock_technology_ths.py +152 -120
  193. akshare/stock_feature/stock_tfp_em.py +35 -13
  194. akshare/stock_feature/stock_three_report_em.py +119 -77
  195. akshare/stock_feature/stock_ttm_lyr.py +4 -7
  196. akshare/stock_feature/stock_value_em.py +83 -0
  197. akshare/stock_feature/stock_wencai.py +21 -9
  198. akshare/stock_feature/stock_yjyg_em.py +63 -28
  199. akshare/stock_feature/stock_zf_pg.py +61 -38
  200. akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
  201. akshare/stock_feature/stock_ztb_em.py +62 -40
  202. akshare/stock_fundamental/stock_finance.py +150 -58
  203. akshare/stock_fundamental/stock_finance_ths.py +116 -31
  204. akshare/stock_fundamental/stock_mda_ym.py +5 -3
  205. akshare/stock_fundamental/stock_notice.py +29 -15
  206. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  207. akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
  208. akshare/stock_fundamental/stock_register_em.py +448 -0
  209. akshare/stock_fundamental/stock_restricted_em.py +79 -32
  210. akshare/stock_fundamental/stock_zygc.py +10 -8
  211. akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
  212. akshare/tool/trade_date_hist.py +4 -3
  213. akshare/utils/cons.py +10 -0
  214. akshare/utils/context.py +43 -0
  215. akshare/utils/demjson.py +2 -2
  216. akshare/utils/func.py +26 -0
  217. akshare/utils/tqdm.py +13 -3
  218. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/METADATA +52 -69
  219. akshare-1.15.72.dist-info/RECORD +385 -0
  220. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/WHEEL +1 -1
  221. tests/test_func.py +3 -5
  222. akshare/bond/bond_futures.py +0 -50
  223. akshare/bond/bond_investing.py +0 -139
  224. akshare/crypto/crypto_hist_investing.py +0 -249
  225. akshare/fortune/fortune_it_juzi.py +0 -123
  226. akshare/futures/futures_international.py +0 -170
  227. akshare/futures/futures_news_baidu.py +0 -54
  228. akshare/futures/inventory_data.py +0 -100
  229. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  230. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  231. akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
  232. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  233. akshare/index/index_fear_greed_funddb.py +0 -71
  234. akshare/index/index_investing.py +0 -232
  235. akshare/sport/sport_olympic_winter.py +0 -39
  236. akshare/stock_feature/stock_board_concept_ths.py +0 -422
  237. akshare/stock_fundamental/stock_register.py +0 -292
  238. akshare-1.12.95.dist-info/RECORD +0 -374
  239. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/LICENSE +0 -0
  240. {akshare-1.12.95.dist-info → akshare-1.15.72.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)