Моя цель — просмотреть таблицу на сайте https://data.eastmoney.com/executive/list.html и сохранить ее в Excel. Обратите внимание, что в нем 2945 страниц, и я хочу поместить их все в один лист Excel.
Самый простой способ сделать это — посмотреть, откуда извлекаются данные. Итак, я нажал на веб-страницу, чтобы получить исходный код, и увидел центр обработки данных <datacenter-web.eastmoney.com>
Поэтому я использую этот API в красном поле выше, чтобы получить данные. Вот мой код
import pandas as pd
import requests
df = pd.DataFrame(
requests.get('https://datacenter-web.eastmoney.com/api/data/v1/get?
reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&sortColumns=CHANGE_DATE')\
.json().get('result').get('data'))
df.to_excel('G:/ExecutiveHoldings/all_by_date.xlsx', index = True)
Я хочу, чтобы все столбцы и строки были отсортированы по CHANGE_DATE, и вот какие данные я получаю:
Обратите внимание, что строки имеют ограниченное количество строк в 500, индекс от 0 до 499. Тем не менее, я хочу получить весь фрейм данных из Интернета с номерами строк, превышающими 500. Есть ли какой-нибудь простой способ получить все 2945 страниц таблицы и поместить их все в один лист Excel?
Вы можете получить следующую страницу, используя параметр pageNumber = {page_number}
.
Параметр pageSize
определяет, сколько элементов данных извлекается за один запрос. По умолчанию и максимальное значение — 500.
Это URL-адрес доступа
https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&sortColumns=CHANGE_DATE&pageNumber = {page_number}&pageSize=500
Этот код может получить все данные строк.
Скрипт извлекает данные с разбивкой на страницы по указанному URL-адресу до тех пор, пока данные больше не перестанут быть доступными.
Данные собираются в списке all_data, каждая страница которого содержит до 500 элементов.
Ход выполнения, включая номер страницы и количество данных, регистрируется во время каждой выборки.
После получения всех данных они преобразуются в DataFrame pandas.
DataFrame сохраняется в файле Excel с именем all_by_date.xlsx.
Key Logic
Условия цикла while: Цикл будет продолжаться бесконечно, пока не встретится оператор прерывания. Это потому, что условие цикла while всегда истинно.
fetch-data.py
import requests
import pandas as pd
def fetch_data():
all_data = []
page_number = 1
while True:
url = f'https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&sortColumns=CHANGE_DATE&pageNumber = {page_number}&pageSize=500'
try:
response = requests.get(url)
response.raise_for_status()
result = response.json().get('result', {})
if not result or not result.get('data') or len(result['data']) == 0:
break # Exit loop if data array is empty
all_data.extend(result['data'])
print(f'Page: {page_number}, Data Count: {len(result["data"])}, Total Data: {len(all_data)}')
page_number += 1
except requests.exceptions.RequestException as e:
print(f'Error fetching data from page {page_number}:', e)
break # Exit loop on error
return all_data
def save_data_to_excel(data):
df = pd.DataFrame(data)
df.to_excel('./all_by_date.xlsx', index=False)
print('Data successfully saved to all_by_date.xlsx')
if __name__ == '__main__':
data = fetch_data()
if data:
save_data_to_excel(data)
else:
print('No data fetched.')
pip install requests pandas openpyxl
python fetch-data.py
50 * 2944 + 39 = 147 239 данных
*Примечание: последнее примечание на странице 2945 содержит 39 строк.
147 240 строк – строка заголовка = 147 239 строк.
Пожалуйста! Если у вас есть вопросы о следующем шаге, создайте новый пост. Я постараюсь этому помочь.
это мой следующий новый вопрос. stackoverflow.com/questions/78573329/…
Надеюсь, вы сможете мне помочь с этим, сэр.
Вероятно, в API должна быть опция нумерации страниц. Попытайтесь найти и изучить документ API, если он доступен.