С помощью Python я хочу получить из Интернета информацию о холдингах руководителей публично зарегистрированных компаний. Поэтому сначала я создаю полный список кодов акций (только с цифрами) под названием target_list_onlynumber, который выглядит следующим образом:
Вот веб-сайт, с которого я пытаюсь получить данные: https://data.eastmoney.com/executive/000001.html . Он соответствует биржевому коду <000001>. Для акций с кодовым номером i соответствующий веб-сайт https://data.eastmoney.com/executive/i.html И, выполнив следующий код, я могу получить нужный фрейм данных:
df = pd.DataFrame(
requests.get('https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&filter=(SECURITY_CODE%3D"000001")')\
.json().get('result').get('data'))
print(df)
Результирующий фрейм данных выглядит так:
Теперь я хочу написать цикл for, чтобы получить все DataFrames всех акций, кодовые номера которых находятся в списке target_list_onlynumber. df_i — это стандартный DataFrame с кодовым номером i. (например, df_601857 — это стандартный DataFrame с кодовым номером 601857.) Вот что я попробовал, что похоже на предыдущий код для стандартного <000001>:
df_list = []
for i in target_list_onlynumber:
exec_data = requests.get('https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&filter=(SECURITY_CODE%3D"{i}")')\
.json().get('result').get('data')
df_i = pd.DataFrame(exec_data)
df_list.append(df_i)
print(df_i)
Но результат таков:
Traceback (most recent call last):
File "/tmp/jqcore/jqboson/jqboson/core/entry.py", line 379, in _run
engine.start()
File "/tmp/jqcore/jqboson/jqboson/core/engine.py", line 231, in start
self._dispatcher.start()
File "/tmp/jqcore/jqboson/jqboson/core/dispatcher.py", line 280, in start
self._run_loop()
File "/tmp/jqcore/jqboson/jqboson/core/dispatcher.py", line 240, in _run_loop
self._loop.run()
File "/tmp/jqcore/jqboson/jqboson/core/loop/loop.py", line 107, in run
self._handle_queue()
File "/tmp/jqcore/jqboson/jqboson/core/loop/loop.py", line 153, in _handle_queue
message.callback(**message.callback_data)
File "/tmp/jqcore/jqboson/jqboson/core/mds/market_data_subscriber.py", line 228, in broadcast
consumer.send(market_data)
File "/tmp/jqcore/jqboson/jqboson/core/mds/market_data_consumer_manager.py", line 59, in consumer_gen
msg_callback()
File "/tmp/jqcore/jqboson/jqboson/core/mds/market_data_consumer_manager.py", line 52, in msg_callback
callback(market_data)
File "/tmp/jqcore/jqboson/jqboson/core/mds/market_data_consumer_manager.py", line 122, in wrapper
result = callback(*args, **kwargs)
File "/tmp/jqcore/jqboson/jqboson/core/strategy.py", line 474, in _wrapper
self._context.current_dt
File "/tmp/strategy/user_code.py", line 90, in handle_data
.json().get('result').get('data')
AttributeError: 'NoneType' object has no attribute 'get'
Я не понимаю, почему код для одной акции завершается успешно, а цикл for терпит неудачу. Может кто-нибудь помочь мне исправить это, пожалуйста?






способ передачи параметра I в строку URL должен использовать «f» в начале строки
вместо:
exec_data = requests.get('https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&filter=(SECURITY_CODE%3D"{i}")')\
.json().get('result').get('data')
делать:
exec_data = requests.get(f'https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&filter=(SECURITY_CODE%3D"{i}")')\
.json().get('result').get('data')
это говорит Python использовать стиль формата, заменяя то, что находится в фигурных скобках, его значением
Во-первых, вам не хватает f в начале строки, а это означает, что значения i в фигурных скобках не оцениваются. Кроме того, вы используете get, предполагая, что никогда не получите недействительный инвентарный номер, что может быть еще одной причиной, по которой он может вернуться None. Вместо того, чтобы предполагать, что это сработает, вам следует попробовать что-то вроде этого:
df_list, broken_values = [], []
for i in target_list_onlynumber:
try:
exec_data = (
requests.get(
f'https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&filter=(SECURITY_CODE%3D"{i}")'
).json().get('result').get('data')
)
df_i = pd.DataFrame(exec_data)
df_list.append(df_i)
print(df_i)
except:
AttributeError as e:
print(f"{e} for {i}")
broken_values.append(i)