Automatisera det tråkiga! Hur gör man en sökning på kolli-nr, fast JÄTTEMÅNGA gånger?

Permalänk
Medlem

Jaaa! Succé! Så härligt att få det att fungera så pass att python processar, sidan anropas och min excel-fil uppdateras! 🏆⭐️

Nu bara få resten att funka!

(Tack för hjälpen med påpekandet att köra skript. Man kan googla vad som helst - bara man vet vad man ska googla!

Permalänk
Medlem

Det här blir bättre och bättre. Lade till ett litet Break-kommando, för att skriptet skulle fortsätta köra när det stötte på ett svar där det saknades ett namn/kvittens. Nästan hemma ev!! 🏆

Körde skriptet på en excelfil med 100 kolli-nr, varav ca 50 är manuellt avstämda via Postnords hemsida. Det verkar funka jättebra. Antingen inget värde, eller ett namn returnerat per rad. PERFEKT.

Men - en skum grej! För ngn enstaka rad så returnerar inte skriptet namnet. Även då det finns ett namn att returnera.

Jag körde skriptet 2 ggr och just för den här "b svensson" så var det för 2 olika kolli-nr som namnet inte returnerades. Jag replikerade alltså inte felet, utan istället blev det ett annat fel - och det föregående felet var plötsligt inte ett fel längre.

EDIT: Kanske otydligt, men i första körningen returnerades inget värde för 69419228341SE. Och inte andra körningen inget värde för 69419308668SE.

Permalänk
Testpilot

Kan du möjligtvis ha blivit begränsad på grund av för många anrop per sekund? scriptet verkar ju vänta exakt en sekund som väl var minimumgränsen och kanske blir det nån fördröjning på vägen eller nån annan o-synk som gör att Postnord får in två anrop för tätt inpå.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem
Skrivet av hunden:

Kan du möjligtvis ha blivit begränsad på grund av för många anrop per sekund? scriptet verkar ju vänta exakt en sekund som väl var minimumgränsen och kanske blir det nån fördröjning på vägen eller nån annan o-synk som gör att Postnord får in två anrop för tätt inpå.

Aha! Ja det låter rimligt! Kanske kan sätta 2 sek, eller att den testar 2 ggr på varje kollinr.

Permalänk
Medlem
Skrivet av hunden:

Kan du möjligtvis ha blivit begränsad på grund av för många anrop per sekund? scriptet verkar ju vänta exakt en sekund som väl var minimumgränsen och kanske blir det nån fördröjning på vägen eller nån annan o-synk som gör att Postnord får in två anrop för tätt inpå.

Skrivet av Pender:

Aha! Ja det låter rimligt! Kanske kan sätta 2 sek, eller att den testar 2 ggr på varje kollinr.

@hunden har rätt. 1 sek räckte inte som fördröjning. Jag höftade bara till något som verkade fungera och det råkade bli för kort. Jag försökte bygga in en check och loop tills det lyckades, men det var en dålig implementation som inte visste skillnad på när det inte fanns någon acceptor och när man slog i ratelimiten. När du sedan lade till en break började den skippa när man blev ratelimitad istället för att loopa som min optimistiska plan var. Aja, jag varnade åtminstone för att felhanteringen var dålig.

Bifogar (förhoppningsvis) bättre fungerande kod med någorlunda genomtänkt hantering av de fel som du märkt kan uppstå plus lite bonusar som att skippa redan processerade rader och marginellt mer informativ output.

Klicka för mer information

import requests, json, openpyxl, time

APIKEY = "honken, tomten och louis pasteur"
EXCEL_FILE = "book.xlsx"

wb = openpyxl.load_workbook(EXCEL_FILE)
s = requests.Session()

for row in wb.active.iter_rows(min_row=2):
id = row[0].value
if not id: # no more ids -> end of list?
break
if row[1].value: # skip already processed rows
continue

print("\nProcessing:", id)
while True:
try:
r = s.get("https://ds.postnord.com/v2/trackandtrace/findByIdentifier.json", params={
"id": id,
"locale": "sv",
"apikey": APIKEY,
})
a = json.loads(r.text)
row[1].value = a["TrackingInformationResponse"]["shipments"][0]["items"][0]["acceptor"]["name"]
time.sleep(1)
wb.save(EXCEL_FILE)
print("Success")
except KeyError as e:
if str(e) == "'TrackingInformationResponse'":
print("Rate limited, trying again in 1 second")
time.sleep(1)
continue
elif str(e) == "'acceptor'":
print("No acceptor found. Need to process manually?")
print("Skipping")
else:
print("Other KeyError:", e)
# vet inte om det här händer någon gång
print("Skipping")
except IndexError as e:
print("IndexError:", e)
print("Is tracking ID valid?")
# vet inte hur du vill hantera detta, så skippar bara
print("Skipping")

break

Visa mer
missade en noparse som visst behövdes
Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av LemonIllusion:

@hunden har rätt. 1 sek räckte inte som fördröjning. Jag höftade bara till något som verkade fungera och det råkade bli för kort. Jag försökte bygga in en check och loop tills det lyckades, men det var en dålig implementation som inte visste skillnad på när det inte fanns någon acceptor och när man slog i ratelimiten. När du sedan lade till en break började den skippa när man blev ratelimitad istället för att loopa som min optimistiska plan var. Aja, jag varnade åtminstone för att felhanteringen var dålig.

Bifogar (förhoppningsvis) bättre fungerande kod med någorlunda genomtänkt hantering av de fel som du märkt kan uppstå plus lite bonusar som att skippa redan processerade rader och marginellt mer informativ output.

Klicka för mer information

import requests, json, openpyxl, time APIKEY = "honken, tomten och louis pasteur" EXCEL_FILE = "book.xlsx" wb = openpyxl.load_workbook(EXCEL_FILE) s = requests.Session() for row in wb.active.iter_rows(min_row=2): id = row[0].value if not id: # no more ids -> end of list? break if row[1].value: # skip already processed rows continue print("\nProcessing:", id) while True: try: r = s.get("https://ds.postnord.com/v2/trackandtrace/findByIdentifier.jso...", params={ "id": id, "locale": "sv", "apikey": APIKEY, }) a = json.loads(r.text) row[1].value = a["TrackingInformationResponse"]["shipments"][0]["items"][0]["acceptor"]["name"] time.sleep(1) wb.save(EXCEL_FILE) print("Success") except KeyError as e: if str(e) == "'TrackingInformationResponse'": print("Rate limited, trying again in 1 second") time.sleep(1) continue elif str(e) == "'acceptor'": print("No acceptor found. Need to process manually?") print("Skipping") else: print("Other KeyError:", e) # vet inte om det här händer någon gång print("Skipping") except IndexError as e: print("IndexError:", e) print("Is tracking ID valid?") # vet inte hur du vill hantera detta, så skippar bara print("Skipping") break

Visa mer

Okej! Tack för återkopplingen och allt! Du får pm:a mig din adress så jag kan posta dig en liten symbolisk julklapp som tack för hjälpen.🎈

Jag testar den nya koden du bifogat men får det inte att fungera. Om jag kör py-filen så stängs den direkt. Om jag kör skriptet från kommandotolken får jag följande felmeddelande:

Klicka för mer information

File "H:\nyttskript.py", line 10 id = row[0].value ^ SyntaxError: invalid syntax

Visa mer

Vad gör jag fel?

(EDIT: bifogar bild då koden inte vill se ut som jag klistrar in den i forumposten?)

Permalänk
Medlem
Skrivet av Pender:

Okej! Tack för återkopplingen och allt! Du får pm:a mig din adress så jag kan posta dig en liten symbolisk julklapp som tack för hjälpen.🎈

Jag testar den nya koden du bifogat men får det inte att fungera. Om jag kör py-filen så stängs den direkt. Om jag kör skriptet från kommandotolken får jag följande felmeddelande:

Klicka för mer information

File "H:\nyttskript.py", line 10 id = row[0].value ^ SyntaxError: invalid syntax

Visa mer

Vad gör jag fel?

(EDIT: KOD)

Jag missade att lägga [noparse][/noparse]-taggar på koden, så SweClockers BB-kodparser gick in och förstörde lite här och var. Jag har fixat det nu, så kopiera koden igen och testa.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av LemonIllusion:

Jag missade att lägga [noparse][/noparse]-taggar på koden, så SweClockers BB-kodparser gick in och förstörde lite här och var. Jag har fixat det nu, så kopiera koden igen och testa.

Jaha! Jag såg just att det tillkommit extra taggar! Håller på att testa! Grymt tack!

EDIT: Nu funkar det. TICKAR PÅ SOM EN ROLEX! Så himla snyggt. Så himla schysst.

Permalänk
Sötast

Sjukt rolig tråd att läsa. Sweclockers is amazing!

Permalänk
Medlem
Skrivet av Sebbepojken:

Dom skojar med dig Som du är på väg att märka själv tar det inte många timmar att skriva ett sånt program. En programmerare skulle kunna få det gjort ordentligt på en halv dag.

Frågan är om deras it-avdelning består av några programerare. Som konsult inom systemutveckling skulle jag uppskatta jobbet till under 1 timme om det får göras i programmerarens val av språk. Det är inte många rader av kod som behövs för att skriva detta i Erlang eller i Nodejs.

På 30 timmar skulle man nästan kunna skriva det här i assembler från grund för att få en kul utmaning.