Livsmedel - prisinformation: Skillnad mellan sidversioner
Vibbe (diskussion | Bidrag) Skapade sidan med '= Projekt: PHP-baserad hemsida som visar livsmedelspriser från kända butiker = == 1. Projektplanering och förberedelse == === 1.1 Målformulering === * '''Definiera syftet''' med webbplatsen * '''Bestäm vilka butiker''' som ska stödjas (kända matbutiker) * '''Välj produktkategorier''' som ska bevakas === 1.2 Teknisk specifikation === * '''PHP-version''', ev. med ramverk som ''Laravel'' * '''Databas''': ''MySQL'' eller liknande * '''Frontend-teknik''': HTML, CSS...' |
Vibbe (diskussion | Bidrag) mIngen redigeringssammanfattning |
||
| Rad 64: | Rad 64: | ||
* Övervakning av datainsamlingsrutiner | * Övervakning av datainsamlingsrutiner | ||
== 6. | == 6. Juridik och etik == | ||
=== 6 | === 6.1 Villkor och rättigheter === | ||
* De flesta butiker förbjuder scraping i sina användarvillkor | * De flesta butiker förbjuder scraping i sina användarvillkor | ||
* Men: '''lågintensiv scraping (t.ex. 1 gång/månad) av publika sidor utan att störa tjänsten eller kringgå skydd är sannolikt tillåtet i praktiken''' | * Men: '''lågintensiv scraping (t.ex. 1 gång/månad) av publika sidor utan att störa tjänsten eller kringgå skydd är sannolikt tillåtet i praktiken''' | ||
=== | === 6.2 Databasrätt === | ||
* Enskilda produkter är inte upphovsrättsskyddade | * Enskilda produkter är inte upphovsrättsskyddade | ||
* '''Databasen som helhet kan vara skyddad''' – undvik omfattande kopiering | * '''Databasen som helhet kan vara skyddad''' – undvik omfattande kopiering | ||
=== | === 6.3 GDPR === | ||
* Inte relevant så länge inga personuppgifter hanteras | * Inte relevant så länge inga personuppgifter hanteras | ||
=== | === 6.4 Rekommendationer för ansvarfull scraping === | ||
* Scrapa max '''1 gång/månad''' per butik | * Scrapa max '''1 gång/månad''' per butik | ||
* Undvik parallella förfrågningar (lägg in ''sleep()'') | * Undvik parallella förfrågningar (lägg in ''sleep()'') | ||
* Ange tydlig '''User-Agent''', t.ex.: | * Ange tydlig '''User-Agent''', t.ex.: | ||
<nowiki>MinPrisBot/1.0 (+https://minwebbplats.se/kontakt)</nowiki> | |||
* Cacha och lagra lokalt | * Cacha och lagra lokalt | ||
* Logga fel och ändringar | * Logga fel och ändringar | ||
=== | === 6.5 Alternativa vägar === | ||
* Kontakta företagen för samarbete eller API-åtkomst | * Kontakta företagen för samarbete eller API-åtkomst | ||
== 7. Exempel på visning av priser med Laravel/PHP == | |||
=== 7.1 Model (Eloquent) === | |||
<nowiki> | |||
namespace App\Models; | |||
use Illuminate\Database\Eloquent\Model; | |||
class Product extends Model | |||
{ | |||
protected $fillable = ['name', 'price', 'store']; | |||
} | |||
</nowiki> | |||
=== 7.2 Controller === | |||
<nowiki> | |||
namespace App\Http\Controllers; | |||
use App\Models\Product; | |||
class ProductController extends Controller | |||
{ | |||
public function index() | |||
{ | |||
$products = Product::all(); // Hämtar alla produkter | |||
return view('products.index', compact('products')); | |||
} | |||
} | |||
</nowiki> | |||
=== 7.3 Route === | |||
<nowiki> | |||
use App\Http\Controllers\ProductController; | |||
Route::get('/produkter', [ProductController::class, 'index']); | |||
</nowiki> | |||
=== 7.4 View (Blade) === | |||
<nowiki> | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<title>Prislista</title> | |||
</head> | |||
<body> | |||
<h1>Produkter och priser</h1> | |||
<table border="1"> | |||
<tr> | |||
<th>Produkt</th> | |||
<th>Pris</th> | |||
<th>Butik</th> | |||
</tr> | |||
@foreach($products as $product) | |||
<tr> | |||
<td>{{ $product->name }}</td> | |||
<td>{{ $product->price }} kr</td> | |||
<td>{{ $product->store }}</td> | |||
</tr> | |||
@endforeach | |||
</table> | |||
</body> | |||
</html> | |||
</nowiki> | |||
[[Kategori:Livsmedel]] | [[Kategori:Livsmedel]] | ||
[[Kategori:pris]] | [[Kategori:pris]] | ||
Nuvarande version från 24 maj 2025 kl. 01.15
Projekt: PHP-baserad hemsida som visar livsmedelspriser från kända butiker
[redigera | redigera wikitext]1. Projektplanering och förberedelse
[redigera | redigera wikitext]1.1 Målformulering
[redigera | redigera wikitext]- Definiera syftet med webbplatsen
- Bestäm vilka butiker som ska stödjas (kända matbutiker)
- Välj produktkategorier som ska bevakas
1.2 Teknisk specifikation
[redigera | redigera wikitext]- PHP-version, ev. med ramverk som Laravel
- Databas: MySQL eller liknande
- Frontend-teknik: HTML, CSS, JS (ex. Bootstrap eller Vue.js)
2. Datainsamling
[redigera | redigera wikitext]2.1 Undersöka tillgång till API
[redigera | redigera wikitext]- Kontrollera om dessa har publika eller privata API:er
- Ansök om åtkomst vid behov
2.2 Web scraping (om API saknas)
[redigera | redigera wikitext]- Identifiera URL-struktur och DOM-element för priser
- Hantera anti-bot-skydd (CAPTCHA, cookies, headers)
- Använd PHP med cURL eller ramverk som Goutte
2.3 Frekvens och lagring
[redigera | redigera wikitext]- Bestäm uppdateringsintervall (t.ex. en gång/månad)
- Skapa script som körs via cron-jobb
3. Backend-utveckling (PHP)
[redigera | redigera wikitext]3.1 Databasdesign
[redigera | redigera wikitext]- Tabeller: produkter, butiker, priser, uppdateringar
- Indexering för prestanda
3.2 Importlogik
[redigera | redigera wikitext]- Funktioner för att hämta och spara data
- Felhantering vid brutna länkar eller förändrade layout
3.3 API till frontend
[redigera | redigera wikitext]- Bygg REST-endpoints i PHP
- Möjlighet till sortering och filtrering i gränssnittet
4. Frontend-utveckling
[redigera | redigera wikitext]4.1 Gränssnitt
[redigera | redigera wikitext]- Sökfält för produkter
- Filtrering: butik, pris, kategori
- Visa prisjämförelser i tabell eller kortvisning
4.2 Responsiv design
[redigera | redigera wikitext]- Anpassning för mobil och dator
- Laddningsindikatorer, felmeddelanden
5. Säkerhet och prestanda
[redigera | redigera wikitext]5.1 Skydd mot blockering
[redigera | redigera wikitext]- Variera User-Agent
- Använd cache för att minska belastning
- Möjligt stöd för proxy
5.2 Loggning och hantering
[redigera | redigera wikitext]- Fel- och statusloggning
- Övervakning av datainsamlingsrutiner
6. Juridik och etik
[redigera | redigera wikitext]6.1 Villkor och rättigheter
[redigera | redigera wikitext]- De flesta butiker förbjuder scraping i sina användarvillkor
- Men: lågintensiv scraping (t.ex. 1 gång/månad) av publika sidor utan att störa tjänsten eller kringgå skydd är sannolikt tillåtet i praktiken
6.2 Databasrätt
[redigera | redigera wikitext]- Enskilda produkter är inte upphovsrättsskyddade
- Databasen som helhet kan vara skyddad – undvik omfattande kopiering
6.3 GDPR
[redigera | redigera wikitext]- Inte relevant så länge inga personuppgifter hanteras
6.4 Rekommendationer för ansvarfull scraping
[redigera | redigera wikitext]- Scrapa max 1 gång/månad per butik
- Undvik parallella förfrågningar (lägg in sleep())
- Ange tydlig User-Agent, t.ex.:
MinPrisBot/1.0 (+https://minwebbplats.se/kontakt)
- Cacha och lagra lokalt
- Logga fel och ändringar
6.5 Alternativa vägar
[redigera | redigera wikitext]- Kontakta företagen för samarbete eller API-åtkomst
7. Exempel på visning av priser med Laravel/PHP
[redigera | redigera wikitext]7.1 Model (Eloquent)
[redigera | redigera wikitext]namespace App\Models; use Illuminate\Database\Eloquent\Model; class Product extends Model { protected $fillable = ['name', 'price', 'store']; }
7.2 Controller
[redigera | redigera wikitext]namespace App\Http\Controllers; use App\Models\Product; class ProductController extends Controller { public function index() { $products = Product::all(); // Hämtar alla produkter return view('products.index', compact('products')); } }
7.3 Route
[redigera | redigera wikitext]use App\Http\Controllers\ProductController; Route::get('/produkter', [ProductController::class, 'index']);
7.4 View (Blade)
[redigera | redigera wikitext]<!DOCTYPE html> <html> <head> <title>Prislista</title> </head> <body> <h1>Produkter och priser</h1> <table border="1"> <tr> <th>Produkt</th> <th>Pris</th> <th>Butik</th> </tr> @foreach($products as $product) <tr> <td>{{ $product->name }}</td> <td>{{ $product->price }} kr</td> <td>{{ $product->store }}</td> </tr> @endforeach </table> </body> </html>