Hoppa till innehållet

Livsmedel - prisinformation: Skillnad mellan sidversioner

Från Plutten
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...'
 
mIngen redigeringssammanfattning
 
Rad 64: Rad 64:
* Övervakning av datainsamlingsrutiner
* Övervakning av datainsamlingsrutiner


== 6. Driftsättning ==
== 6. Juridik och etik ==


=== 6.1 Webhosting ===
=== 6.1 Villkor och rättigheter ===
* PHP-stöd och cron-stöd krävs (t.ex. ''DigitalOcean'', ''Loopia'')
 
=== 6.2 Domän & SSL ===
* Köp domän och aktivera ''Let's Encrypt'' eller annan SSL
 
=== 6.3 Övervakning ===
* E-postavisering vid fel
* Prestandamätning
 
== 7. Juridik och etik ==
 
=== 7.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'''


=== 7.2 Databasrätt ===
=== 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


=== 7.3 GDPR ===
=== 6.3 GDPR ===
* Inte relevant så länge inga personuppgifter hanteras
* Inte relevant så länge inga personuppgifter hanteras


=== 7.4 Rekommendationer för ansvarfull scraping ===
=== 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.:
  <code>MinPrisBot/1.0 (+https://minwebbplats.se/kontakt)</code>
<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


=== 7.5 Alternativa vägar ===
=== 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
  • 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>