Vinnaren i pepparkakshustävlingen!
2022-06-07, 16:44
  #1993
Medlem
Jag vill göra en dictionary via zip och två listor. Där ena listan har samma värde, t ex a hela vägen men funkar inte.
t ex
Kod:
list1=[a,a,a,a]
list2=[1.3,2.8,44,100]
Använder sen zip metoden för att bygga en dictionary där a ska vara key som pekar på olika values
enligt
Kod:
mindict=dict(zip(list1,list2))

Då får jag bara en dictionary där {'a':"100"}

Det fungerar med olika värden i list1, men inte med samma värde i list1.
Nån med nåt tips?
Citera
2022-06-07, 16:58
  #1994
Medlem
Bonnatorps avatar
Citat:
Ursprungligen postat av janblommgren
Jag vill göra en dictionary via zip och två listor. Där ena listan har samma värde, t ex a hela vägen men funkar inte.
t ex
Kod:
list1=[a,a,a,a]
list2=[1.3,2.8,44,100]
Använder sen zip metoden för att bygga en dictionary där a ska vara key som pekar på olika values
enligt
Kod:
mindict=dict(zip(list1,list2))

Då får jag bara en dictionary där {'a':"100"}

Det fungerar med olika värden i list1, men inte med samma värde i list1.
Nån med nåt tips?
Måste du inte ha unika keys i list1 för att göra någon vettig dict?
Det är väl därför det bara fungerar när du har olika värden i listan?

Eller tänkte du att du ska få en lista när du kallar på en dictkey som motsvarar flera värden?
__________________
Senast redigerad av Bonnatorp 2022-06-07 kl. 17:00.
Citera
2022-06-07, 17:15
  #1995
Moderator
vhes avatar
Citat:
Ursprungligen postat av janblommgren
Jag vill göra en dictionary via zip och två listor. Där ena listan har samma värde, t ex a hela vägen men funkar inte.
t ex
Kod:
list1=[a,a,a,a]
list2=[1.3,2.8,44,100]
Använder sen zip metoden för att bygga en dictionary där a ska vara key som pekar på olika values
enligt
Kod:
mindict=dict(zip(list1,list2))

Då får jag bara en dictionary där {'a':"100"}

Det fungerar med olika värden i list1, men inte med samma värde i list1.
Nån med nåt tips?

Som Bonnatorp säger så är nycklar i dictionaries unika. Har du lust att beskriva hur dictionaryn du förväntade dig skulle se ut? Gärna genom att faktiskt skriva den med Python-syntax.
Citera
2022-06-07, 18:44
  #1996
Medlem
Citat:
Ursprungligen postat av janblommgren
Jag vill göra en dictionary via zip och två listor. Där ena listan har samma värde, t ex a hela vägen men funkar inte.
t ex
Kod:
list1=[a,a,a,a]
list2=[1.3,2.8,44,100]
Använder sen zip metoden för att bygga en dictionary där a ska vara key som pekar på olika values
enligt
Kod:
mindict=dict(zip(list1,list2))

Då får jag bara en dictionary där {'a':"100"}

Det fungerar med olika värden i list1, men inte med samma värde i list1.
Nån med nåt tips?

Vill du verkligen ha samma nyckel (list1) till alla värden?
I sådana fall kan du ju bara köra

Kod:
dic ={}
dic[a] =list2
Vilket gör att du får en dict med a som nyckel och hela listan som värde.


Om värderna är olika i list1:
Kod:
dic = dict() 
for key, value in zip(list1, list2):
       dic[key]=value
__________________
Senast redigerad av Methos 2022-06-07 kl. 18:46.
Citera
2022-06-09, 18:39
  #1997
Medlem
Bonnatorps avatar
Filurade på hur jag kan spara lite tid om jag skalar upp mitt webscrapingprojekt.

Ju nu läser jag av excelfiler och har variabler för var dokumentet ska börja iterera och var det ska sluta.
Jag har även lite kod som sparar dokumentet var 30:e rad, ifall något strular.
Eftersom det helt oundvikligen strular ibland så måste jag stanna programmet, kolla när den sparade senast, och starta på raden efter. Men det skulle vara schysst om jag automatiskt kunde ändra startvariabeln till raden efter senaste sparningen varje gång den sparar, så att jag helt enkelt bara behöver starta om scriptet nästa gång det stannar.

En lösning jag kan tänka på är att göra ett separat exceldokument där jag sparar en sådan variabel, och även om det rent tekniskt fungerar och är en väldigt enkel lösning så undrar jag ifall det finns något sätt som är lite mer integrerat i själva python.
SQL kanske är ett sätt, men det kräver ju avsevärt fler rader än typ 2-3 stycken med openpyxl. Fast det vore bra att få lite koll på det också.

Några förslag?
Citera
2022-06-09, 18:47
  #1998
Medlem
Citat:
Ursprungligen postat av Bonnatorp
Filurade på hur jag kan spara lite tid om jag skalar upp mitt webscrapingprojekt.

Ju nu läser jag av excelfiler och har variabler för var dokumentet ska börja iterera och var det ska sluta.
Jag har även lite kod som sparar dokumentet var 30:e rad, ifall något strular.
Eftersom det helt oundvikligen strular ibland så måste jag stanna programmet, kolla när den sparade senast, och starta på raden efter. Men det skulle vara schysst om jag automatiskt kunde ändra startvariabeln till raden efter senaste sparningen varje gång den sparar, så att jag helt enkelt bara behöver starta om scriptet nästa gång det stannar.

En lösning jag kan tänka på är att göra ett separat exceldokument där jag sparar en sådan variabel, och även om det rent tekniskt fungerar och är en väldigt enkel lösning så undrar jag ifall det finns något sätt som är lite mer integrerat i själva python.
SQL kanske är ett sätt, men det kräver ju avsevärt fler rader än typ 2-3 stycken med openpyxl. Fast det vore bra att få lite koll på det också.

Några förslag?

Det låter nog mer som att det nu börjar bli bättre att köra Pandas. Den läser in hela din excelfil på en gång in till en DataFrame som du kan göra vad du vill med. När den är inläst kan du spara den. En DataFrame är dessutom mer smidig att arbeta med när det gäller att behandla informationen.

Men då måste du nog tyvärr skriva om lite kod och det kanske du inte vill.

Men med nuvarande får du väl skriva över slutvariabeln varje rad och spara den. Sedan laddar du slutvariabeln varje gång du startar programmet.
Citera
2022-06-10, 19:29
  #1999
Medlem
FutureProofs avatar
Citat:
Ursprungligen postat av Bonnatorp
Filurade på hur jag kan spara lite tid om jag skalar upp mitt webscrapingprojekt.

Ju nu läser jag av excelfiler och har variabler för var dokumentet ska börja iterera och var det ska sluta.
Jag har även lite kod som sparar dokumentet var 30:e rad, ifall något strular.
Eftersom det helt oundvikligen strular ibland så måste jag stanna programmet, kolla när den sparade senast, och starta på raden efter. Men det skulle vara schysst om jag automatiskt kunde ändra startvariabeln till raden efter senaste sparningen varje gång den sparar, så att jag helt enkelt bara behöver starta om scriptet nästa gång det stannar.

En lösning jag kan tänka på är att göra ett separat exceldokument där jag sparar en sådan variabel, och även om det rent tekniskt fungerar och är en väldigt enkel lösning så undrar jag ifall det finns något sätt som är lite mer integrerat i själva python.
SQL kanske är ett sätt, men det kräver ju avsevärt fler rader än typ 2-3 stycken med openpyxl. Fast det vore bra att få lite koll på det också.

Några förslag?

Först bör du fråga dig själv: Varför lagrar du datan i Excel-blad?

Jag har erfarenhet av att behöva sammanställa datakällor i olika format, bland annat Excel, CSV, SQL och Feather. Det överlägset långsammast formatet för att läsa in data i minnet (för att sedan kunna göra vad du vill med det) är Excel. I och med att du skriver att det är ett webscraping-projekt så antar jag att det är du själv som scrapar datat, och har valt att spara det i Excel. Inget fel med det om man är i startgroparna, men att bara byta till CSV skulle göra att du kapar dina processtider dramatiskt.

Som tidigare skribent nämner så skulle jag också kollat på pandas. Pandas har fördefinierade funktioner för att läsa samtliga av de format som jag listade (ja, inkl. SQL).

Vill du lära dig SQL (vilket, precis som du säger, kan vara bra inför framtida projekt) så skulle jag råda dig att börja med SQLite. Det ger dig möjlighet att använda SQL utan att först behöva sätta upp en serverprocess, då du istället skriver data till en enkel fil.

Lycka till!
Citera
2022-06-10, 20:14
  #2000
Medlem
Bonnatorps avatar
Citat:
Ursprungligen postat av FutureProof
Först bör du fråga dig själv: Varför lagrar du datan i Excel-blad?

Jag har erfarenhet av att behöva sammanställa datakällor i olika format, bland annat Excel, CSV, SQL och Feather. Det överlägset långsammast formatet för att läsa in data i minnet (för att sedan kunna göra vad du vill med det) är Excel. I och med att du skriver att det är ett webscraping-projekt så antar jag att det är du själv som scrapar datat, och har valt att spara det i Excel. Inget fel med det om man är i startgroparna, men att bara byta till CSV skulle göra att du kapar dina processtider dramatiskt.

Som tidigare skribent nämner så skulle jag också kollat på pandas. Pandas har fördefinierade funktioner för att läsa samtliga av de format som jag listade (ja, inkl. SQL).

Vill du lära dig SQL (vilket, precis som du säger, kan vara bra inför framtida projekt) så skulle jag råda dig att börja med SQLite. Det ger dig möjlighet att använda SQL utan att först behöva sätta upp en serverprocess, då du istället skriver data till en enkel fil.

Lycka till!
Filerna jag jobbar mot är redan i XLSX-format, och det är att föredra om de fortsätter att vara i något lika brett format som kunden, som jobbar med telefonförsäljning och hanterar kunder i dokumentet, kan hantera med alla funktionerna i, så det är enklast att ta samma fil in som ut.

Sedan jobbar jag inte mot något API så att det går i ett dundrande tempo heller, det tar typ en och en halv timme att jobba genom 2000 rader p.g.a. laddtider på hemsidor, och att jag måste ha en liten aning sleep för att inte bli IP-blockad efter några enstaka requests.
Ja, jag använder roterande proxy, men av någon orsak så byts bara IP:n ut varje gång jag startar om selenium, och det tar en evighet om jag skulle göra det för varje rad i dokumentet. Så det ser ut som det gör.
Det är ändå sådana här saker som inte gör något om det tar tre dagar för dem att bli färdiga, så att ett dokument tar någon timme medans jag sitter och spelar gör ingenting.

Tiden det tar att hantera excelfilerna är extremt marginell mot allt annat som händer, annars hade jag sett över det tidigare.
Sparar inte i varje entry heller, för närvarande drar jag ner 30 rader data innan jag sparar filen, då jag ibland stöter på oväntade errors utan vidare förklaring. RAM-diskar projektet också, då det minskar spartiden en aning och inte sliter på SSD:n.
__________________
Senast redigerad av Bonnatorp 2022-06-10 kl. 20:17.
Citera
2022-06-10, 20:32
  #2001
Medlem
FutureProofs avatar
Citat:
Ursprungligen postat av Bonnatorp
Filerna jag jobbar mot är redan i XLSX-format, och det är att föredra om de fortsätter att vara i något lika brett format som kunden, som jobbar med telefonförsäljning och hanterar kunder i dokumentet, kan hantera med alla funktionerna i, så det är enklast att ta samma fil in som ut.

Sedan jobbar jag inte mot något API så att det går i ett dundrande tempo heller, det tar typ en och en halv timme att jobba genom 2000 rader p.g.a. laddtider på hemsidor, och att jag måste ha en liten aning sleep för att inte bli IP-blockad efter några enstaka requests.
Ja, jag använder roterande proxy, men av någon orsak så byts bara IP:n ut varje gång jag startar om selenium, och det tar en evighet om jag skulle göra det för varje rad i dokumentet. Så det ser ut som det gör.
Det är ändå sådana här saker som inte gör något om det tar tre dagar för dem att bli färdiga, så att ett dokument tar någon timme medans jag sitter och spelar gör ingenting.

Tiden det tar att hantera excelfilerna är extremt marginell mot allt annat som händer, annars hade jag sett över det tidigare.
Sparar inte i varje entry heller, för närvarande drar jag ner 30 rader data innan jag sparar filen, då jag ibland stöter på oväntade errors utan vidare förklaring. RAM-diskar projektet också, då det minskar spartiden en aning och inte sliter på SSD:n.
Ja, nu frågade du ju efter sätt som du kunde kapa tiderna, men visst.

Svårt att komma runt IP-blocken, men finns lite olika bibliotek (i Python) för att routa trafiken så som du vill. Beror dock lite på hur processen för att förnya IP:n hos din roterande proxy. Själv kan jag köra ungefär 10/requests i sekunden via selenium (mot hemsidor som tror att de är skyddade genom CloudFlare och därför inte använder sig av IP-banning baserat på request-frekvens).
Citera
2022-06-10, 20:38
  #2002
Medlem
Bonnatorps avatar
Citat:
Ursprungligen postat av FutureProof
Ja, nu frågade du ju efter sätt som du kunde kapa tiderna, men visst.

Svårt att komma runt IP-blocken, men finns lite olika bibliotek (i Python) för att routa trafiken så som du vill. Beror dock lite på hur processen för att förnya IP:n hos din roterande proxy. Själv kan jag köra ungefär 10/requests i sekunden via selenium (mot hemsidor som tror att de är skyddade genom CloudFlare och därför inte använder sig av IP-banning baserat på request-frekvens).
Jojo, men då menade jag tiderna som jag själv behövde sitta och knappa in saker manuellt jag menade.
Öka automatiseringen, helt enkelt.

Hinner du verkligen ladda en hel sida, dra ner datan, och ladda nästa sida på 100 millisekunder?
Citera
2022-06-10, 20:45
  #2003
Medlem
FutureProofs avatar
Citat:
Ursprungligen postat av Bonnatorp
Jojo, men då menade jag tiderna som jag själv behövde sitta och knappa in saker manuellt jag menade.
Öka automatiseringen, helt enkelt.

Hinner du verkligen ladda en hel sida, dra ner datan, och ladda nästa sida på 100 millisekunder?

Ja, och nej. Kör ofta 6 processer samtidigt, så varje "runda" tar runt en sekund.

Ett tips är att låta bli att ladda bilder på sidan, givet att du inte använder de. Kör du chrome som webdriver till selenium så lägger du till följande option:

Kod:
options.add_argument("--blink-settings=imagesEnabled=false")

Jag kör webdriver/selenium i headless, alltså att det inte öppnas upp något webbläsarfönster. Har ingen uppfattning kring om det påverkar prestandan, men tycker inte att det borde gå långsammare genom att köra så.
Citera
2022-06-10, 20:50
  #2004
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Bonnatorp
Filurade på hur jag kan spara lite tid om jag skalar upp mitt webscrapingprojekt.

Ju nu läser jag av excelfiler och har variabler för var dokumentet ska börja iterera och var det ska sluta.
Jag har även lite kod som sparar dokumentet var 30:e rad, ifall något strular.
Eftersom det helt oundvikligen strular ibland så måste jag stanna programmet, kolla när den sparade senast, och starta på raden efter. Men det skulle vara schysst om jag automatiskt kunde ändra startvariabeln till raden efter senaste sparningen varje gång den sparar, så att jag helt enkelt bara behöver starta om scriptet nästa gång det stannar.

En lösning jag kan tänka på är att göra ett separat exceldokument där jag sparar en sådan variabel, och även om det rent tekniskt fungerar och är en väldigt enkel lösning så undrar jag ifall det finns något sätt som är lite mer integrerat i själva python.
SQL kanske är ett sätt, men det kräver ju avsevärt fler rader än typ 2-3 stycken med openpyxl. Fast det vore bra att få lite koll på det också.

Några förslag?
Hmm.. som jag tolkar din fråga så vill du automatisera så att du manuellt slipper fylla i en startsiffra när ditt skript av olika orsaker måste startas om?

Ett blixtsnabbt sätt att spara variabeln (till skillnad från en separat excel-fil) är att spara den i en minimal textfil som skrivs över varje gång. Det räcker ju att spara den efter varje sparat Excel-dokument (alltså var 30:e rad). Sedan skapar du i början på skriptet en inläsning av filen (om den finns) som hämtar startraden (alltså i händelse av avbrott). Glöm inte att nollställa filen i slutet av skriptet, när scrapingen är färdig.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback