Livsmedel - prisinformation
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>