akshare 1.15.52__py3-none-any.whl → 1.15.54__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.
- akshare/__init__.py +3 -1
- akshare/futures/cons.py +0 -24
- akshare/futures/futures_index_ccidx.py +6 -3
- akshare/futures/futures_inventory_99.py +61 -272
- akshare/stock_feature/stock_sy_em.py +2 -2
- akshare/stock_feature/stock_three_report_em.py +16 -0
- {akshare-1.15.52.dist-info → akshare-1.15.54.dist-info}/METADATA +1 -1
- {akshare-1.15.52.dist-info → akshare-1.15.54.dist-info}/RECORD +11 -12
- akshare/futures/inventory_data.py +0 -100
- {akshare-1.15.52.dist-info → akshare-1.15.54.dist-info}/LICENSE +0 -0
- {akshare-1.15.52.dist-info → akshare-1.15.54.dist-info}/WHEEL +0 -0
- {akshare-1.15.52.dist-info → akshare-1.15.54.dist-info}/top_level.txt +0 -0
akshare/__init__.py
CHANGED
|
@@ -2962,9 +2962,11 @@ amac_manager_cancelled_info # 中国证券投资基金业协会-信息公示-诚
|
|
|
2962
2962
|
1.15.50 fix: fix stock_gpzy_profile_em interface
|
|
2963
2963
|
1.15.51 fix: fix stock_gpzy_pledge_ratio_em interface
|
|
2964
2964
|
1.15.52 fix: fix stock_zh_index_hist_csindex interface
|
|
2965
|
+
1.15.53 fix: fix futures_inventory_99 interface
|
|
2966
|
+
1.15.54 fix: fix stock_sy_profile_em interface
|
|
2965
2967
|
"""
|
|
2966
2968
|
|
|
2967
|
-
__version__ = "1.15.
|
|
2969
|
+
__version__ = "1.15.54"
|
|
2968
2970
|
__author__ = "AKFamily"
|
|
2969
2971
|
|
|
2970
2972
|
import sys
|
akshare/futures/cons.py
CHANGED
|
@@ -64,30 +64,6 @@ inventory_temp_headers = {
|
|
|
64
64
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
sample_headers = {
|
|
68
|
-
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
|
|
69
|
-
"Host": "service.99qh.com",
|
|
70
|
-
"Origin": "http://service.99qh.com",
|
|
71
|
-
"Referer": "http://www.99qh.com/d/store.aspx",
|
|
72
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
qh_headers = {
|
|
76
|
-
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
|
|
77
|
-
"Accept-Encoding": "gzip, deflate",
|
|
78
|
-
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
79
|
-
"Cache-Control": "no-cache",
|
|
80
|
-
"Connection": "keep-alive",
|
|
81
|
-
"Content-Length": "8429",
|
|
82
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
83
|
-
"Host": "service.99qh.com",
|
|
84
|
-
"Origin": "http://service.99qh.com",
|
|
85
|
-
"Pragma": "no-cache",
|
|
86
|
-
"Cookie": "__utma=181566328.985082941.1656754961.1656754961.1656754961.1; __utmc=181566328; __utmz=181566328.1656754961.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ASP.NET_SessionId=42k0mpzfu3fv5cxqmtrwc20y; tgw_l7_route=b26adbec28f4b4e1f7290033d59c43a7; __utmt=1; __utmb=181566328.2.10.1656754961",
|
|
87
|
-
"Referer": "http://service.99qh.com/Storage/Storage.aspx?page=99qh",
|
|
88
|
-
"Upgrade-Insecure-Requests": "1",
|
|
89
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
|
|
90
|
-
}
|
|
91
67
|
# 奇货可查
|
|
92
68
|
QHKC_INDEX_URL = "https://www.qhkch.com/ajax/index_show.php"
|
|
93
69
|
QHKC_INDEX_TREND_URL = "https://qhkch.com/ajax/indexes_trend.php"
|
|
@@ -5,6 +5,7 @@ Date: 2023/11/9 14:00
|
|
|
5
5
|
Desc: 中证商品指数
|
|
6
6
|
http://www.ccidx.com/
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
from io import BytesIO
|
|
9
10
|
|
|
10
11
|
import pandas as pd
|
|
@@ -51,7 +52,7 @@ def futures_index_ccidx(symbol: str = "中证商品期货指数") -> pd.DataFram
|
|
|
51
52
|
temp_df["结算"] = pd.to_numeric(temp_df["结算"], errors="coerce")
|
|
52
53
|
temp_df["涨跌"] = pd.to_numeric(temp_df["涨跌"], errors="coerce")
|
|
53
54
|
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
|
|
54
|
-
temp_df.sort_values(by=[
|
|
55
|
+
temp_df.sort_values(by=["日期"], inplace=True)
|
|
55
56
|
temp_df.reset_index(inplace=True, drop=True)
|
|
56
57
|
return temp_df
|
|
57
58
|
|
|
@@ -60,7 +61,8 @@ def futures_index_min_ccidx(symbol: str = "中证监控油脂油料期货指数"
|
|
|
60
61
|
"""
|
|
61
62
|
中证商品指数-商品指数-分时数据
|
|
62
63
|
http://www.ccidx.com/index.html
|
|
63
|
-
:param symbol: choice of {"中证商品期货指数", "中证商品期货价格指数", "中证监控油脂油料期货指数", "中证监控软商品期货指数",
|
|
64
|
+
:param symbol: choice of {"中证商品期货指数", "中证商品期货价格指数", "中证监控油脂油料期货指数", "中证监控软商品期货指数",
|
|
65
|
+
"中证监控能化期货指数", "中证监控钢铁期货指数"}
|
|
64
66
|
:type symbol: str
|
|
65
67
|
:return: 商品指数-分时数据
|
|
66
68
|
:rtype: pandas.DataFrame
|
|
@@ -93,7 +95,8 @@ def futures_index_min_ccidx(symbol: str = "中证监控油脂油料期货指数"
|
|
|
93
95
|
"Pragma": "no-cache",
|
|
94
96
|
"Proxy-Connection": "keep-alive",
|
|
95
97
|
"Referer": "http://www.ccidx.com/cscidx/quote1",
|
|
96
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
98
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
99
|
+
"Chrome/92.0.4515.159 Safari/537.36",
|
|
97
100
|
"X-Requested-With": "XMLHttpRequest",
|
|
98
101
|
}
|
|
99
102
|
r = requests.post(url, params=params, data=payload, headers=headers)
|
|
@@ -1,297 +1,86 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date: 2024/
|
|
4
|
+
Date: 2024/12/23 20:00
|
|
5
5
|
Desc: 99 期货网-大宗商品库存数据
|
|
6
|
-
|
|
6
|
+
https://www.99qh.com/
|
|
7
7
|
"""
|
|
8
|
-
from io import StringIO
|
|
9
8
|
|
|
9
|
+
import json
|
|
10
|
+
from functools import lru_cache
|
|
11
|
+
from datetime import datetime
|
|
10
12
|
import pandas as pd
|
|
11
13
|
import requests
|
|
12
14
|
from bs4 import BeautifulSoup
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
|
|
17
|
+
@lru_cache(maxsize=32)
|
|
18
|
+
def __get_99_symbol_map() -> pd.DataFrame:
|
|
19
|
+
"""
|
|
20
|
+
99 期货网-品种代码对照表
|
|
21
|
+
https://www.99qh.com/data/stockIn?productId=12
|
|
22
|
+
:return: 品种代码对照表
|
|
23
|
+
:rtype: pandas.DataFrame
|
|
24
|
+
"""
|
|
25
|
+
url = "https://www.99qh.com/data/stockIn"
|
|
26
|
+
r = requests.get(url)
|
|
27
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
28
|
+
raw_data = soup.find(attrs={"id": "__NEXT_DATA__"}).text
|
|
29
|
+
data_json = json.loads(raw_data)
|
|
30
|
+
df_list = []
|
|
31
|
+
for i, item in enumerate(
|
|
32
|
+
data_json["props"]["pageProps"]["data"]["varietyListData"]
|
|
33
|
+
):
|
|
34
|
+
temp_df = pd.DataFrame(
|
|
35
|
+
data_json["props"]["pageProps"]["data"]["varietyListData"][i]["productList"]
|
|
36
|
+
)
|
|
37
|
+
df_list.append(temp_df)
|
|
38
|
+
|
|
39
|
+
big_df = pd.concat(df_list, ignore_index=True)
|
|
40
|
+
return big_df
|
|
18
41
|
|
|
19
42
|
|
|
20
|
-
def futures_inventory_99(
|
|
21
|
-
exchange: str = "大连商品交易所", symbol: str = "豆一"
|
|
22
|
-
) -> pd.DataFrame:
|
|
43
|
+
def futures_inventory_99(symbol: str = "豆一") -> pd.DataFrame:
|
|
23
44
|
"""
|
|
24
45
|
99 期货网-大宗商品库存数据
|
|
25
|
-
|
|
26
|
-
:param exchange: 交易所名称; choice of {"上海期货交易所", "郑州商品交易所", "大连商品交易所", "LME", "NYMEX", "CBOT", "NYBOT", "TOCOM", "上海国际能源交易中心", "OSE"}
|
|
27
|
-
:type exchange: str
|
|
46
|
+
https://www.99qh.com/data/stockIn?productId=12
|
|
28
47
|
:param symbol: 交易所对应的具体品种; 如:大连商品交易所的 豆一
|
|
29
48
|
:type symbol: str
|
|
30
49
|
:return: 大宗商品库存数据
|
|
31
50
|
:rtype: pandas.DataFrame
|
|
32
51
|
"""
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"47",
|
|
45
|
-
"56",
|
|
46
|
-
"63",
|
|
47
|
-
"69",
|
|
48
|
-
"70",
|
|
49
|
-
"79",
|
|
50
|
-
"85",
|
|
51
|
-
],
|
|
52
|
-
"2": [
|
|
53
|
-
"4",
|
|
54
|
-
"14",
|
|
55
|
-
"29",
|
|
56
|
-
"31",
|
|
57
|
-
"33",
|
|
58
|
-
"38",
|
|
59
|
-
"44",
|
|
60
|
-
"45",
|
|
61
|
-
"50",
|
|
62
|
-
"51",
|
|
63
|
-
"52",
|
|
64
|
-
"55",
|
|
65
|
-
"59",
|
|
66
|
-
"64",
|
|
67
|
-
"66",
|
|
68
|
-
"67",
|
|
69
|
-
"75",
|
|
70
|
-
"76",
|
|
71
|
-
"81",
|
|
72
|
-
"82",
|
|
73
|
-
"87",
|
|
74
|
-
"92",
|
|
75
|
-
"95",
|
|
76
|
-
],
|
|
77
|
-
"3": [
|
|
78
|
-
"6",
|
|
79
|
-
"7",
|
|
80
|
-
"8",
|
|
81
|
-
"15",
|
|
82
|
-
"30",
|
|
83
|
-
"34",
|
|
84
|
-
"35",
|
|
85
|
-
"39",
|
|
86
|
-
"43",
|
|
87
|
-
"53",
|
|
88
|
-
"57",
|
|
89
|
-
"58",
|
|
90
|
-
"61",
|
|
91
|
-
"62",
|
|
92
|
-
"68",
|
|
93
|
-
"80",
|
|
94
|
-
"84",
|
|
95
|
-
"86",
|
|
96
|
-
"88",
|
|
97
|
-
"89",
|
|
98
|
-
"94",
|
|
99
|
-
],
|
|
100
|
-
"4": ["9", "10", "16", "17", "18", "23", "28"],
|
|
101
|
-
"5": ["11", "20", "21"],
|
|
102
|
-
"6": ["13", "24", "25", "26", "27"],
|
|
103
|
-
"7": ["19"],
|
|
104
|
-
"8": ["22"],
|
|
105
|
-
"10": ["78", "83", "90", "93"],
|
|
106
|
-
"11": ["91"],
|
|
107
|
-
}
|
|
108
|
-
data_name = {
|
|
109
|
-
"1": [
|
|
110
|
-
"铜",
|
|
111
|
-
"铝",
|
|
112
|
-
"橡胶",
|
|
113
|
-
"燃料油",
|
|
114
|
-
"锌",
|
|
115
|
-
"黄金",
|
|
116
|
-
"螺纹钢",
|
|
117
|
-
"线材",
|
|
118
|
-
"铅",
|
|
119
|
-
"白银",
|
|
120
|
-
"石油沥青",
|
|
121
|
-
"热轧卷板",
|
|
122
|
-
"锡",
|
|
123
|
-
"镍",
|
|
124
|
-
"纸浆",
|
|
125
|
-
"不锈钢",
|
|
126
|
-
],
|
|
127
|
-
"2": [
|
|
128
|
-
"强麦",
|
|
129
|
-
"一号棉",
|
|
130
|
-
"白糖",
|
|
131
|
-
"PTA",
|
|
132
|
-
"菜籽油",
|
|
133
|
-
"早籼稻",
|
|
134
|
-
"甲醇",
|
|
135
|
-
"普麦",
|
|
136
|
-
"玻璃",
|
|
137
|
-
"油菜籽",
|
|
138
|
-
"菜籽粕",
|
|
139
|
-
"动力煤",
|
|
140
|
-
"粳稻",
|
|
141
|
-
"晚籼稻",
|
|
142
|
-
"硅铁",
|
|
143
|
-
"锰硅",
|
|
144
|
-
"棉纱",
|
|
145
|
-
"苹果",
|
|
146
|
-
"红枣",
|
|
147
|
-
"尿素",
|
|
148
|
-
"纯碱",
|
|
149
|
-
"短纤",
|
|
150
|
-
"花生",
|
|
151
|
-
],
|
|
152
|
-
"3": [
|
|
153
|
-
"豆一",
|
|
154
|
-
"豆二",
|
|
155
|
-
"豆粕",
|
|
156
|
-
"玉米",
|
|
157
|
-
"豆油",
|
|
158
|
-
"聚乙烯",
|
|
159
|
-
"棕榈油",
|
|
160
|
-
"聚氯乙烯",
|
|
161
|
-
"焦炭",
|
|
162
|
-
"焦煤",
|
|
163
|
-
"铁矿石",
|
|
164
|
-
"鸡蛋",
|
|
165
|
-
"胶合板",
|
|
166
|
-
"聚丙烯",
|
|
167
|
-
"玉米淀粉",
|
|
168
|
-
"乙二醇",
|
|
169
|
-
"粳米",
|
|
170
|
-
"苯乙烯",
|
|
171
|
-
"纤维板",
|
|
172
|
-
"液化石油气",
|
|
173
|
-
"生猪",
|
|
174
|
-
],
|
|
175
|
-
"4": ["LME铜", "LME铝", "LME镍", "LME铅", "LME锌", "LME锡", "LME铝合金"],
|
|
176
|
-
"5": ["COMEX铜", "COMEX金", "COMEX银"],
|
|
177
|
-
"6": ["CBOT大豆", "CBOT小麦", "CBOT玉米", "CBOT燕麦", "CBOT糙米"],
|
|
178
|
-
"7": ["NYBOT2号棉"],
|
|
179
|
-
"8": ["TOCOM橡胶"],
|
|
180
|
-
"10": ["原油", "20号胶", "低硫燃料油", "国际铜"],
|
|
181
|
-
"11": ["OSE橡胶"],
|
|
182
|
-
}
|
|
183
|
-
temp_out_exchange_name = {
|
|
184
|
-
"1": "上海期货交易所",
|
|
185
|
-
"2": "郑州商品交易所",
|
|
186
|
-
"3": "大连商品交易所",
|
|
187
|
-
"4": "LME",
|
|
188
|
-
"5": "NYMEX",
|
|
189
|
-
"6": "CBOT",
|
|
190
|
-
"7": "NYBOT",
|
|
191
|
-
"8": "TOCOM",
|
|
192
|
-
"10": "上海国际能源交易中心",
|
|
193
|
-
"11": "OSE",
|
|
194
|
-
}
|
|
195
|
-
exchange_map = {
|
|
196
|
-
value: key for key, value in temp_out_exchange_name.items()
|
|
52
|
+
temp_df = __get_99_symbol_map()
|
|
53
|
+
symbol_map = dict(zip(temp_df["name"], temp_df["productId"]))
|
|
54
|
+
|
|
55
|
+
url = "https://centerapi.fx168api.com/app/qh/api/stock/trend"
|
|
56
|
+
headers = {
|
|
57
|
+
"Content-Type": "application/json;charset=UTF-8",
|
|
58
|
+
"_pcc": "SGkj5avwu2h8Rs8/41r2LUwDHeEbaMKWe06+hWcEOO/uAQVbckWBHbwAvFbEI1eBBSvmTNqyjHKfFAn/kCpZ"
|
|
59
|
+
"IU7QNDvTrL2xGkQyuu+EVMU6RnZb/drmVGJRR6VhoHYMmzJvDuR6d43LnY219r44mGeL5x8qSUdh+cHjs0dm0AI=",
|
|
60
|
+
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
61
|
+
"Chrome/58.0.3029.110 Safari/537.3",
|
|
62
|
+
"referer": "https://www.99qh.com",
|
|
197
63
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
"
|
|
203
|
-
"
|
|
204
|
-
"
|
|
205
|
-
"
|
|
206
|
-
"5": "NYMEX",
|
|
207
|
-
"6": "CBOT",
|
|
208
|
-
"7": "NYBOT",
|
|
209
|
-
"8": "TOCOM",
|
|
210
|
-
"10": "上海国际能源交易中心",
|
|
211
|
-
"11": "OSE",
|
|
64
|
+
params = {
|
|
65
|
+
"productId": symbol_map[symbol],
|
|
66
|
+
"type": "1",
|
|
67
|
+
"pageNo": "1",
|
|
68
|
+
"pageSize": "4000",
|
|
69
|
+
"startDate": "",
|
|
70
|
+
"endDate": f"{datetime.now().date().isoformat()}",
|
|
71
|
+
"appCategory": "web",
|
|
212
72
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
try:
|
|
223
|
-
n -= 1
|
|
224
|
-
session = requests.Session()
|
|
225
|
-
url = "http://service.99qh.com/Storage/Storage.aspx"
|
|
226
|
-
params = {"page": "99qh"}
|
|
227
|
-
r = session.post(url, params=params, headers=sample_headers)
|
|
228
|
-
cookie = r.cookies.get_dict()
|
|
229
|
-
url = "http://service.99qh.com/Storage/Storage.aspx"
|
|
230
|
-
params = {"page": "99qh"}
|
|
231
|
-
r = requests.post(
|
|
232
|
-
url, params=params, headers=sample_headers, cookies=cookie
|
|
233
|
-
)
|
|
234
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
235
|
-
view_state = soup.find_all(attrs={"id": "__VIEWSTATE"})[0]["value"]
|
|
236
|
-
even_validation = soup.find_all(attrs={"id": "__EVENTVALIDATION"})[
|
|
237
|
-
0
|
|
238
|
-
]["value"]
|
|
239
|
-
payload = {
|
|
240
|
-
"__EVENTTARGET": "ddlExchName",
|
|
241
|
-
"__EVENTARGUMENT": "",
|
|
242
|
-
"__LASTFOCUS": "",
|
|
243
|
-
"__VIEWSTATE": view_state,
|
|
244
|
-
"__VIEWSTATEGENERATOR": "6EAC22FA",
|
|
245
|
-
"__EVENTVALIDATION": even_validation,
|
|
246
|
-
"ddlExchName": int(exchange),
|
|
247
|
-
"ddlGoodsName": 1,
|
|
248
|
-
}
|
|
249
|
-
res = requests.post(
|
|
250
|
-
url,
|
|
251
|
-
params={"page": "99qh"},
|
|
252
|
-
data=payload,
|
|
253
|
-
headers=qh_headers,
|
|
254
|
-
cookies=cookie,
|
|
255
|
-
)
|
|
256
|
-
soup = BeautifulSoup(res.text, "lxml")
|
|
257
|
-
view_state = soup.find_all(attrs={"id": "__VIEWSTATE"})[0]["value"]
|
|
258
|
-
even_validation = soup.find_all(attrs={"id": "__EVENTVALIDATION"})[
|
|
259
|
-
0
|
|
260
|
-
]["value"]
|
|
261
|
-
payload = {
|
|
262
|
-
"__EVENTTARGET": "ddlGoodsName",
|
|
263
|
-
"__EVENTARGUMENT": "",
|
|
264
|
-
"__LASTFOCUS": "",
|
|
265
|
-
"__VIEWSTATE": view_state,
|
|
266
|
-
"__VIEWSTATEGENERATOR": "6EAC22FA",
|
|
267
|
-
"__EVENTVALIDATION": even_validation,
|
|
268
|
-
"ddlExchName": int(exchange),
|
|
269
|
-
"ddlGoodsName": int(symbol),
|
|
270
|
-
}
|
|
271
|
-
res = requests.post(
|
|
272
|
-
url,
|
|
273
|
-
params=params,
|
|
274
|
-
data=payload,
|
|
275
|
-
headers=qh_headers,
|
|
276
|
-
cookies=cookie,
|
|
277
|
-
)
|
|
278
|
-
data_df = pd.read_html(StringIO(res.text))[-1].T
|
|
279
|
-
data_df.columns = data_df.iloc[0, :]
|
|
280
|
-
data_df = data_df.iloc[1:, :]
|
|
281
|
-
data_df.reset_index(inplace=True, drop=True)
|
|
282
|
-
data_df.columns.name = None
|
|
283
|
-
data_df["日期"] = pd.to_datetime(data_df["日期"]).dt.date
|
|
284
|
-
data_df["库存"] = pd.to_numeric(data_df["库存"])
|
|
285
|
-
data_df["增减"] = pd.to_numeric(data_df["增减"])
|
|
286
|
-
data_df.sort_values("日期", inplace=True)
|
|
287
|
-
data_df.reset_index(inplace=True, drop=True)
|
|
288
|
-
return data_df
|
|
289
|
-
except:
|
|
290
|
-
continue
|
|
73
|
+
r = requests.get(url, params, headers=headers)
|
|
74
|
+
data_json = r.json()
|
|
75
|
+
temp_df = pd.DataFrame(data_json["data"]["list"])
|
|
76
|
+
temp_df.columns = ["日期", "收盘价", "库存"]
|
|
77
|
+
temp_df.sort_values(by=["日期"], ignore_index=True, inplace=True)
|
|
78
|
+
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
|
|
79
|
+
temp_df["收盘价"] = pd.to_numeric(temp_df["收盘价"], errors="coerce")
|
|
80
|
+
temp_df["库存"] = pd.to_numeric(temp_df["库存"], errors="coerce")
|
|
81
|
+
return temp_df
|
|
291
82
|
|
|
292
83
|
|
|
293
84
|
if __name__ == "__main__":
|
|
294
|
-
futures_inventory_99_df = futures_inventory_99(
|
|
295
|
-
exchange="郑州商品交易所", symbol="菜籽油"
|
|
296
|
-
)
|
|
85
|
+
futures_inventory_99_df = futures_inventory_99(symbol="豆一")
|
|
297
86
|
print(futures_inventory_99_df)
|
|
@@ -452,8 +452,8 @@ def stock_sy_hy_em(date: str = "20231231") -> pd.DataFrame:
|
|
|
452
452
|
|
|
453
453
|
|
|
454
454
|
if __name__ == "__main__":
|
|
455
|
-
|
|
456
|
-
print(
|
|
455
|
+
stock_sy_profile_em_df = stock_sy_profile_em()
|
|
456
|
+
print(stock_sy_profile_em_df)
|
|
457
457
|
|
|
458
458
|
stock_sy_yq_em_df = stock_sy_yq_em(date="20240630")
|
|
459
459
|
print(stock_sy_yq_em_df)
|
|
@@ -68,6 +68,8 @@ def stock_balance_sheet_by_report_em(symbol: str = "SH600519") -> pd.DataFrame:
|
|
|
68
68
|
}
|
|
69
69
|
r = requests.get(url, params=params)
|
|
70
70
|
data_json = r.json()
|
|
71
|
+
if "data" not in data_json.keys():
|
|
72
|
+
break
|
|
71
73
|
temp_df = pd.DataFrame(data_json["data"])
|
|
72
74
|
for col in temp_df.columns:
|
|
73
75
|
if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
|
|
@@ -124,6 +126,8 @@ def stock_balance_sheet_by_yearly_em(symbol: str = "SH600036") -> pd.DataFrame:
|
|
|
124
126
|
}
|
|
125
127
|
r = requests.get(url, params=params)
|
|
126
128
|
data_json = r.json()
|
|
129
|
+
if "data" not in data_json.keys():
|
|
130
|
+
break
|
|
127
131
|
temp_df = pd.DataFrame(data_json["data"])
|
|
128
132
|
for col in temp_df.columns:
|
|
129
133
|
if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
|
|
@@ -171,6 +175,8 @@ def stock_profit_sheet_by_report_em(symbol: str = "SH600519") -> pd.DataFrame:
|
|
|
171
175
|
}
|
|
172
176
|
r = requests.get(url, params=params)
|
|
173
177
|
data_json = r.json()
|
|
178
|
+
if "data" not in data_json.keys():
|
|
179
|
+
break
|
|
174
180
|
temp_df = pd.DataFrame(data_json["data"])
|
|
175
181
|
for col in temp_df.columns:
|
|
176
182
|
if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
|
|
@@ -218,6 +224,8 @@ def stock_profit_sheet_by_yearly_em(symbol: str = "SH600519") -> pd.DataFrame:
|
|
|
218
224
|
}
|
|
219
225
|
r = requests.get(url, params=params)
|
|
220
226
|
data_json = r.json()
|
|
227
|
+
if "data" not in data_json.keys():
|
|
228
|
+
break
|
|
221
229
|
temp_df = pd.DataFrame(data_json["data"])
|
|
222
230
|
for col in temp_df.columns:
|
|
223
231
|
if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
|
|
@@ -267,6 +275,8 @@ def stock_profit_sheet_by_quarterly_em(
|
|
|
267
275
|
}
|
|
268
276
|
r = requests.get(url, params=params)
|
|
269
277
|
data_json = r.json()
|
|
278
|
+
if "data" not in data_json.keys():
|
|
279
|
+
break
|
|
270
280
|
temp_df = pd.DataFrame(data_json["data"])
|
|
271
281
|
for col in temp_df.columns:
|
|
272
282
|
if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
|
|
@@ -316,6 +326,8 @@ def stock_cash_flow_sheet_by_report_em(
|
|
|
316
326
|
}
|
|
317
327
|
r = requests.get(url, params=params)
|
|
318
328
|
data_json = r.json()
|
|
329
|
+
if "data" not in data_json.keys():
|
|
330
|
+
break
|
|
319
331
|
temp_df = pd.DataFrame(data_json["data"])
|
|
320
332
|
for col in temp_df.columns:
|
|
321
333
|
if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
|
|
@@ -365,6 +377,8 @@ def stock_cash_flow_sheet_by_yearly_em(
|
|
|
365
377
|
}
|
|
366
378
|
r = requests.get(url, params=params)
|
|
367
379
|
data_json = r.json()
|
|
380
|
+
if "data" not in data_json.keys():
|
|
381
|
+
break
|
|
368
382
|
temp_df = pd.DataFrame(data_json["data"])
|
|
369
383
|
for col in temp_df.columns:
|
|
370
384
|
if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
|
|
@@ -414,6 +428,8 @@ def stock_cash_flow_sheet_by_quarterly_em(
|
|
|
414
428
|
}
|
|
415
429
|
r = requests.get(url, params=params)
|
|
416
430
|
data_json = r.json()
|
|
431
|
+
if "data" not in data_json.keys():
|
|
432
|
+
break
|
|
417
433
|
temp_df = pd.DataFrame(data_json["data"])
|
|
418
434
|
for col in temp_df.columns:
|
|
419
435
|
if temp_df[col].isnull().all(): # 检查列是否包含 None 或 NaN
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
akshare/__init__.py,sha256=
|
|
1
|
+
akshare/__init__.py,sha256=BfocnMuIpL3B4KAHxtO0jv0_BNXV69u5bAqUPTz0Z6k,184631
|
|
2
2
|
akshare/datasets.py,sha256=-qdwaQjgBlftX84uM74KJqCYJYkQ50PV416_neA4uls,995
|
|
3
3
|
akshare/exceptions.py,sha256=WEJjIhSmJ_xXNW6grwV4nufE_cfmmyuhmueVGiN1VAg,878
|
|
4
4
|
akshare/request.py,sha256=HtFFf9MhfEibR-ETWe-1Tts6ELU4VKSqA-ghaXjegQM,4252
|
|
@@ -102,7 +102,7 @@ akshare/fund/fund_scale_em.py,sha256=8XLZpz9DzsAnJCo1moBmzf3u7mfZNZHsb3cPKJ-gCJM
|
|
|
102
102
|
akshare/fund/fund_scale_sina.py,sha256=A0qIzWBQdE3IGS9-cxO9_FNpuH-BAG5HhPk5KzTFTFc,8167
|
|
103
103
|
akshare/fund/fund_xq.py,sha256=AxMZB-940bNY7-BatVLZiseHNxiWA17hQzTfuxGibPU,11306
|
|
104
104
|
akshare/futures/__init__.py,sha256=RMTf1bT5EOE3ttWpn3hGu1LtUmsVxDoa0W7W0gXHOy8,81
|
|
105
|
-
akshare/futures/cons.py,sha256=
|
|
105
|
+
akshare/futures/cons.py,sha256=swjc7oENcgqtFobdSLozErxyl2xVlWLVwMx8_Q1jFac,14765
|
|
106
106
|
akshare/futures/cot.py,sha256=Kkza2slS7JQpXndKrQEEykzIjZIT3vhvtZHVJ7P1yac,58573
|
|
107
107
|
akshare/futures/futures_basis.py,sha256=pmXNXdWnfvJCRs6xKJ0Ed9R2v92-NK2Sp3AjlwecErc,15691
|
|
108
108
|
akshare/futures/futures_comex_em.py,sha256=V-mkKQkH5N8PyaZWKdyggb2lTnY8DDDxiUPt-1leQu0,3171
|
|
@@ -113,8 +113,8 @@ akshare/futures/futures_daily_bar.py,sha256=pWjpy6O27EVCtQmDYr6Og3-qqrDzQkKuYfS-
|
|
|
113
113
|
akshare/futures/futures_foreign.py,sha256=oSIoAg5oy-CIlPWHkQffcvZGu02Y2GWOrt-6aPA53Xg,2059
|
|
114
114
|
akshare/futures/futures_hf_em.py,sha256=jne-wUYr2QTUkDq3qAxYKE0Hm90L3H8qUDu3JavKiUg,3338
|
|
115
115
|
akshare/futures/futures_hq_sina.py,sha256=eK1gEan4DPvpYmln8-tNnzh_J_733s95DBr--NqNYVA,9576
|
|
116
|
-
akshare/futures/futures_index_ccidx.py,sha256=
|
|
117
|
-
akshare/futures/futures_inventory_99.py,sha256=
|
|
116
|
+
akshare/futures/futures_index_ccidx.py,sha256=Ni5GICleqcHrmLatOE_Bs4i1DS3bn0lEm_RyrjlucB0,4581
|
|
117
|
+
akshare/futures/futures_inventory_99.py,sha256=xdX8GSCEcRWYnbw0XS22rcblXOvlzUvfUltv7oyRh3Y,2990
|
|
118
118
|
akshare/futures/futures_inventory_em.py,sha256=C5nt4F51WB-oc8o3GrMvEGo0SO2mIq_H1vHVl42vzT0,2340
|
|
119
119
|
akshare/futures/futures_news_baidu.py,sha256=uqXUgQa7_aNjj1g4IBt6Ic4DhlsuBvjEEYC3OTPeqmA,1544
|
|
120
120
|
akshare/futures/futures_news_shmet.py,sha256=NQXUo6bwsDwxWID-5CUgJxENWtiaDK4JgMaTEmurYvM,2464
|
|
@@ -126,7 +126,6 @@ akshare/futures/futures_stock_js.py,sha256=BV_1Hm9osxWQmNSt24DQ52hAMrfMqP6eud657
|
|
|
126
126
|
akshare/futures/futures_to_spot.py,sha256=0MCVcZoZoOMd7DSR357K2UHoRBCeHyONyRCu8oWVWuw,12841
|
|
127
127
|
akshare/futures/futures_warehouse_receipt.py,sha256=wF98kwKsIc0GCcwgwoup2m76Pg800HdXY29Wf1jvDNc,9116
|
|
128
128
|
akshare/futures/futures_zh_sina.py,sha256=NMzqFbLkrUaeO1AouZUFqgekYBAm7j5ew2LTlruapFE,26197
|
|
129
|
-
akshare/futures/inventory_data.py,sha256=m1DCzClDudj4qQLjgl5i6Lbazu0wIm9R3RerHCPcp38,4097
|
|
130
129
|
akshare/futures/receipt.py,sha256=CGk0HKSJLeWSahkXmep8LVceAbN3wooTjMqGlQkegAY,22054
|
|
131
130
|
akshare/futures/requests_fun.py,sha256=s31tnP2qUwEux43RX_t3K1uToJiSQ7xHYYQ_0bp16O0,2832
|
|
132
131
|
akshare/futures/symbol_var.py,sha256=HnKKQ8waVW6sjlqh4F9vsloKY1NVs2s_-M4DB5hb7cA,5589
|
|
@@ -333,10 +332,10 @@ akshare/stock_feature/stock_qsjy_em.py,sha256=7EHroLZC3-X_3WNhb7GV9MPQHbxjtkfKI_
|
|
|
333
332
|
akshare/stock_feature/stock_report_em.py,sha256=jhePrTKGIYzdz8idiPoDs1vEajd73XRIFpZyWQggKa4,18075
|
|
334
333
|
akshare/stock_feature/stock_research_report_em.py,sha256=XFQadpUI2l0-Ik8BQWf-eCC4uFC1xxt9VNiZ9NU2zp0,4888
|
|
335
334
|
akshare/stock_feature/stock_sns_sseinfo.py,sha256=TGGLw5P77Hh-sSHgw_KKoK29d1m_V_2GDQXe9m_XFew,4556
|
|
336
|
-
akshare/stock_feature/stock_sy_em.py,sha256=
|
|
335
|
+
akshare/stock_feature/stock_sy_em.py,sha256=QZmjiYK22WXusogUezNFfS5xq6ApCGq-5aGZk4VMZHw,17721
|
|
337
336
|
akshare/stock_feature/stock_technology_ths.py,sha256=4u9z7H6MYEutOYAQvYfzgc_FxG6XlhkMLujSotAbraw,30827
|
|
338
337
|
akshare/stock_feature/stock_tfp_em.py,sha256=nN4gcK6hOe4tIA-nOoY_lMNC7qY7o9Ga35_-VvxS3fA,2474
|
|
339
|
-
akshare/stock_feature/stock_three_report_em.py,sha256=
|
|
338
|
+
akshare/stock_feature/stock_three_report_em.py,sha256=Menwk2QMf9LDZAHoXTythrzyYICxVo1HvRgo8AXPdX8,24163
|
|
340
339
|
akshare/stock_feature/stock_ttm_lyr.py,sha256=RwKMgI_A3rDRIITd_idmvlFSkn4DTUPNVfPjISSTZYw,1110
|
|
341
340
|
akshare/stock_feature/stock_value_em.py,sha256=RA842dkeChSEoS3yN9fiGxS3eDzYjeUdrpXbnteyzZY,2576
|
|
342
341
|
akshare/stock_feature/stock_wencai.py,sha256=KPwt72SOnK4dHh2vpWOHYynkj8Vrbv3AW-EXK7d3NZY,4343
|
|
@@ -379,8 +378,8 @@ akshare/utils/token_process.py,sha256=K4rGXjh_tgugbRcyOK2h2x0jP3PT65IIK7nxhUKhOe
|
|
|
379
378
|
akshare/utils/tqdm.py,sha256=MuPNwcswkOGjwWQOMWXi9ZvQ_RmW4obCWRj2i7HM7FE,847
|
|
380
379
|
tests/__init__.py,sha256=gNzhlO0UPjFq6Ieb38kaVIODXv4cTDByrdohAZnDYt4,82
|
|
381
380
|
tests/test_func.py,sha256=j1MGYbZI2if2j_LY1S4FLsf4qfq4NwVqD5wmRlv5Log,832
|
|
382
|
-
akshare-1.15.
|
|
383
|
-
akshare-1.15.
|
|
384
|
-
akshare-1.15.
|
|
385
|
-
akshare-1.15.
|
|
386
|
-
akshare-1.15.
|
|
381
|
+
akshare-1.15.54.dist-info/LICENSE,sha256=mmSZCPgfHiVw34LXuFArd-SUgQtBJ_QsIlh-kWlDHfs,1073
|
|
382
|
+
akshare-1.15.54.dist-info/METADATA,sha256=Cfn9l-iOt7kAcvxPPD45RfI3pO6gnOgZye5uIbzQId0,13423
|
|
383
|
+
akshare-1.15.54.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
|
384
|
+
akshare-1.15.54.dist-info/top_level.txt,sha256=jsf9ZzZPmHaISTVumQPsAw7vv7Yv-PdEVW70SMEelQQ,14
|
|
385
|
+
akshare-1.15.54.dist-info/RECORD,,
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding:utf-8 -*-
|
|
3
|
-
"""
|
|
4
|
-
Date: 2021/1/10 13:58
|
|
5
|
-
Desc: 得到 99 期货网的原始数据
|
|
6
|
-
"""
|
|
7
|
-
import requests
|
|
8
|
-
import pickle
|
|
9
|
-
from bs4 import BeautifulSoup
|
|
10
|
-
import time
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
url = "http://service.99qh.com/Storage/Storage.aspx?page=99qh"
|
|
14
|
-
|
|
15
|
-
sample_headers = {
|
|
16
|
-
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
|
|
17
|
-
"Host": "service.99qh.com",
|
|
18
|
-
"Origin": "http://service.99qh.com",
|
|
19
|
-
"Referer": "http://www.99qh.com/d/store.aspx",
|
|
20
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
res = requests.get(url, headers=sample_headers)
|
|
24
|
-
|
|
25
|
-
soup = BeautifulSoup(res.text, "lxml")
|
|
26
|
-
view_state = soup.find_all(attrs={"id": "__VIEWSTATE"})[0]["value"]
|
|
27
|
-
even_validation = soup.find_all(attrs={"id": "__EVENTVALIDATION"})[0]["value"]
|
|
28
|
-
|
|
29
|
-
qh_headers = {
|
|
30
|
-
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
|
|
31
|
-
"Accept-Encoding": "gzip, deflate",
|
|
32
|
-
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
33
|
-
"Cache-Control": "max-age=0",
|
|
34
|
-
"Connection": "keep-alive",
|
|
35
|
-
"Content-Length": "4458",
|
|
36
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
37
|
-
"Host": "service.99qh.com",
|
|
38
|
-
"Origin": "http://service.99qh.com",
|
|
39
|
-
"Referer": "http://service.99qh.com/Storage/Storage.aspx?page=99qh",
|
|
40
|
-
"Upgrade-Insecure-Requests": "1",
|
|
41
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
code_temp_list = [item["value"] for item in soup.find_all("select")[0].find_all("option")]
|
|
45
|
-
name_temp_list = [item.get_text() for item in soup.find_all("select")[0].find_all("option")]
|
|
46
|
-
code_exchange_name_dict = dict(zip(code_temp_list, name_temp_list))
|
|
47
|
-
exchange_value = soup.find_all("select")[0].find_all(attrs={"selected": "selected"})[0]["value"]
|
|
48
|
-
symbol_list = soup.find_all("select")[1].get_text().split("\n")[1:-1]
|
|
49
|
-
symbol_value_list = [item["value"] for item in soup.find_all("select")[1].find_all("option")]
|
|
50
|
-
code_symbol_code_dict = dict()
|
|
51
|
-
code_symbol_code_dict[exchange_value] = symbol_value_list
|
|
52
|
-
|
|
53
|
-
exchange_symbol_list = {}
|
|
54
|
-
exchange_symbol_value_list = {}
|
|
55
|
-
for i in code_temp_list:
|
|
56
|
-
# i = 14
|
|
57
|
-
print(i)
|
|
58
|
-
j = 0
|
|
59
|
-
while j < 5:
|
|
60
|
-
try:
|
|
61
|
-
payload = {
|
|
62
|
-
"__EVENTTARGET": "ddlExchName",
|
|
63
|
-
"__EVENTARGUMENT": "",
|
|
64
|
-
"__LASTFOCUS": "",
|
|
65
|
-
"__VIEWSTATE": view_state,
|
|
66
|
-
"__VIEWSTATEGENERATOR": "6EAC22FA",
|
|
67
|
-
"__EVENTVALIDATION": even_validation,
|
|
68
|
-
"ddlExchName": i,
|
|
69
|
-
# "ddlGoodsName": 6
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
res = requests.post(url, data=payload, headers=qh_headers)
|
|
73
|
-
soup = BeautifulSoup(res.text, "lxml")
|
|
74
|
-
exchange = soup.find_all("select")[0].find_all(attrs={"selected": "selected"})[0].get_text()
|
|
75
|
-
print(exchange)
|
|
76
|
-
exchange_value = soup.find_all("select")[0].find_all(attrs={"selected": "selected"})[0]["value"]
|
|
77
|
-
print(exchange_value)
|
|
78
|
-
symbol_list = soup.find_all("select")[1].get_text().split("\n")[1:-1]
|
|
79
|
-
exchange_symbol_list.update({exchange_value: symbol_list})
|
|
80
|
-
symbol_value_list = [item["value"] for item in soup.find_all("select")[1].find_all("option")]
|
|
81
|
-
exchange_symbol_value_list.update({exchange_value: symbol_value_list})
|
|
82
|
-
view_state = soup.find_all(attrs={"id": "__VIEWSTATE"})[0]["value"]
|
|
83
|
-
even_validation = soup.find_all(attrs={"id": "__EVENTVALIDATION"})[0]["value"]
|
|
84
|
-
time.sleep(5)
|
|
85
|
-
except:
|
|
86
|
-
j += 1
|
|
87
|
-
continue
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
with open('./akshare/futures/exchange_symbol_list.pk', 'wb') as f:
|
|
91
|
-
pickle.dump(exchange_symbol_list, f)
|
|
92
|
-
|
|
93
|
-
with open('./akshare/futures/exchange_symbol_value_list.pk', 'wb') as f:
|
|
94
|
-
pickle.dump(exchange_symbol_value_list, f)
|
|
95
|
-
|
|
96
|
-
with open('./akshare/futures/code_exchange_name_dict.pk', 'wb') as f:
|
|
97
|
-
pickle.dump(code_exchange_name_dict, f)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
File without changes
|
|
File without changes
|
|
File without changes
|