Python: перебор API с несколькими страницами в таблицу Excel - PullRequest
0 голосов
/ 16 января 2020

Возможно, я использую неправильный модуль записи Excel, но я пытаюсь извлечь данные с сервера и затем организовать их в Excel. Максимальное количество записей, которое я могу извлечь, составляет 500, на сервере 5000 записей, поэтому обычно я просто извлекаю 500 одновременно. Я начал изучать редактирование своего кода, чтобы он автоматически завершил процесс на всех 10 страницах и отправил все в Excel.

Код ниже - самый близкий к выполнению этой задачи. Он перебирает все страницы, я делаю печать, чтобы увидеть, как это происходит, но на функции возврата, которая затем отправляет ее в электронную таблицу, я вижу только последнюю страницу из 500 записей. Возможно ли то, что я пытаюсь сделать с помощью xlxswriter? Есть ли лучший вариант, или есть способ исправить мою программу для выполнения этой задачи?

Любая помощь будет принята с благодарностью. Код ниже - это не полный код, а часть, посвященная проблеме Excel.

import requests
from datetime import datetime, timedelta
import json
import time
import subprocess
import sys
import os
import xlsxwriter


def label_search(query):
    company = input('\nEnter ID: ')
    size = 500
    offset = -501
    position = '&offset='
    api_call_response = requests.get(base_url +
                                     query + company + size
                                     + position + str(offset),
                                     headers=api_call_headers,
                                     verify=False)
    for value in api_call_response:
        while offset <= 5000:
            api_call_response
            offset += 500
            print(base_url +query + company + size + position + str(offset))
        return(api_call_response).json()


def lookup():
    try:
        label = input("\nPlease provide label name: ")
        label_info = label_search(label)
        if len(label) == 0:
            print("\nPlease provide a proper label name: ")
        else:
            search = label_info
            display_wb_all(search)
    except requests.exceptions.ConnectionError:
        print_pause("\nCouldn't connect to server! Check Network")
        menu()


def display_wb_all(search):
    row = 0
    col = 0
    wbname = input('Name your workbook: ')
    avwb = xlsxwriter.Workbook(wbname + '.xlsx')
    wsname = avwb.add_worksheet('WorkSheet1')
    cell_format = avwb.add_format()
    cell_format.set_bg_color('silver')
    cell_format.set_align('center')
    cell_format.set_align('vcenter')
    body_format = avwb.add_format()
    body_format.set_align('center')
    body_format.set_align('vcenter')
    body_format.set_bg_color('white')
    wsname.write('A1', 'Field name', cell_format)
    wsname.write('B1', 'Field name', cell_format)
    wsname.write('C1', 'Field name', cell_format)
    wsname.write('D1', 'Field name', cell_format)
    wsname.write('E1', 'Field name', cell_format)
    wsname.write('F1', 'Field name', cell_format)
    wsname.write('G1', 'Field name', cell_format)
    wsname.write('H1', 'Field name', cell_format)
    wsname.write('I1', 'Field name', cell_format)
    wsname.set_column('A:A', 35)
    wsname.set_column('B:B', 24)
    wsname.set_column('C:C', 10)
    wsname.set_column('D:D', 35)
    wsname.set_column('E:E', 19)
    wsname.set_column('F:F', 8)
    wsname.set_column('G:G', 19)
    wsname.set_column('H:H', 18)
    wsname.set_column('I:I', 11)
    for entry in search['items']:
        siteName = entry['id']
        s = entry['time']
        a = int(s or 0)/1000.0
        r = (datetime.datetime.fromtimestamp(a).strftime
             ('%Y-%m-%d %H:%M:%S'))
        try:
            state = entry['device'][0]['state']
        except TypeError:
            state = 'No Data Found'
        try:
            sim = entry['device'][0]['identifier']
        except TypeError:
            sim = 'No Data Found'
        try:
            platform = entry['device'][0]['mobile']
        except TypeError:
            platform = 'No Data Found'
        try:
            tech = entry['device'][0]['technology']
        except TypeError:
            tech = 'No Data Found'
        bytestotal = entry['usage']['bytesTotal']
        timestamp = entry['usage']['timestamp']
        ts = int(timestamp or 0)/1000.0
        x = (datetime.datetime.fromtimestamp(ts).strftime
             ('%Y-%m-%d %H:%M:%S'))
        limit = entry['dataUsage']['limit']
        row += 1
        wsname.write(row, col, siteName, body_format)
        wsname.write(row, col + 1, r, body_format)
        wsname.write(row, col + 2, state, body_format)
        wsname.write(row, col + 3, sim, body_format)
        wsname.write(row, col + 4, platform, body_format)
        wsname.write(row, col + 5, tech, body_format)
        wsname.write(row, col + 6, bytestotal, body_format)
        wsname.write(row, col + 7, x, body_format)
        wsname.write(row, col + 8, limit, body_format)
    avwb.close()
    print(os.getcwd())

1 Ответ

0 голосов
/ 16 января 2020

Похоже, вы пытаетесь открыть и записать в существующий файл Excel после первого запроса, что невозможно в xlsxwriter. Таким образом, каждый раз, когда вы вызываете функцию записи, вы перезаписываете существующий файл и, следовательно, получаете только данные из последнего вызова API.

https://xlsxwriter.readthedocs.io/introduction.html

Недостатки: он не может читать или изменять существующие файлы Excel XLSX.

Вы можете использовать openpyxl, чтобы сделать это, так как он поддерживает модификацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...