Parsowanie danych otrzymanych przez allegro WebAPI

0

Hej, walczę z połączeniem się z allegro przez allegro WebAPI, co po części mi się udało i jestem w stanie uzyskać dane z serwera... jednak nie mam pojęcia w jaki sposób parsować je w pythonie ktoś może będzie wiedzieć ? Jestem zielony (poziom 2 rok studiów, a tam robimy ogólnie c++ tylko, pythona sam się ucze).
Byłbym wdzięczny za każdą pomoc, dzisiaj od rana siedzę i w końcu udało mi się zrobić poniższe... i dane przychodzą! Jednak są w takiej formie że nie mam pojęcia co z nimi zrobić...

Wysyłam zapytanie i w odpowiedzi do zmiennej zapisuje mi się coś takiego

(ArrayOfBillingdatatype){ item[] = 
(BillingDataType){ billingId = 54 billingType = "AFP" billingFixperc = "P" billingName = "Wpłata z Programu partnerskiego" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "1.2" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 332 billingType = "AP1" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet osobisty" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "10" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 333 billingType = "AP2" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet profesjonalny" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "600" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 334 billingType = "AP3" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet pełny" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "2500" billingAuctionType = 0 },

no i tona tego typu danych, powyżej jest tylko małą część.... jednak nie jest to ani słownik ani lista, tablica nic...
Co to za typ danych i jak go sparsować żebym mógł go np. przeszukać w poszukiwaniu konkretnych wartości?
Ktoś może coś robił z Allegro WebAPI ? i byłby w stanie pomóc ?
Jak nie uda mi się ogarnąć tego powyższego spróbuję powalczyć z "Allegro REST Api" -> coś tam próbowałem ale dla mnie to magia wszystko jest i nawet gorzej to rozumiem niż WebAPI.

A może jakoś inaczej polecacie się za to zabrać, jakiś inny sposób?

1

To jest jakaś lista rekordów, wszystkie zawierają takie same pola, na początek cos takiego:

 s  = """(ArrayOfBillingdatatype) item[] = 
(BillingDataType){ billingId = 54 billingType = "AFP" billingFixperc = "P" billingName = "Wpłata z Programu partnerskiego" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "1.2" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 332 billingType = "AP1" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet osobisty" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "10" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 333 billingType = "AP2" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet profesjonalny" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "600" billingAuctionType = 0 }, 
(BillingDataType){ billingId = 334 billingType = "AP3" billingFixperc = "F" billingName = "Abonament za Allegro WebAPI - pakiet pełny" billingRangeFrom = "0" billingRangeTo = "0" billingCat = "0" billingRate = "2500" billingAuctionType = 0 }"""
                         
main_arr = []
temp_str = ""

for ind in range(len(s)):
    if s[ind] == "{":
        cnt = ind + 1
        while s[cnt] != "}":
            temp_str += s[cnt]
            cnt += 1
        main_arr.append(temp_str)
        temp_str = ""
#print(main_arr[:2])

main_arr[0] =main_arr[0].replace('=', ' = ');
main_arr[0] = main_arr[0].split();
print(main_arr[0])

Po ktrótce: Do stringa, a potem iteracja i, jak widać wszystko co w nawiasach klamrowych do pojedynczego stringa, a jak nawias się zamknie to ten string doczepiamy do listy głównej (main_arr), i jeszzce split().
Teraz Masz listę list, jakieś wyszukiwanie juz chyba łatwo zrobić, albo jeszcze sparsować to do listy dictów. Oczywiście, wszystko czytelnie w funkcjach

0

Ok, ogólnie będę uzupełniać co udało mi się z tym zrobić... bo możliwe że komuś się jeszcze przyda... po necie krążą plotki że to Allegro WebAPI to piekło informatyków na ziemi. Udało mi się "odkryć" że ten typ danych tworzy się przez moduł suds w dokumentacji opis "Lightweight SOAP client", a powyższe dane są w formacie SOAP, odpowiednio korzystając z pythona jesteśmy w stanie je filtrować i inne takie, wszystko w dokumentacji... co prawda wciąż nie udało mi się zdobyć żadnych informacji o jakimkolwiek konkretnym produkcie (nawet listy produktów wciąż nie mam), ale chyba coraz bliżej celu...

Powyższe na pewno się przyda jak już w końcu jakieś dane zdobędę... szybko przerobić na listę i do bazy, więc dzięki ;)

0

To co Pokazałeś tutaj to nie jakieś piekło w Pythonie mozna to obrabiać lekko łatwo i przyjemnie:)

0

To byłbym wdzięczny za jeszcze jedną małą wskazówkę. Mianowicie według dokumentacji (https://jortel.fedorapeople.org/suds/doc/suds.client.Client-class.html#dict) mogę to zamienić na listę używając "Client.items(obj)" lub na słownik "Client.dict(obj)"

np.

result = Client.item(objekt_suds)

i teraz wypisuję wszystko z listy:

for item in result:
print(item)

Nie ważne czy zamienię na listę jak tutaj czy na słownik dostaję coś w takim wymiarze:

--> ('itemsCount', 423808) --> ('itemsFeaturedCount', 1000)
 --> ('itemsList', <suds.sudsobject.ArrayOfItemslisttype object at 0x0895F970>) 
--> ('categoriesList', <suds.sudsobject.CategoriesListType object at 0x09482390>) 
--> ('filtersList', <suds.sudsobject.ArrayOfFilterslisttype object at 0x094858B0>)

Wiem że są to chyba adresy komórek w pamięci które zawierają kolejne listy, ale w jaki sposób się do nich dostać?

0

Pewnie by sie jakiś dalo, tylko Teraz pisze z komorki, to wield nie zrobie. A, Np., suds.sudsobject.ArrayOfItemslisttype, czy mozna sie do tego obiektu odwolac, on gdzies w ogole istnieje czy to sa tylko nazwy, ktore Chcesz wyciagnac z tego chaosu.

0

Podbijam temat bo mam podobny problem.
Za pomocą metody *doGetItemList * pobieram liste aukcji w danej kategorii.
Zwrotnie otrzymuje obiekt o typie class 'suds.sudsobject.reply'
Następnie próbuję wyciągnąć tylko to co mnie interesuje, czyli ID wylistowanych aukcji.
Używam metody Client.dict(), która konwertuje moją odpowiedź do słownika, a następnie wycinam tylko wartość słownika itemsList, która jest typu: class 'suds.sudsobject.ArrayOfItemslisttype' i wygląda następująco:

(ArrayOfItemslisttype){
   item[] = 
      (ItemsListType){
         itemId = 7005321172
         itemTitle = "Bmw 120d MPower,193KM,58tyś,F20"
         leftCount = 1
         bidsCount = 0
         biddersCount = 0
         quantityType = "pieces"
         endingTime = 2017-11-06 20:18:11+01:00
...
      (ItemsListType){
         itemId = 7005688555
         itemTitle = "BMW 1 120d Urban line Lublin 180 koni f20 2011"
         leftCount = 1
         bidsCount = 0
         biddersCount = 0
         quantityType = "pieces"
         endingTime = 2017-11-07 00:09:05+01:00
...
      (ItemsListType){
         itemId = 7007292879
         itemTitle = "BMW F20 M pakiet automat kamera navi gwarancja 1wł"
         leftCount = 1
         bidsCount = 0
         biddersCount = 0
         quantityType = "pieces"
         endingTime = 2017-11-07 22:50:58+01:00

Mnie to wygląda na jakiś XML? SOAP? Sam nie wiem... chciałbym to docelowo pakować do bazy danych w czystej formie:

itemId itemTitle
7005321172 "Bmw 120d MPower,193KM,58tyś,F20"

Ale nie wiem jak to wyczyścić... Ktoś ma jakiś pomysł?

0

@lion137
Edytowałem strukture ArrayOfItemslisttype, żeby CI to lepiej zobrazować. Każdy ItemsListType to jedna aukcja, takich obiektów mogę miec od 1 do 1000, ale ich struktura zawsze jest tak samo głęboko zagnieżdżona. Oczywiście to nie jest cały obiekt - Cały ma kilkadziesiąt rekordów (zdjęcia, opisy, itd) ale nie chce zaśmiecać a wydaje mi się, że to wystarczy do zrozumienia działania.

0

Rozumiem, że tam gdzie są u Ciebie trzy kropki, to nawiasy klamrowe są zamykane. Jak tak to Postępuj podobnie, jak pokazałem tutaj:
Parsowanie danych otrzymanych przez allegro WebAPI
Zrobić z całości string:

s = """(ArrayOfItemslisttype){
   item[] =
      (ItemsListType){
         itemId = 7005321172
         itemTitle = "Bmw 120d MPower,193KM,58tyś,F20"
         leftCount = 1
         bidsCount = 0
         biddersCount = 0
         quantityType = "pieces"
         endingTime = 2017-11-06 20:18:11+01:00
    }
      (ItemsListType){
         itemId = 7005688555
         itemTitle = "BMW 1 120d Urban line Lublin 180 koni f20 2011"
         leftCount = 1
         bidsCount = 0
         biddersCount = 0
         quantityType = "pieces"
         endingTime = 2017-11-07 00:09:05+01:00
    }
    }"""

Teraz w zasadzie można chyba użyć dokładnie takiej pętli, jak w moim linkowanym poście (Ty bedziesz miał jeszcze znaki '\n' - końca linii), i Otrzymasz listę stringów. Dalej uważnie ją filtrując, używając metod na stringach i listach, Dostaniesz w końcu interesujące Cię pola.

0

Jakoś próbuje sobie radzić z tym problemem - może trochę inaczej niz napisał @lion137, ale chyba skutecznie.

Natomiast w trakcie pracy natrafiłem na inny problem - metoda doGetItemsList, którą pobieram identyfikatory aukcji, pozwala na pobranie max 1000 pozycji danej kategorii. Chciałbym móc w jakiś sposób sterować tym zestawem pozycji.
Np. pobierać paczkami po 1000, ale za każdym razem inny zestaw.
Początkowy pomysł był taki, żeby proces chodził np. co godzine i pobierał tylko aukcje utworzone w ciągu ostatniej godziny, ale niestety data utworzenia jest niewidoczna z poziomu API, więc nie mogę po niej filtrować. Co prawda mogę sortować... więc w tej chwili plan jest taki, żeby skrypt uruchamiac co godzinę i pobierać np 500 pozycji sortując po dacie utworzenia - to w pewnym stopniu rozwiąże problem, ale wygeneruje kolejne - braki w danych (jeśli w ciągu godziny zostanie wystawionych wiecej niz 500 aukcji), lub duplikaty (jeżeli mniej niż 500). Co prawda z duplikatami mogę sobie poradzić na poziomie bazy danych, ale to jest ostateczność...

Macie inne pomysły?

Link do dokumentacji:
http://allegro.pl/webapi/documentation.php/show/id,1342#method-input
http://allegro.pl/webapi/documentation.php/show/id,342#method-input

1 użytkowników online, w tym zalogowanych: 0, gości: 1