Hoppa till innehållet

Livsmedel - prisinformation

Från Plutten

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
  • 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')); } }

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>