Hallo liebe Community,
ich fange gerade an Python zu lernen und versuche Daten aus einem externen API-Endpunkt abzurufen und das Ergebnis in eine csv Datei zu speichern (finales Ziel wird sein die Daten dann direkt in eine MariaDB zu importieren, aber zum Testen nutze ich erstmal eine .csv Datei).
Die Besonerheit hier ist, dass ich mehrere API-Calls (POST:HTTPS) zeitgleich asynchron aufrufen möchten, da eine synchrone Abfrage aufgrund der Datenmenge bis zu 8h dauert.
Mein Vorhaben:
1. CHECK - Datenbankverbindung aufbauen um benötigte POST-Parameter aus der DB beim API-Call zu übergeben
2. CHECK - Asynchrone HTTP POST Requests senden und ergebnis empfangen. Aktuell lasse ich drei Requests gleichzeitig abschicken (Credits). Anders als im Tutorial bleibt die Request-URL bei mir die gleiche aber der POST Body variiert bei mir. Daher hole ich mir die Post-Parameter aus einer bestehenden Datenbank.
3. HILFE! -
Das Ergebnis aufbereiten und in eine .csv Datei speichern
Mein Code:
Ich versuche zunächst erstmal nur die jeweilige
Ich vermute irgendetwas mit der Schleife funzt nicht, bzw. versucht auf das falsche Objekt zuzugreifen?
Stehe hier auf dem Schlauch und bin dankbar für jede Hilfe.
Grüße,
canju
ich fange gerade an Python zu lernen und versuche Daten aus einem externen API-Endpunkt abzurufen und das Ergebnis in eine csv Datei zu speichern (finales Ziel wird sein die Daten dann direkt in eine MariaDB zu importieren, aber zum Testen nutze ich erstmal eine .csv Datei).
Die Besonerheit hier ist, dass ich mehrere API-Calls (POST:HTTPS) zeitgleich asynchron aufrufen möchten, da eine synchrone Abfrage aufgrund der Datenmenge bis zu 8h dauert.
Mein Vorhaben:
1. CHECK - Datenbankverbindung aufbauen um benötigte POST-Parameter aus der DB beim API-Call zu übergeben
2. CHECK - Asynchrone HTTP POST Requests senden und ergebnis empfangen. Aktuell lasse ich drei Requests gleichzeitig abschicken (Credits). Anders als im Tutorial bleibt die Request-URL bei mir die gleiche aber der POST Body variiert bei mir. Daher hole ich mir die Post-Parameter aus einer bestehenden Datenbank.
3. HILFE! -

Mein Code:
Python:
import db_config
import numpy
import asyncio
import aiohttp
import json
sql_select_Query = '''SELECT
some,
required,
parameters
FROM table ORDER BY created DESC LIMIT 3'''
db_config.cursor = db_config.connection.cursor(dictionary=True)
db_config.cursor.execute(sql_select_Query)
# get all records
records = db_config.cursor.fetchall()
print("Total number of rows in table: ", db_config.cursor.rowcount)
url = "https://webservice.com"
headers = {
'Authorization': 'Bearer API_TOKEN',
'Content-Type': 'application/json'
}
for row in records:
body = {
"some": row['some'],
"required": row['required'],
"parameters": row['parameters']
}
file = open("response.csv", "w", encoding='utf-8')
async def gather_with_concurrency(n, *tasks):
semaphore = asyncio.Semaphore(n)
async def sem_task(task):
async with semaphore:
return await task
return await asyncio.gather(*(sem_task(task) for task in tasks))
async def post_async(url, session, headers, body):
async with session.post(url, headers=headers, json=body) as response:
text = await response.text()
return json.loads(text)
async def main():
conn = aiohttp.TCPConnector(limit=None)
session = aiohttp.ClientSession(connector=conn)
conc_req = 3
response = await gather_with_concurrency(conc_req, *[post_async(url, session, headers, body) for row in records])
await session.close()
#print(response)
tariffs = json.loads(str(response))
for tariff in tariffs:
print(tariff['Id'])
file.write(json.dumps(response, indent=4))
#print(json.dumps(response, indent=4)) # convert in pretty json
asyncio.get_event_loop().run_until_complete(main())
file.close()
if db_config.connection.is_connected():
db_config.connection.close()
db_config.cursor.close()
print("\n \n MySQL connection is closed")
print(response)
(Zeilenümbrüche habe ich der lesbarkeit halber hinzugefügt):
Code:
[[
{"Active": true, "Id": 123, "Tariffs": [{"ContractDuation": 24.0, "Cost": {"InitialCost": 1479.8245, "MonthlyCost": 50.00}, "Valid": "2022-07-01T00:00:00"}], "Code": 54789},
{"Active": true, "Id": 124, "Tariffs":[{"ContractDuation": 12.0, "Cost":{"InitialCost": 864.1534, "MonthlyCost": 55.00}, "Valid": "2022-07-01T00:00:00"}{"ContractDuation": 24.0, "Cost":{"InitialCost": 11265.6524, "MonthlyCost": 45.00},"Valid": "2022-07-01T00:00:00"}],"CodeNumber": 62147}
]]
print(json.dumps(response, indent=4))
JSON:
[
[
{
"Active": true,
"Id": 123,
"Tariffs":
[
{
"ContractDuation": 24.0,
"Cost":
{
"InitialCost": 1479.8245,
"MonthlyCost": 50.00
},
"Valid": "2022-07-01T00:00:00"
}
],
"Code": 54789
},
{
"Active": true,
"Id": 124,
"Tariffs":
[
{
"ContractDuation": 12.0,
"Cost":
{
"InitialCost": 864.1534,
"MonthlyCost": 55.00
},
"Valid": "2022-07-01T00:00:00"
}
{
"ContractDuation": 24.0,
"Cost":
{
"InitialCost": 11265.6524,
"MonthlyCost": 45.00
},
"Valid": "2022-07-01T00:00:00"
}
],
"CodeNumber": 62147
},
]
]
Ich versuche zunächst erstmal nur die jeweilige
Id
printen zu lassen, ich erhalte jedoch die Fehlermeldung:
Code:
Traceback (most recent call last):
File "test.py", line 101, in <module>
asyncio.get_event_loop().run_until_complete(main())
File "/usr/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
return future.result()
File "test.py", line 90, in main
tariffs = json.loads(str(response))
File "/usr/lib/python3.8/json/__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.8/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 3 (char 2)
Ich vermute irgendetwas mit der Schleife funzt nicht, bzw. versucht auf das falsche Objekt zuzugreifen?
Stehe hier auf dem Schlauch und bin dankbar für jede Hilfe.
Grüße,
canju