akshare 1.15.52__py3-none-any.whl → 1.15.53__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 CHANGED
@@ -2962,9 +2962,10 @@ 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
2965
2966
  """
2966
2967
 
2967
- __version__ = "1.15.52"
2968
+ __version__ = "1.15.53"
2968
2969
  __author__ = "AKFamily"
2969
2970
 
2970
2971
  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"
@@ -1,297 +1,86 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/1/10 19:00
4
+ Date: 2024/12/23 20:00
5
5
  Desc: 99 期货网-大宗商品库存数据
6
- http://www.99qh.com/d/store.aspx
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
- from akshare.futures.cons import (
15
- qh_headers,
16
- sample_headers,
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
- http://www.99qh.com/d/store.aspx
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
- data_code = {
34
- "1": [
35
- "1",
36
- "2",
37
- "3",
38
- "12",
39
- "32",
40
- "36",
41
- "37",
42
- "40",
43
- "42",
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
- exchange = exchange_map[exchange]
199
- temp_symbol_code_map = dict(zip(data_name[exchange], data_code[exchange]))
200
- symbol = temp_symbol_code_map[symbol]
201
- out_exchange_name = {
202
- "1": "上海期货交易所",
203
- "2": "郑州商品交易所",
204
- "3": "大连商品交易所",
205
- "4": "LME",
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
- name_temp_dict = {}
214
- code_temp_dict = {}
215
- for num in data_code.keys():
216
- name_temp_dict[out_exchange_name[num]] = dict(
217
- zip(data_code[num], data_name[num])
218
- )
219
- code_temp_dict[num] = dict(zip(data_code[num], data_name[num]))
220
- n = 10
221
- while n != 0:
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: akshare
3
- Version: 1.15.52
3
+ Version: 1.15.53
4
4
  Summary: AKShare is an elegant and simple financial data interface library for Python, built for human beings!
5
5
  Home-page: https://github.com/akfamily/akshare
6
6
  Author: AKFamily
@@ -1,4 +1,4 @@
1
- akshare/__init__.py,sha256=_c70BHqGSSHjYPF9CgmWM2rWlOGB7-w5wbqE1qPolek,184536
1
+ akshare/__init__.py,sha256=2SaACef3zm3ubS7l_7DNebqR6iQAKIv1ILNe87vi0iI,184584
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=zD2uRQK3v-mywcDZfL28sDdRl6WIeWthHTfu8nrcQAo,16252
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
@@ -114,7 +114,7 @@ akshare/futures/futures_foreign.py,sha256=oSIoAg5oy-CIlPWHkQffcvZGu02Y2GWOrt-6aP
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
116
  akshare/futures/futures_index_ccidx.py,sha256=9Rhk3ps-H69tU-NIV0W2NdLFUDTSUx0bwtePA6gLMZA,4566
117
- akshare/futures/futures_inventory_99.py,sha256=Nvw39obGGhgOkk_C4jOrV4gdq78dtHPOnits_B0Ljxk,8450
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
@@ -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.52.dist-info/LICENSE,sha256=mmSZCPgfHiVw34LXuFArd-SUgQtBJ_QsIlh-kWlDHfs,1073
383
- akshare-1.15.52.dist-info/METADATA,sha256=GfRVN6XAskJOvwQjjtJdJZviEpJLncP0omIwlfZTi8Q,13423
384
- akshare-1.15.52.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
385
- akshare-1.15.52.dist-info/top_level.txt,sha256=jsf9ZzZPmHaISTVumQPsAw7vv7Yv-PdEVW70SMEelQQ,14
386
- akshare-1.15.52.dist-info/RECORD,,
381
+ akshare-1.15.53.dist-info/LICENSE,sha256=mmSZCPgfHiVw34LXuFArd-SUgQtBJ_QsIlh-kWlDHfs,1073
382
+ akshare-1.15.53.dist-info/METADATA,sha256=SjNgBu98A4GV4_4GSZqLTlAX5E0T35kZdQB3pIGWZIc,13423
383
+ akshare-1.15.53.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
384
+ akshare-1.15.53.dist-info/top_level.txt,sha256=jsf9ZzZPmHaISTVumQPsAw7vv7Yv-PdEVW70SMEelQQ,14
385
+ akshare-1.15.53.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
-