Diskutera Web scraping på Sweclockers?

Permalänk

Diskutera Web scraping på Sweclockers?

Tjo! Jag frågar först om det ens är tillåtet att diskutera web scraping då det kan vara ett mycket känsligt ämne. Du kan ju i princip hämta en webbplats HTML-renderade innehåll och sedan göra vad du vill med det samtidigt som du då kringgår saker som cookies, reklam, med mera.

Om det är tillåtet att diskutera så undrar jag egentligen bara hur jag - via JavaScript - kan hämta en webbplats HTML-text så att jag sedan kan göra vad jag nu vill göra med dess DOM via övrig JS-kod? Och går det att kanske till och med att göra med `fetch()` om dess konfigurerade `headers`-objekt får webbplatsen att tro att det är en vanlig webbläsare som genomför anropet och inte någon JS-kod?

Jag hade tänkt att läsa in/(GET-fetcha) enskilda produktsidor där jag sedan via DOM-manipulering läser ut ett specifikt pris som jag vet alltid finns inuti ett givet HTML-element. När jag kikar här: https://gomakethings.com/getting-html-with-fetch-in-vanilla-j... så verkar det vara så simpelt som `response.text()` men det låter ju nästan lite för bra för att vara sant?

Jag tänker mig att `User-Agent` är helt annorlunda när anrop görs inuti JS-skript än när det görs från en webbläsare när man skrivit in URL i adressfältet? Är det sedan `DOMParser`-objektet som ska användas för att konvertera erhållen `response.Text()` till kod som DOM-metoder kan användas på?

Om Web scraping får diskuteras för att komma igång med det så tackar jag för svar på förhand!

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"

Permalänk
Medlem

Web scrapping är i sig inte olagligt. Google sök gör det hela tiden. Varje site kan reglera scrapping om det ska vara tillåtet via robots.txt. sökmotorer som Google brukar respektera den filen.

När det gäller JavaScript sär finns det ett regelverk som alla webbläsare följer som heter CORS. Det tillåter inte JS att läsa av DOM/html objekt från andra domäner/webbplatser. Som siteägare kan du dock välja att lägga till undantag genom att lägga till CORS regler.

Det går att gå runt CORS t.ex med userscripts eller köra via en server med t.ex NodeJS då kan du scrapa så mycket data du vill på din egen maskin.

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

via DOM-manipulering läser ut ett specifikt pris som jag vet alltid finns inuti ett givet HTML-element.

Nej, du vet absolut ingenting om data som du inte själv kontrollerar till 100%. Du ska tvärtom betrakta sådan data som fientlig, speciellt i en situation som denna. Det finns hur många exempel som helst som på säkerhetsproblem som uppstår med den inställningen. Antag att priset sparas i en fil med namn från artikelnummret och artikelnumret plötsligt ändras till /etc/shadow och priset plötsligt är en sträng med ett giltigt användarnamn-lösenordshash-par.

Den andra aspekten är robusthet i koden, något som helt garanterat kommer bli aktuellt i samband med webbskrapning. HTML-sidors struktur ändras inte sällan, när någon klåfingrig webbutvecklare ska ”förbättra”. En webbskrapare bör ha validering och felhantering i varje steg så att det blir lätt att identifiera problemet när indata oundvikligen förändras.

Allt ovan gör webbskrapning till en lärorik övning, som ger kunskaper man har nytta av oavsett typ av extern data som ska behandlas (alltså kunskaper som är applicerbara på all form av systemintegration). Men för i helvete, använd aldrig webbskrapning som seriös integrationsmetod (jo, jag har sett det - på ett av Sveriges största och mest kända företag).

Själva tekniken är som du själv upptäckt relativt okomplicerad. Av ren självbevarelsedrift är det bra att skrapa ”snällt”, dvs minimera anropen, slumpa dem över (lång) tid och inte skrapa hela sajter.

Det finns naturligtvis en massa att diskutera kring upphovsrätt, exemplarframställning, verkshöjd, privatkopiering, fakta som inte kan upphovsrättsskyddas osv.

Permalänk
Skrivet av Meto:

Web scrapping är i sig inte olagligt. Google sök gör det hela tiden. Varje site kan reglera scrapping om det ska vara tillåtet via robots.txt. sökmotorer som Google brukar respektera den filen.

När det gäller JavaScript sär finns det ett regelverk som alla webbläsare följer som heter CORS. Det tillåter inte JS att läsa av DOM/html objekt från andra domäner/webbplatser. Som siteägare kan du dock välja att lägga till undantag genom att lägga till CORS regler.

Det går att gå runt CORS t.ex med userscripts eller köra via en server med t.ex NodeJS då kan du scrapa så mycket data du vill på din egen maskin.

Tack för svaret!

Jå, i efterhand kom jag att tänka på CORS. Det jag inte förstår då är vad skillnaden är att mata in URL i webbadressfältet och att köra från exempelvis "localhost"/"www.egenwebbplats.nu" där GET-fetch använder exakt samma URL? Med andra ord: vad är det för "domän" webbläsaren uppfattas som av webbplatsen som då inte ser det som ett CORS-problem?

Och hur kommer det sig att om jag kör en egen server i NodeJS, att jag då helt plötsligt får webbskrapa utan CORS-problem? Dessa detaljer förstår jag inte riktigt ännu!

Mvh,
WKL.

Skrivet av KAD:

Nej, du vet absolut ingenting om data som du inte själv kontrollerar till 100%. Du ska tvärtom betrakta sådan data som fientlig, speciellt i en situation som denna. Det finns hur många exempel som helst som på säkerhetsproblem som uppstår med den inställningen. Antag att priset sparas i en fil med namn från artikelnummret och artikelnumret plötsligt ändras till /etc/shadow och priset plötsligt är en sträng med ett giltigt användarnamn-lösenordshash-par.

Den andra aspekten är robusthet i koden, något som helt garanterat kommer bli aktuellt i samband med webbskrapning. HTML-sidors struktur ändras inte sällan, när någon klåfingrig webbutvecklare ska ”förbättra”. En webbskrapare bör ha validering och felhantering i varje steg så att det blir lätt att identifiera problemet när indata oundvikligen förändras.

Allt ovan gör webbskrapning till en lärorik övning, som ger kunskaper man har nytta av oavsett typ av extern data som ska behandlas (alltså kunskaper som är applicerbara på all form av systemintegration). Men för i helvete, använd aldrig webbskrapning som seriös integrationsmetod (jo, jag har sett det - på ett av Sveriges största och mest kända företag).

Själva tekniken är som du själv upptäckt relativt okomplicerad. Av ren självbevarelsedrift är det bra att skrapa ”snällt”, dvs minimera anropen, slumpa dem över (lång) tid och inte skrapa hela sajter.

Det finns naturligtvis en massa att diskutera kring upphovsrätt, exemplarframställning, verkshöjd, privatkopiering, fakta som inte kan upphovsrättsskyddas osv.

Tack för det mustiga svaret!

I min förfrågan utgick jag ifrån att jag först manuellt besöker en webbplats i webbläsaren och kollar igenom DOM via Inspect för att på ett ungefär veta vilket numerärt värde jag vill komma åt vid lyckad webbskraps-anrop. Jag utgick inte ifrån att bara hämta webbsidan utan någon insikt i DOM-strukturen. Självklart kan DOM fortfarande ha ändrats trots att jag manuellt visste innan vart priset ungefär låg.

Jag tänkte bara prova på för att få ytterligare insikter i hur webbläsare, servrar, och allt "under webb-motorhuven" fungerar. Det var en person i bekantskapen som undrade hur man kunde exempelvis skapa en notifierings-app som kollar om ett pris på en särskild produkt på Amazon har ändrats eller ej, lite av en nischad Pricerunner-funktionalitet.

Jag tänkte oxå på att om man ska göra sådana slags anrop så bör det ske slumpvis, utspritt, gärna på tider som anses "normala" från svenska IP-adresser och så vidare.

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"

Permalänk

Jag har kikat på några videos nu om web scraping och det verkar vara Puppeteer i NodeJS som gäller för enkelhetens skull. Med tanke på gråzonen med web scraping så är jag förbluffad över att det finns så tillgängligt "öppet i det fria". Mycket "fulkod" ligger väl på mörka webbens hemliga hörn?

Nu har jag inte lärt mig något som serverdelen inom NodeJS (Express, NestJS, m.fl.) så jag har ingen aning om hur jag ska få ut data till klienten efter att index.js-filen webbskrapat med Puppeteer. När andra året i min utbildning börjar nu i augusti så kommer vi igång med serverdelen i NodeJS, dock tror jag det blir PHP Laravel först. Då måste cURL användas istället? 🤔

Det jag tänker mig är att om jag kan få igång en simpel NodeJS-server som "lyssnar" (även om det bara är i localhost först) efter REST API-anrop så kör den sin Puppeteer-grej och skickar sedan tillbaka webbskrapad data som JSON-data vid sin 200-responskod? Då kan jag på klientsidan bara använda simpel GET-fetch vilket jag redan förstår mig på!

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"

Permalänk
Medlem

Scraping är som sagt inte ens gråzon, egentligen. Det är tekniskt sett inte någon skillnad på ett GET från din webbläsare och ett från ett script.
Sidorna du scrapar kan ju ha lite såna användarvillkor som kanske kan komma emellan, men det är nog mest ett problem om du gör en jäkla massa anrop och/eller faktiskt knycker datan och publicerar den under egen flagg.

Med det sagt låter din sista beskrivning nästan som att du vill göra typ en "proxy" där varje anrop till ditt REST-API resulterar i ett skrap på målsidan. Då låter det ju som att du a) återpublicerar deras data, vilket är fulspel och b) potentiellt skapar en massa trafik dom kan ha svårt att värja sig emot.

Se till att inte vem som helst kan anropa ditt API och se till att du inte gör fler anrop än nödvändigt. Är det data som uppdateras en gång om dagen behövs ju bara ett anrop om dagen (och ingen kommer notera dig och stänga ner dig eller förgifta datan).

Visa signatur

Brass knuckles and a 2x4

Permalänk
Medlem
Skrivet av Meto:

Det går att gå runt CORS t.ex med userscripts eller köra via en server med t.ex NodeJS då kan du scrapa så mycket data du vill på din egen maskin.

Exakt. CORS löser ju så vitt jag vet bara "problemet" med att man inte ska kunna lura en användares webbläsare att göra anrop till andra siter med hjälp av cookies/sessioner som finns i webbläsaren.

https://zemnmez.medium.com/if-cors-is-just-a-header-why-dont-...

Citat:

So why don’t attackers ignore the Access-Control-Allow-Origin header? Because it doesn’t get them anything. If I’m forming an HTTP request with CuRL, all the information I’m sending to the server is already known to me, and everything I’m accessing I already had access to. What the attacker really wants is for the victim’s browser to relinquish some of the information it has about the victim.

Ontopic:
Efter att jag använt scraping länge så kan jag säga att det absolut bästa numera när det är mycket SPA och mobiltelefon-Appar som körs är att se om datat man behöver råkar överföras via API-anrop.

Många webbsidor populerar ju sin data via api-anrop som oftast är ren JSON, och då är det enklare att bara ladda sidan man vill scrapa, kolla "developer tools -> Network" i webblösaren och helt sonika gräva efter om det inte är API-anrop som faktiskt laddar datat man vill åt.

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

Jag har kikat på några videos nu om web scraping och det verkar vara Puppeteer i NodeJS som gäller för enkelhetens skull. Med tanke på gråzonen med web scraping så är jag förbluffad över att det finns så tillgängligt "öppet i det fria". Mycket "fulkod" ligger väl på mörka webbens hemliga hörn?

Nu har jag inte lärt mig något som serverdelen inom NodeJS (Express, NestJS, m.fl.) så jag har ingen aning om hur jag ska få ut data till klienten efter att index.js-filen webbskrapat med Puppeteer. När andra året i min utbildning börjar nu i augusti så kommer vi igång med serverdelen i NodeJS, dock tror jag det blir PHP Laravel först. Då måste cURL användas istället? 🤔

Det jag tänker mig är att om jag kan få igång en simpel NodeJS-server som "lyssnar" (även om det bara är i localhost först) efter REST API-anrop så kör den sin Puppeteer-grej och skickar sedan tillbaka webbskrapad data som JSON-data vid sin 200-responskod? Då kan jag på klientsidan bara använda simpel GET-fetch vilket jag redan förstår mig på!

Mvh,
WKL.

Det är väl snarare en fråga om etik och moral istället för "lagligt" eller ej. Du utnyttjar en webbsidas resurser genom metoder som eventuellt belastar sajten i onödan. Dessa ser hellre att du använder (om befintliga) API:er som endast ger dig det du frågar efter, istället för att servera en hel fil med diverse annat skräp.

Att det finns mycket info om både det ena och det andra ute på nätet är väl knappast en nyhet för någon

Men som svar på hanteringen av all data;
Din Node-server är din "bot" och crawlar runt på den site du är ute efter. Node-servern går igenom svaret och lagrar detta i t.ex. en databas, JSON-fil, CSV eller whatever you'd like. Du skapar ett REST-api som returnerar detta data via exempelvis GET.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem
Skrivet av Pamudas:

Det är väl snarare en fråga om etik och moral istället för "lagligt" eller ej. Du utnyttjar en webbsidas resurser genom metoder som eventuellt belastar sajten i onödan. Dessa ser hellre att du använder (om befintliga) API:er som endast ger dig det du frågar efter, istället för att servera en hel fil med diverse annat skräp.

Mjo, och då kan man ju argumentera att det inte borde vara några större problem så länge man sköter det snyggt. Beror lite på use-case. Räcker det med 1 poll per dygn så är ju skillnaden nära noll mot att ha en tabb uppe i mobilen som man manuellt refreshar en gång om dygnet...

Men om man istället scrapar varenda produkt på hemsidan... eller pollar flera gånger i minuten.. då är det ju ett annat läge.
Sen beror det ju även på vilken aktör det är. Finns ju dom där 10000 requests i sekunden är försumbart ändå.

Men som sagt... beror ju på vad man är ute efter att göra.

Permalänk
Medlem
Skrivet av BasseBaba:

Mjo, och då kan man ju argumentera att det inte borde vara några större problem så länge man sköter det snyggt. Beror lite på use-case. Räcker det med 1 poll per dygn så är ju skillnaden nära noll mot att ha en tabb uppe i mobilen som man manuellt refreshar en gång om dygnet...

Men om man istället scrapar varenda produkt på hemsidan... eller pollar flera gånger i minuten.. då är det ju ett annat läge.
Sen beror det ju även på vilken aktör det är. Finns ju dom där 10000 requests i sekunden är försumbart ändå.

Men som sagt... beror ju på vad man är ute efter att göra.

Exakt så

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Skrivet av Pamudas:

Det är väl snarare en fråga om etik och moral istället för "lagligt" eller ej. Du utnyttjar en webbsidas resurser genom metoder som eventuellt belastar sajten i onödan. Dessa ser hellre att du använder (om befintliga) API:er som endast ger dig det du frågar efter, istället för att servera en hel fil med diverse annat skräp.

Att det finns mycket info om både det ena och det andra ute på nätet är väl knappast en nyhet för någon

Men som svar på hanteringen av all data;
Din Node-server är din "bot" och crawlar runt på den site du är ute efter. Node-servern går igenom svaret och lagrar detta i t.ex. en databas, JSON-fil, CSV eller whatever you'd like. Du skapar ett REST-api som returnerar detta data via exempelvis GET.

Gällande NodeJS så måste jag lista ut hur jag på motsvarande sätt i den "lyssnande" servern skickar tillbaka JSON-data likt `echo json_encode($scrapData);` i PHP-varianten av ett REST API. Jag vet alltså inte hur jag skickar en 200-responskod med JSON-inbakat i responsen då jag inte pysslat med JS-baserade webbservrar ännu!

Detta StackOverflow-svar är förvisso 9 år gammalt: https://stackoverflow.com/questions/19696240/proper-way-to-re... Men det verkar nämna något om att `res.json(scrapData)`; bör kunna räcka där då JSON-omvandlad data lagras i `scrapData`. Eller har svarens utgångsdatum utgått?

Kikar jag här: https://www.geeksforgeeks.org/how-to-return-json-using-node-j... så verkar det räcka med res.json(); efter att man installerat Express-paketet:

// Requiring express in our server const express = require('express'); const app = express(); // Defining get request at '/' route app.get('/', function(req, res) { // PERFORM PUPPETEER MAGIC BELOW HERE // THEN RETURN STORED JSON DATA res.json(scrapData); // Line above should be wrapped inside of the Puppeteer async function?? 🤔 }); // Setting the server to listen at port 3000 app.listen(3000, function(req, res) { console.log("Server is running at port 3000"); });

Och då ska jag alltså bara anropa localhost:3000 med ett simpelt GET-fetch på klientsidan?

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

Gällande NodeJS så måste jag lista ut hur jag på motsvarande sätt i den "lyssnande" servern skickar tillbaka JSON-data likt `echo json_encode($scrapData);` i PHP-varianten av ett REST API. Jag vet alltså inte hur jag skickar en 200-responskod med JSON-inbakat i responsen då jag inte pysslat med JS-baserade webbservrar ännu!

Detta StackOverflow-svar är förvisso 9 år gammalt: https://stackoverflow.com/questions/19696240/proper-way-to-re... Men det verkar nämna något om att `res.json(scrapData)`; bör kunna räcka där då JSON-omvandlad data lagras i `scrapData`. Eller har svarens utgångsdatum utgått?

Kikar jag här: https://www.geeksforgeeks.org/how-to-return-json-using-node-j... så verkar det räcka med res.json(); efter att man installerat Express-paketet:

// Requiring express in our server const express = require('express'); const app = express(); // Defining get request at '/' route app.get('/', function(req, res) { // PERFORM PUPPETEER MAGIC BELOW HERE // THEN RETURN STORED JSON DATA res.json(scrapData); // Line above should be wrapped inside of the Puppeteer async function?? 🤔 }); // Setting the server to listen at port 3000 app.listen(3000, function(req, res) { console.log("Server is running at port 3000"); });

Och då ska jag alltså bara anropa localhost:3000 med ett simpelt GET-fetch på klientsidan?

Mvh,
WKL.

Du scannar inte på begäran av din webbklient, du scannar i bakgrunden på något intervall och lagrar detta. När du sedan anropar ditt REST-api så finns detta data lagrat lokalt i någon databas eller liknande, och serverar bara detta som vilken annan data som helst.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

Gällande NodeJS så måste jag lista ut hur jag på motsvarande sätt i den "lyssnande" servern skickar tillbaka JSON-data likt `echo json_encode($scrapData);` i PHP-varianten av ett REST API. Jag vet alltså inte hur jag skickar en 200-responskod med JSON-inbakat i responsen då jag inte pysslat med JS-baserade webbservrar ännu!

Detta StackOverflow-svar är förvisso 9 år gammalt: https://stackoverflow.com/questions/19696240/proper-way-to-re... Men det verkar nämna något om att `res.json(scrapData)`; bör kunna räcka där då JSON-omvandlad data lagras i `scrapData`. Eller har svarens utgångsdatum utgått?

Kikar jag här: https://www.geeksforgeeks.org/how-to-return-json-using-node-j... så verkar det räcka med res.json(); efter att man installerat Express-paketet:

// Requiring express in our server const express = require('express'); const app = express(); // Defining get request at '/' route app.get('/', function(req, res) { // PERFORM PUPPETEER MAGIC BELOW HERE // THEN RETURN STORED JSON DATA res.json(scrapData); // Line above should be wrapped inside of the Puppeteer async function?? 🤔 }); // Setting the server to listen at port 3000 app.listen(3000, function(req, res) { console.log("Server is running at port 3000"); });

Och då ska jag alltså bara anropa localhost:3000 med ett simpelt GET-fetch på klientsidan?

Mvh,
WKL.

Jag kanske missförstår något centralt nu, men det finns mängder av mjukvaror som är byggda för scraping.

Jag jobbar ju främst med C# och har kört bl a denna:
https://html-agility-pack.net/

Och då finns ju redan inbyggda metoder för att göra det mesta man vill, se t ex:
https://html-agility-pack.net/descendants#public-ienumerable-...
https://html-agility-pack.net/element

Följande kod:

var url = "https://www.sweclockers.com//"; var web = new HtmlWeb(); var htmlDoc = web.Load(url); var node = htmlDoc.DocumentNode.SelectSingleNode("//body"); foreach (var nNode in node.Descendants("h2")) { if (nNode.NodeType == HtmlNodeType.Element) { Console.WriteLine(nNode.Name + ":" + nNode.InnerText); } }

Ger denna output:

Citat:

h2:Xbox Series-konsolerna säljer betydligt sämre än Playstation 5
h2:Meta ska fylla Twitters tomrum med Threads
h2:Windows-uppdateringar kan sänka SSD-prestanda
h2:Snabbtest: PCI Express 4.0 mot PCI Express 3.0 med Geforce RTX 4060
h2:Windows 12 kan få svävande aktivitetsfält
h2:Ubisoft hissar seglen – Assassin's Creed: Black Flag aktuell för remake
h2:Nothing: "Telefoner var bättre förr"
h2:IMY: "Svenska bolag måste sluta använda Google Analytics"
h2:Snabbkoll: Har du fler än en lagringsenhet i din dator?
h2:Geforce GTX 1650 fortsatt i topp för Steam-användare
h2:Test: Gigabyte M28U – prisvärd och kompetent bildskärm med 4K UHD och 144 Hz
h2:Strömkontakten 12VHPWR utdömd – ersätts med "12V-2x6"
h2:AI designade processor – ”första steget mot självförbättrande maskiner”
h2:AMD missar egen deadline för optimeringsfunktionen HYPR-RX
h2:Är lösenordshanteraren Proton Pass något att satsa på?
h2:Quiz: Kan du gissa spelmusiken?
h2:Asus föreslår grafikkort med SSD-platser
h2:Helgsnack: Vilken teknik följer med på semestern?
h2:Valve nobbar spel med AI-genererat innehåll på Steam
h2:Twitter stryper antalet inlägg användare kan läsa
h2:Asus fortsätter med maxad Zenfone för enhandsanvändare
h2:AMD avtäcker Ryzen 5 5600X3D – sex kärnor och staplad cache
h2:Krönika: Är det roligare att fylla spelbiblioteket än att spela?
h2:Stilfulla hörnor belönas med Fractal Designs Mini ITX-chassi Terra
h2:Test: MSI Geforce RTX 4060 Ventus 2X OC – bra prestanda vid 1080p men medioker kylare
h2:Obefintlig försäljning bekräftar svalt intresse för Geforce RTX 4060
h2:Micron släpper GDDR7-minne tidigt år 2024
h2:Nvidia skruvar upp priset på Geforce RTX 4000-serien i Sverige
h2:SSD eller HDD – vad är bäst att lagra på år 2023?
h2:Valve drar igång sommarrea – lägre pris på Steam Deck
h2:Meta ska konkurrera med App Store och Play-butiken i EU
h2:Youtube testar aggressiv taktik mot annonsblockerare
h2:En väska kommer lastad med RGB
h2:Nu kan du testa Copilot och andra nyheter i Windows 11
h2:Endast en av fem svenskar använder VPN-tjänst
h2:Enkortsdatorn Arduino Uno uppdateras – ARM-krets och Wifi
h2:Priskoll: Få Geforce RTX 4060 under 4 000 kronor i Sverige
h2:Paypal vill ersätta lösenord med passkeys
h2:Intel Arc får prestandalyft på 300 procent i Assassin's Creed: Unity
h2:Inet frågar SweClockers: Vad skulle du vilja förbättra på Inet.se?
h2:Sony läcker uppgifter i rättegång – så stort är Call of Duty
h2:Nvidia: "Energieffektiva RTX 4060 sparar hundralappar"
h2:Veckans fråga: Vilket operativsystem föredrar du?
h2:Bilar med smarta inslag ger fler dumma fel
h2:Krönika: Teknikutvecklingen avstannar – men det gör också uppgraderingsbehovet
h2:Noctua släpper monteringsram för "deliddade" Ryzen 7000-processorer
h2:Nvidias nästa arkitektur för Geforce kommer år 2025
h2:Microsoft vill strömma Windows från molnet
h2:Starfield utvecklas med AMD:s välsignelse
h2:Vilket är ditt dyraste datormisstag?

Permalänk
Skrivet av BasseBaba:

Exakt. CORS löser ju så vitt jag vet bara "problemet" med att man inte ska kunna lura en användares webbläsare att göra anrop till andra siter med hjälp av cookies/sessioner som finns i webbläsaren.

https://zemnmez.medium.com/if-cors-is-just-a-header-why-dont-...

Ontopic:
Efter att jag använt scraping länge så kan jag säga att det absolut bästa numera när det är mycket SPA och mobiltelefon-Appar som körs är att se om datat man behöver råkar överföras via API-anrop.

Många webbsidor populerar ju sin data via api-anrop som oftast är ren JSON, och då är det enklare att bara ladda sidan man vill scrapa, kolla "developer tools -> Network" i webblösaren och helt sonika gräva efter om det inte är API-anrop som faktiskt laddar datat man vill åt.

Om jag då upptäcker i Network att en av inladdade resurserna är en JSON-fil som innehåller data som jag vill använda mig av så kan jag ju dock inte göra samma API-anrop med samma parametrar för den lär väl ha striktare kontroll än enbart API-token? Jag tänker att API:t kontrollerar liknande CORS här. Kan man däremot exempelvis med Puppeteer läsa in sidan i "den simulerade webbläsaren" och då ta en kopia av den inladdade JSON-filen och sedan hantera den?

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

Om jag då upptäcker i Network att en av inladdade resurserna är en JSON-fil som innehåller data som jag vill använda mig av så kan jag ju dock inte göra samma API-anrop med samma parametrar för den lär väl ha striktare kontroll än enbart API-token? Jag tänker att API:t kontrollerar liknande CORS här. Kan man däremot exempelvis med Puppeteer läsa in sidan i "den simulerade webbläsaren" och då ta en kopia av den inladdade JSON-filen och sedan hantera den?

Mvh,
WKL.

Nej, det är inte ett problem. CORS är ett system för att tillåta anrop som blockas av single-origin policyn. Läs på i länken nedan samt mitt förra inlägg. Det är komplicerat.

Det finns mekanismer som gör att en site A inte ska kunna ansluta och begära ut information från site B.
Men numera med SPA och API.er så har man hamnat i ett läge där man måste kunna göra det.
Säg att du har en SPA som laddas på foobar.com och sen har du ett api på api-foobar.com.
Då måste du låta foobar.com göra anrop till api-foobar.com för att få ut data från api:t.
Detta blockades traditionellt i webläsarna för att skydda användarna, och då tillkom CORS för att göra sådan kommunikation möjlig.

Dvs så kan du konfigurera api-foobar.com som så att den ska tillåta anrop från foobar.com.
Webläsaren kommer då acceptera detta, och låta din SPA som körs från foobar.com ansluta till api-foobar.com.

Men detta är som sagt inget som API/backend har kontroll över. Som du ser nedan så kan du i CURL sätta vilken ORIGIN du vill.
Men det hjälper ju inte en attacker som vill ta någons cookie från Chrome.
-----

Har du själv kontroll på hela kedjan och går mot antingen ett öppet API eller ett API dit du har credentials så är det inga problem.
Se t ex
https://reqbin.com/req/c-taimahsa/curl-cors-request

Annars rekommenderar jag https://www.postman.com/ för att laborera med API:er.

Permalänk
Skrivet av BasseBaba:

Jag kanske missförstår något centralt nu, men det finns mängder av mjukvaror som är byggda för scraping.

Jag jobbar ju främst med C# och har kört bl a denna:
https://html-agility-pack.net/

Och då finns ju redan inbyggda metoder för att göra det mesta man vill, se t ex:
https://html-agility-pack.net/descendants#public-ienumerable-...
https://html-agility-pack.net/element

Följande kod:

var url = "https://www.sweclockers.com//"; var web = new HtmlWeb(); var htmlDoc = web.Load(url); var node = htmlDoc.DocumentNode.SelectSingleNode("//body"); foreach (var nNode in node.Descendants("h2")) { if (nNode.NodeType == HtmlNodeType.Element) { Console.WriteLine(nNode.Name + ":" + nNode.InnerText); } }

Ger denna output:

Oj, webbskrapade du nyss Sweclockers utan att inkludera reklamen?!

Jag ska lära mig C# nu till höstterminen så ovanstående kod är alltså C#-kod och INTE JS-kod med icke-rekommenderade var-termen?

Finns det JS-baserad HTML Agility-paket eller är det endast i C#? Eller det kanske är Puppeteer som gäller om man vill köra det hela inom JS-språket tänker jag?

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

Oj, webbskrapade du nyss Sweclockers utan att inkludera reklamen?!

Haha! <only for educational purposes>
Hoppas du kommer framåt iaf!

Permalänk
Medlem

@WebbkodsLärlingen

Ett tips är att spara undan hela resultatet av ett request du gjort (som ska scrapas). Publicera sedan materialet som en sida i din utvecklingsmiljö så kan du anropa den sidan från dina script hur många gånger som helst. Allt sker ju liksom bara i din miljö. Då kan du i lugn och ro leka med olika sätt att hämta ut data från olika element på sidan.

Visa signatur

Windows 11 Pro | Intel i7 8700 | ASUS Prime Z370-P | Corsair 16GB 3000MHz | ASUS GTX 1080 | Fractal Design Define S | Corsair RM750x | Hyper 212 EVO

Permalänk
Medlem

Glöm inte att testa med "visa sidkälla" i webbläsaren, då kommer du se den faktiska html som du får via ett GET androp. I många fall är den mycket mer tom än man antar då väldigt många sidor idag bygga upp i stort sett helt och hållet via javascript. I så fall behöver du börja titta på de api-anrip sidan själv gör och se om du kan använda dessa till att hämta data istället (som nämnts tidigare).

Visa signatur

Intel Core i7 6700K | Gigabyte Z170X-UD3 | Corsair Vengeance LPX 16GB DDR4 2400Mhz | EVGA GTX 980Ti Hybrid | Samsung 950 PRO 256GB | Noctua NH-D15 | EVGA G2 750 | Fractal Design Define R5

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

Gällande NodeJS så måste jag lista ut hur jag på motsvarande sätt i den "lyssnande" servern skickar tillbaka JSON-data likt `echo json_encode($scrapData);` i PHP-varianten av ett REST API. Jag vet alltså inte hur jag skickar en 200-responskod med JSON-inbakat i responsen då jag inte pysslat med JS-baserade webbservrar ännu!

Detta StackOverflow-svar är förvisso 9 år gammalt: https://stackoverflow.com/questions/19696240/proper-way-to-re... Men det verkar nämna något om att `res.json(scrapData)`; bör kunna räcka där då JSON-omvandlad data lagras i `scrapData`. Eller har svarens utgångsdatum utgått?

Kikar jag här: https://www.geeksforgeeks.org/how-to-return-json-using-node-j... så verkar det räcka med res.json(); efter att man installerat Express-paketet:

// Requiring express in our server const express = require('express'); const app = express(); // Defining get request at '/' route app.get('/', function(req, res) { // PERFORM PUPPETEER MAGIC BELOW HERE // THEN RETURN STORED JSON DATA res.json(scrapData); // Line above should be wrapped inside of the Puppeteer async function?? 🤔 }); // Setting the server to listen at port 3000 app.listen(3000, function(req, res) { console.log("Server is running at port 3000"); });

Och då ska jag alltså bara anropa localhost:3000 med ett simpelt GET-fetch på klientsidan?

Mvh,
WKL.

Enkel webbserver i node:
Installera express (npm i express)

import express from 'express'; const app = express(); app.listen(5000, () => console.log('Server running')); app.get('/', (req, res) => { return res.json({ name: 'Bob' }); })

Permalänk
Skrivet av ChrisDev:

Enkel webbserver i node:
Installera express (npm i express)

import express from 'express'; const app = express(); app.listen(5000, () => console.log('Server running')); app.get('/', (req, res) => { return res.json({ name: 'Bob' }); })

Tack för startkoden!

Hur deployar/sjösätter man vanligen NodeJS-baserade JS-servrar? Jag tänkte investera i Inleed snart och i deras "Guider" (https://login.inleed.net/helpcenter/376/skapa-en-nodejs-appli...) så verkar det gå att skapa en NodeJS-applikation:

Men jag har ingen aning om det faktiskt innebär att jag kan ha så att när man då besöker webb"Application URL" så körs den endast vid besök likt PHP-kod?

Jag vill ju att den alltid ska vara i "Listening on PORT X - Server running..."-läge så att den kan sköta sina intervallanrop i sitt webbskrapande.

Tolkar jag rätt att Vercel erbjuder NodeJS-baserade JS-serverkod att kunna köras 24/7 så att den kan sköta automatiskt webbskrapande istället för att bara köras vid anrop som med PHP-kod?

Detta är en liten detalj som jag inte greppat ännu inom Webbutveckling: sjösättning av färdiga webbplatser med olika slags serverkonfigurationer och allt som det innebär i praktiken!

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

Tack för startkoden!

Hur deployar/sjösätter man vanligen NodeJS-baserade JS-servrar? Jag tänkte investera i Inleed snart och i deras "Guider" (https://login.inleed.net/helpcenter/376/skapa-en-nodejs-appli...) så verkar det gå att skapa en NodeJS-applikation:
<Uppladdad bildlänk>

Men jag har ingen aning om det faktiskt innebär att jag kan ha så att när man då besöker webb"Application URL" så körs den endast vid besök likt PHP-kod?

Jag vill ju att den alltid ska vara i "Listening on PORT X - Server running..."-läge så att den kan sköta sina intervallanrop i sitt webbskrapande.

Tolkar jag rätt att Vercel erbjuder NodeJS-baserade JS-serverkod att kunna köras 24/7 så att den kan sköta automatiskt webbskrapande istället för att bara köras vid anrop som med PHP-kod?

Detta är en liten detalj som jag inte greppat ännu inom Webbutveckling: sjösättning av färdiga webbplatser med olika slags serverkonfigurationer och allt som det innebär i praktiken!

Mvh,
WKL.

Labba lite lokalt så förstår du hur det fungerar istället för att hoppa på en webbhost det första du gör

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem

Ett problem som jag stötte på när jag skulle scrapea lunchmenyn på jobbet är det faktum att det skiljer sig mellan statiska och dynamiska sidor. ex BeautifulSoup som jag använde (då jag ville köra det som ett python script) hade ej support för dynamiska sidor by default utan du var tvungen att se till att rendera sidan först.

Verkar som många andra verktyg sköter detta automatiskt men alltid något att hai åtanke.

Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl

Permalänk
Skrivet av Pamudas:

Labba lite lokalt så förstår du hur det fungerar istället för att hoppa på en webbhost det första du gör

Ursäkta om jag är påstridig nu!

Om jag skapar server.js i VSCode med följande startkod och sedan kör `node server.js` i terminalen så startas en server som kommer att skriva ut Hello World! i klienten om jag besöker localhost:8080:

var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.end('Hello World!'); }).listen(8080);

Och jag känner till att console.log() som körs i NodeJS inte skriver ut något i klientens konsol utan endast på serversidans konsol.

Samtidigt skulle jag kunna ha asynkron kod med exempelvis setTimeout som inom särskilda intervaller kör Puppeteer-kod för att webbskrapa. Men så fort jag stänger ned VSCode så har jag också stängt ned "VSCode-drivna NodeJS-servern". Jag vill ju ha igång den som om den var igång i VSCode dygnet runt så den kan sköta både CRUD-anrop såväl som asynkron kod i bakgrunden.

Det jag undrar är vad motsvarande servermiljön där samma server.js-fil är igång dygnet runt ser ut hos typiska webbleverantörer. Jag undrar om jag nästan skulle behöva en egen dedikerad server som då är igång dygnet runt där jag då kan initiera och på liknande vis köra igång `node server.js`?

Liknande har jag funderat kring MySQL-databaser där jag inte vet hur jag skulle sjösätta en SQL-server (utöver klassiska XAMPP) som faktiskt "lever ett liv" utöver CRUD-anrop. Exempelvis skulle databasen kunna säkerhetskopiera sig själv under nattetid och då måste den såklart vara igång dygnet runt så den har koll på klockan, alternativt något annat som är igång som startar igång servern vid rätt tid.

Jag har ingen aning om hur sådant här sjösätts i praktiken och jag tvekar på att distansutbildningen jag går kommer att ge konkreta svar på detta. Det känns nästan som om det är "Branschhemligheter" som man förväntas veta innan man ens fått sin första provanställning och/eller praktikplats!

Dessa är detaljfrågor som jag inte hittar något tillräckligt svar på när jag googlar och det gör mig smått frustrerad.

Webbhosting kommer jag att investera i inom kort för jag behöver det inför nästa läsår i Webbutvecklingsprogramutbildningen då jag fått nog på studentservern som tar 2 minuter att ansluta till varje gång och som disconnectar en om man varit inaktiv i knappa 15 sekunder och så tar det samma tid igen att återansluta. Samma webbhosting kommer jag nog också nyttja för den kommande nätbaserade verksamheten!

Jag vill bara helt enkelt veta allt det minimala man behöver veta i alla steg i Webbutvecklingsprocessen, vilket jag inte gör ännu men kommer att göra inom tid. Ingen behöver ge mig svaren utan jag har full förståelse att jag måste lära mig allt på egen hand. Det är bara smått frustrerande att vissa saker inte verkar finnas lättfunna svar på än så länge!

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"

Permalänk
Skrivet av Pelegrino:

Ett problem som jag stötte på när jag skulle scrapea lunchmenyn på jobbet är det faktum att det skiljer sig mellan statiska och dynamiska sidor. ex BeautifulSoup som jag använde (då jag ville köra det som ett python script) hade ej support för dynamiska sidor by default utan du var tvungen att se till att rendera sidan först.

Verkar som många andra verktyg sköter detta automatiskt men alltid något att hai åtanke.

Om jag förstått rätt så erbjuder Puppeteer förmågan att kunna läsa in webbsidor som om den renderat först DOM och sedan renderat ut ytterligare genom att kört JS-skripten som finns på webbplatsen ifråga?

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('Hello World!');
}).listen(8080);
[/code]

antar det är ett stavfel men det ska vara res.send() Du behöver inte heller lägga till header.

Skrivet av WebbkodsLärlingen:

Om jag förstått rätt så erbjuder Puppeteer förmågan att kunna läsa in webbsidor som om den renderat först DOM och sedan renderat ut ytterligare genom att kört JS-skripten som finns på webbplatsen ifråga?

Mvh,
WKL.

Mycket möjligt, känner ej till Puppeteer.

Gällande ditt fråga kring etik tidigare så kan man ju påpeka att ex SweC har en robots.txt fil med följande innehåll:

Citat:

User-agent: *
Allow: /

User-agent: Googlebot-News
Allow: /$
Allow: /nyhet
Allow: /arkiv/typ/nyhet
Allow: /sitemap/news
Disallow: /

User-agent: magpie-crawler
Disallow: /

sitemap: https://www.sweclockers.com/sitemap

Intressant att Google får bara röra vissa delar, magpie inga alls och resterande vad de vill (såvida jag inte missförstår).

Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

Ursäkta om jag är påstridig nu!

Om jag skapar server.js i VSCode med följande startkod och sedan kör `node server.js` i terminalen så startas en server som kommer att skriva ut Hello World! i klienten om jag besöker localhost:8080:

var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.end('Hello World!'); }).listen(8080);

Och jag känner till att console.log() som körs i NodeJS inte skriver ut något i klientens konsol utan endast på serversidans konsol.

Samtidigt skulle jag kunna ha asynkron kod med exempelvis setTimeout som inom särskilda intervaller kör Puppeteer-kod för att webbskrapa. Men så fort jag stänger ned VSCode så har jag också stängt ned "VSCode-drivna NodeJS-servern". Jag vill ju ha igång den som om den var igång i VSCode dygnet runt så den kan sköta både CRUD-anrop såväl som asynkron kod i bakgrunden.

Det jag undrar är vad motsvarande servermiljön där samma server.js-fil är igång dygnet runt ser ut hos typiska webbleverantörer. Jag undrar om jag nästan skulle behöva en egen dedikerad server som då är igång dygnet runt där jag då kan initiera och på liknande vis köra igång `node server.js`?

Liknande har jag funderat kring MySQL-databaser där jag inte vet hur jag skulle sjösätta en SQL-server (utöver klassiska XAMPP) som faktiskt "lever ett liv" utöver CRUD-anrop. Exempelvis skulle databasen kunna säkerhetskopiera sig själv under nattetid och då måste den såklart vara igång dygnet runt så den har koll på klockan, alternativt något annat som är igång som startar igång servern vid rätt tid.

Jag har ingen aning om hur sådant här sjösätts i praktiken och jag tvekar på att distansutbildningen jag går kommer att ge konkreta svar på detta. Det känns nästan som om det är "Branschhemligheter" som man förväntas veta innan man ens fått sin första provanställning och/eller praktikplats!

Dessa är detaljfrågor som jag inte hittar något tillräckligt svar på när jag googlar och det gör mig smått frustrerad.

Webbhosting kommer jag att investera i inom kort för jag behöver det inför nästa läsår i Webbutvecklingsprogramutbildningen då jag fått nog på studentservern som tar 2 minuter att ansluta till varje gång och som disconnectar en om man varit inaktiv i knappa 15 sekunder och så tar det samma tid igen att återansluta. Samma webbhosting kommer jag nog också nyttja för den kommande nätbaserade verksamheten!

Jag vill bara helt enkelt veta allt det minimala man behöver veta i alla steg i Webbutvecklingsprocessen, vilket jag inte gör ännu men kommer att göra inom tid. Ingen behöver ge mig svaren utan jag har full förståelse att jag måste lära mig allt på egen hand. Det är bara smått frustrerande att vissa saker inte verkar finnas lättfunna svar på än så länge!

Mvh,
WKL.

VSCode gör inget magiskt. Den öppnar en terminal som Node-servern lever i. Stänger du ner VSCode så stängs även terminalen ner - vilket då dödar Node-servern. Starta manuellt i en egen process så kommer den vara igång tills du stänger ner det - precis som det är på webbservern

Du ser det bara inte, för när du anropar http://localhost:8080/ så kommer Node-servern att servera dig det innehåll som publicerats på rutten för '/'. PHP är inte heller något magiskt som gör detta "on demand" utan det är en webbserver som hanterar detta åt dig, t.ex. Apache/XAMPP.

Jag menar inget illa när jag säger att du bara borde prova istället för att försöka greppa allt direkt. Det blir verkligen enklare om du bara sätter dig ner och labbar lite. Du kommer märka vad som behövs och hur saker och ting fungerar bara du sätter dig ner med det Förstår att det kan vara svårt när skolorna gör raka motsatsen hehe.

Skrivet av WebbkodsLärlingen:

Om jag förstått rätt så erbjuder Puppeteer förmågan att kunna läsa in webbsidor som om den renderat först DOM och sedan renderat ut ytterligare genom att kört JS-skripten som finns på webbplatsen ifråga?

Mvh,
WKL.

Puppeteer är vad jag förstår en headless chrome-webbläsare (alltså utan GUI:t) och läser in det mesta som en webbläsare gör.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

Tack för startkoden!

Hur deployar/sjösätter man vanligen NodeJS-baserade JS-servrar? Jag tänkte investera i Inleed snart och i deras "Guider" (https://login.inleed.net/helpcenter/376/skapa-en-nodejs-appli...) så verkar det gå att skapa en NodeJS-applikation:
<Uppladdad bildlänk>

Men jag har ingen aning om det faktiskt innebär att jag kan ha så att när man då besöker webb"Application URL" så körs den endast vid besök likt PHP-kod?

Jag vill ju att den alltid ska vara i "Listening on PORT X - Server running..."-läge så att den kan sköta sina intervallanrop i sitt webbskrapande.

Tolkar jag rätt att Vercel erbjuder NodeJS-baserade JS-serverkod att kunna köras 24/7 så att den kan sköta automatiskt webbskrapande istället för att bara köras vid anrop som med PHP-kod?

Detta är en liten detalj som jag inte greppat ännu inom Webbutveckling: sjösättning av färdiga webbplatser med olika slags serverkonfigurationer och allt som det innebär i praktiken!

Mvh,
WKL.

Som någon nämnde, labba lokalt först.
Sen finns t ex render.com där du kan hosta node gratis för demogrejer (även gratis Postgres-db 3 mån) och du kan hosta det mesta annat med Docker också. Med gratiskonto följer såklart begränsningar t ex att den blir vilande efter en stunds inaktivitet och då tar det typ 20 sek att spinna upp den igen vid anrop.

Permalänk
Medlem
Skrivet av Pelegrino:

Gällande ditt fråga kring etik tidigare så kan man ju påpeka att ex SweC har en robots.txt fil med följande innehåll:
Intressant att Google får bara röra vissa delar, magpie inga alls och resterande vad de vill (såvida jag inte missförstår).

Precis, tråden fick mig att titta på den tidigare gällande något jag tänkt på ett tag. Kanske dags att uppdatera den.

Permalänk
Medlem
Skrivet av filbunke:

Precis, tråden fick mig att titta på den tidigare gällande något jag tänkt på ett tag. Kanske dags att uppdatera den.

@jreklund har säkert koll på den

Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl