• 1
  • 2
2023-03-15, 21:57
  #13
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Kottkompott
Nä det är persondata.
Orsaken till att jag gav den länken är att det var ett exempel där sidan byter till företagsfliken automatiskt.
I senare inlägget med någon rik random person syns det att det är villaägare jag är ute efter.

Insåg dock att all HTML ligger inne oavsett vilken flik som är intryckt, så hade inte behövt den där click-funktionen.
Lätt att vara efterklok.

Har bara det sista dilemmat kvar, att veta huruvida det finns någon bostadsinfo alls eller ej innan selenium går vidare.
Har en ful lösning som sparar hela sidan i textformat och kollar om något ändrats alls med AJAX tre sekunder senare.
Inte jättesnyggt och är rätt så segt, plus att det är lite klurigt att veta hur segt internet användarna kommer ha så jag vet vilken sleep jag ska lägga in.

JavaScript är som sagt inte med på noterna när det är AJAX som uppdateras eftersom.

Kul att du är här iaf, har sett en del god input från dig i en pythontråd på ämnet.
Har du någon skarp URL till det API-anrop som du skriver om i TS?
Citera
2023-03-15, 22:11
  #14
Medlem
Kottkompotts avatar
Citat:
Ursprungligen postat av Enterprise
Har du någon skarp URL till det API-anrop som du skriver om i TS?
Yes, här är den.

https://www.ratsit.se/api/person/gra.../Nyk%C3%B6ping

Den har vissa likheter med hur URLen på resultatsidan ser ut, men det känns som att det kräver en hel del testande och felande innan det skulle vara helt täckt.
Citera
2023-03-15, 22:22
  #15
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Kottkompott
Yes, här är den.

https://www.ratsit.se/api/person/gra.../Nyk%C3%B6ping

Den har vissa likheter med hur URLen på resultatsidan ser ut, men det känns som att det kräver en hel del testande och felande innan det skulle vara helt täckt.
OK, denna URL fungerar att hämta data med utan något Selenium-anrop (i varje fall i liten skala, givet att man inte blir blockad)
Kod:
curl "https://www.ratsit.se/api/person/grannar/address/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs/Edeby%201/61191/Nyk%C3%B6ping"

Jag förstår inte riktigt vad problemet är. Om du har "scrapat" dessa URL-adresser så kan du hämta denna bostadsdata genom vanligt requests-anrop utan att använda Selenium-motorn. Jag kanske missförstår.
Citera
2023-03-15, 22:32
  #16
Medlem
Kottkompotts avatar
Citat:
Ursprungligen postat av Enterprise
OK, denna URL fungerar att hämta data med utan något Selenium-anrop (i varje fall i liten skala, givet att man inte blir blockad)
Kod:
curl "https://www.ratsit.se/api/person/grannar/address/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs/Edeby%201/61191/Nyk%C3%B6ping"

Jag förstår inte riktigt vad problemet är. Om du har "scrapat" dessa URL-adresser så kan du hämta denna bostadsdata genom vanligt requests-anrop utan att använda Selenium-motorn. Jag kanske missförstår.
Mjo, grejen är att jag har ett program som går genom adresser i en lista som finns.
Programmet ska pausa när en villaägare dyker upp, och användaren ska kunna kika runt på sidan själv efter vilken data som finns, ifall något extra råkar vara av intresse, istället för att jag kodar in att precis varje liten detalj ska kopieras över till konsolen eller dylikt.

Att personen bor i villa finns visserligen i det där API-anropet, men jag vet inte hur jag väntar på att den filen laddat färdigt.
För jag vill att hela den vanliga sidan ska synas, inte bara ett smalt band med bostadsinfo.

Grejen är då att jag måste veta om eventuell bostadsinfo laddat färdigt, eller om den inte finns med över huvud taget.
För det är den datapunkten som är central för hela konceptet.

Om den finns, då kan det vara värt att vänta uppåt 20 sekunder ifall någon användare har en katastrofal uppkoppling.
Men om den datan inte syns alls (d.v.s. om det i API-anropet står show: false eller något dylikt), då finns det ingen orsak att vänta så länge.

Alltså, jag kan ju se i devtools att det API-anropet finns med.
Kan jag kanske med selenium vänta på att ett API-anrop med en liten substräng från URLen har hämtats färdigt, och när den har blivit färdighämtad så får programmet avgöra om programmet ska stanna eller ej?

Förmodar att sidan visar infon från API-anropet exakt när det laddats färdigt, vet inte hur jag skulle kolla om det exakt är så.
Vet inte ens hur jag formellt kommer åt adressen till det anropet med selenium, som jag kan göra i chromes nätverksverktyg.

Ursäkta att jag är besvärlig, lite bekymmer hemma som tynger min själ bara.
__________________
Senast redigerad av Kottkompott 2023-03-15 kl. 22:35.
Citera
2023-03-15, 23:17
  #17
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Kottkompott
Mjo, grejen är att jag har ett program som går genom adresser i en lista som finns.
Programmet ska pausa när en villaägare dyker upp, och användaren ska kunna kika runt på sidan själv efter vilken data som finns, ifall något extra råkar vara av intresse, istället för att jag kodar in att precis varje liten detalj ska kopieras över till konsolen eller dylikt.

Att personen bor i villa finns visserligen i det där API-anropet, men jag vet inte hur jag väntar på att den filen laddat färdigt.
För jag vill att hela den vanliga sidan ska synas, inte bara ett smalt band med bostadsinfo.

Grejen är då att jag måste veta om eventuell bostadsinfo laddat färdigt, eller om den inte finns med över huvud taget.
För det är den datapunkten som är central för hela konceptet.

Om den finns, då kan det vara värt att vänta uppåt 20 sekunder ifall någon användare har en katastrofal uppkoppling.
Men om den datan inte syns alls (d.v.s. om det i API-anropet står show: false eller något dylikt), då finns det ingen orsak att vänta så länge.

Alltså, jag kan ju se i devtools att det API-anropet finns med.
Kan jag kanske med selenium vänta på att ett API-anrop med en liten substräng från URLen har hämtats färdigt, och när den har blivit färdighämtad så får programmet avgöra om programmet ska stanna eller ej?

Förmodar att sidan visar infon från API-anropet exakt när det laddats färdigt, vet inte hur jag skulle kolla om det exakt är så.
Vet inte ens hur jag formellt kommer åt adressen till det anropet med selenium, som jag kan göra i chromes nätverksverktyg.

Ursäkta att jag är besvärlig, lite bekymmer hemma som tynger min själ bara.
OK, jag förstår det som att URLen ska trollas fram genom Sid-källan till den HTML-fil som du scrapar från din lista.
Problemet är att man måste pussla ihop den, för den ligger inte uttryckligen i HTML-källan, men jag tror det går.

URL ska se ut så här:
Kod:
https://www.ratsit.se/api/person/grannar/address/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs/Edeby%201/61191/Nyk%C3%B6ping

Den första biten är ju statisk och samma varje gång alltså:
Kod:
https://www.ratsit.se/api/person/grannar/address/

Nästa bit som är alfanumeriskt (ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs) kan man också hitta i HTML-källan. Med Xpath kan man hitta elementet med:
Kod:
/html/head/meta[6]
Du erhåller då detta element:
Kod:
<meta property="og:url" content="https://www.ratsit.se/19470515-Melker_Yngve_Georg_Schorling_Nykoping/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs">
Från denna textsträng kan du använda regex eller annan kod för att få ut alla tecken efter sista /.
Du har då den första dynamiska biten till din URL.

Sedan kommer ett statiskt /.

Slutligen kommer nästa dynamiska bit i URL, vilket är en adress, nämligen:
Kod:
Edeby%201/61191/Nyk%C3%B6ping

Denna finns på ett ställe i HTML-koden, däremot försvinner den i browsern (det byts ut av JS-motorn förmodligen), så man får hämta detta från källan (inte från Selenium).
Leta efter följande element i källan så hittar du det:
Kod:
<v-villa-grannar name="Melkers" url="/api/person/grannar/address/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs/Edeby%201/61191/Nyk%C3%B6ping" pnr="19470515-XXXX" returnurl="https://www.ratsit.se/loggain?returnUrl=/19470515-Melker_Yngve_Georg_Schorling_Nykoping/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs"></v-villa-grannar>
Elementet som du söker efter i HTML-källan heter alltså "v-villa-grannar".
Så med dessa källor kan du pussla ihop URL.

Edit: Eh, du har ju förresten hela URL-en i v-villa-grannar-elementet. Bara att ta det oavkortat och lägga till https://www.ratsit.se innan (eftersom URL annars börjar på /api)

Jag menar alltså denna snutt:
Kod:
url="/api/person/grannar/address/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs/Edeby%201/61191/Nyk%C3%B6ping"
__________________
Senast redigerad av Enterprise 2023-03-15 kl. 23:22.
Citera
2023-03-16, 15:47
  #18
Medlem
Kottkompotts avatar
Citat:
Ursprungligen postat av Enterprise
OK, jag förstår det som att URLen ska trollas fram genom Sid-källan till den HTML-fil som du scrapar från din lista.
Problemet är att man måste pussla ihop den, för den ligger inte uttryckligen i HTML-källan, men jag tror det går.

URL ska se ut så här:
Kod:
https://www.ratsit.se/api/person/grannar/address/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs/Edeby%201/61191/Nyk%C3%B6ping

Den första biten är ju statisk och samma varje gång alltså:
Kod:
https://www.ratsit.se/api/person/grannar/address/

Nästa bit som är alfanumeriskt (ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs) kan man också hitta i HTML-källan. Med Xpath kan man hitta elementet med:
Kod:
/html/head/meta[6]
Du erhåller då detta element:
Kod:
<meta property="og:url" content="https://www.ratsit.se/19470515-Melker_Yngve_Georg_Schorling_Nykoping/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs">
Från denna textsträng kan du använda regex eller annan kod för att få ut alla tecken efter sista /.
Du har då den första dynamiska biten till din URL.

Sedan kommer ett statiskt /.

Slutligen kommer nästa dynamiska bit i URL, vilket är en adress, nämligen:
Kod:
Edeby%201/61191/Nyk%C3%B6ping

Denna finns på ett ställe i HTML-koden, däremot försvinner den i browsern (det byts ut av JS-motorn förmodligen), så man får hämta detta från källan (inte från Selenium).
Leta efter följande element i källan så hittar du det:
Kod:
<v-villa-grannar name="Melkers" url="/api/person/grannar/address/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs/Edeby%201/61191/Nyk%C3%B6ping" pnr="19470515-XXXX" returnurl="https://www.ratsit.se/loggain?returnUrl=/19470515-Melker_Yngve_Georg_Schorling_Nykoping/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs"></v-villa-grannar>
Elementet som du söker efter i HTML-källan heter alltså "v-villa-grannar".
Så med dessa källor kan du pussla ihop URL.

Edit: Eh, du har ju förresten hela URL-en i v-villa-grannar-elementet. Bara att ta det oavkortat och lägga till https://www.ratsit.se innan (eftersom URL annars börjar på /api)

Jag menar alltså denna snutt:
Kod:
url="/api/person/grannar/address/ciSJ0WCnF83-DITUOyiU2wI2XhKtPfyLfxFtp-eHBWs/Edeby%201/61191/Nyk%C3%B6ping"
Mja, det kan vara en dellösning till dilemmat.

Av det lilla jag undersökt hittills verkar det som att både villaägare och lantbruksägare har elementet <v-villa-grannar>.
Jag tror lägenhetsinnehavare hade något i stil med <v-trapphus-grannar>.
Däremot har även radhusägare elementet <v-villa-grannar>, och det är lite bekymmersamt då jag alltså inte kan använda bara förekomsten av det elementet i sig för att veta om programmet ska stanna eller ej.
Det funkade iallafall att lägga in bara det elementet i en xpath wait, då det dyker upp snabbt nog för att selenium ska hinna dra ut URLen inbäddad i elementet, ifall man skulle använda den.

Jag får laborera lite med att vänta om en av dessa element är närvarande (och kanske en eller två till, om det finns fler typer), och därefter kolla texten på själva sidan. Tror jag lägger in waitfunktionen jag fick av GPT-4 då den funkade excellent, och hoppas att elementet laddas fort nog efter att elementet dykt upp för att FindElement ska fungera, eller kanske en ordinarie wait på bara någon sekund.
Törs inte göra extraanrop till den faktiska länken, då dessa sidor av tidigare erfarenhet brukar kärva om man gör lite för mycket anrop till deras API:er utan att betala.

Stort tack för hjälpen iallafall, förstår om det var bökigt att hitta

Edit: Nä, rackarns.
Det går hitta elementet om man väntar på bara ett element, men det gick inte baka ihop med väntfunktionen för flera element...
__________________
Senast redigerad av Kottkompott 2023-03-16 kl. 16:46.
Citera
2023-03-16, 17:16
  #19
Medlem
Kottkompotts avatar
Det fick bli en lite mer specialsydd wait, är snabb när elementet väl hittas, men är förstås rätt slö ifall elementet helt enkelt aldrig dyker upp trots snabbt internet.
Verkar inte vara allt för många sidor som är så, det får eventuellt bli en sådan där grej som ordnas senare.

Kod:
// Waits for accomodation info to (maybe) have loaded
bool accElementFound = false;
DateTime endTime = DateTime.Now.AddSeconds(20);
while (DateTime.Now < endTime)
{
    try
    {
        // Check for the presence of the accomodation element
        IWebElement accElement = driver.FindElement(By.XPath("//*[@id=\"gtm-personrapport\"]/div/div[2]/div[19]/div[1]/div[1]/div/p[2]"));
        accElementFound = true;
        break;
    }
    catch (NoSuchElementException)
    {
        // The element was not found yet; continue waiting
    }

    // Wait for the check interval before trying again
    Thread.Sleep(TimeSpan.FromSeconds(0.5));
}

// Checks if accomodation info is present
if (accElementFound is false)     
{
    continue;
}
Citera
2023-03-16, 17:24
  #20
Medlem
friteradkorvs avatar
Jag skulle använda async och
CancellationTokenSource.
Googla så hittar du garanterat information.

Citat:
Ursprungligen postat av Kottkompott
Det fick bli en lite mer specialsydd wait, är snabb när elementet väl hittas, men är förstås rätt slö ifall elementet helt enkelt aldrig dyker upp trots snabbt internet.
Verkar inte vara allt för många sidor som är så, det får eventuellt bli en sådan där grej som ordnas senare.

Kod:
// Waits for accomodation info to (maybe) have loaded
bool accElementFound = false;
DateTime endTime = DateTime.Now.AddSeconds(20);
while (DateTime.Now < endTime)
{
    try
    {
        // Check for the presence of the accomodation element
        IWebElement accElement = driver.FindElement(By.XPath("//*[@id=\"gtm-personrapport\"]/div/div[2]/div[19]/div[1]/div[1]/div/p[2]"));
        accElementFound = true;
        break;
    }
    catch (NoSuchElementException)
    {
        // The element was not found yet; continue waiting
    }

    // Wait for the check interval before trying again
    Thread.Sleep(TimeSpan.FromSeconds(0.5));
}

// Checks if accomodation info is present
if (accElementFound is false)     
{
    continue;
}
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in