Веб-скрапинг DataFrame, но только 500 строк

Моя цель — просмотреть таблицу на сайте 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?

Вероятно, в API должна быть опция нумерации страниц. Попытайтесь найти и изучить документ API, если он доступен.

Parman M. Alizadeh 18.05.2024 06:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете получить следующую страницу, используя параметр 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 строк.

Пожалуйста! Если у вас есть вопросы о следующем шаге, создайте новый пост. Я постараюсь этому помочь.

Bench Vue 03.06.2024 15:38

это мой следующий новый вопрос. stackoverflow.com/questions/78573329/…

Evariste Galois 04.06.2024 12:20

Надеюсь, вы сможете мне помочь с этим, сэр.

Evariste Galois 04.06.2024 12:21

Другие вопросы по теме