Med Laravel, kan du scrape en hjemmeside i tre trin: installere et pakke som Symfony DomCrawler via Composer, oprette en ordre Artisan, og derefter markere elementerne HTML med vælgere CSS.
Denne guide til webscraping viser dig, hvordan du gør det i praksis, ved hjælp af PHP-kode klar til brug.

Forudsætninger for scraping med Laravel
Laravel er en PHP-rammeværk udviklet til moderne webapplikationer. Dets omfattende økosystem gør det til et ideelt grundlag for at opbygge et velstruktureret og vedligeholdelsesvenligt scraping-projekt.
Inden du går i gang, skal du sikre dig, at du har de rette rammer:
- Composer, afhængighedshåndteringen til installation af pakkerne.
- En nyere version af PHP kompatibel med din version af Laravel.
- Laravel installeret via
composer create-project laravel/laravel min-scraper.
Hvad angår færdigheder, er det nok med nogle grundlæggende kundskaber for at komme i gang:
- At kende grundlæggende principper for PHP og en applikations struktur Laravel (kontrolenheder, ruter, arkitektur MVC).
- At forstå HTML og CSS-selektorer for præcist at kunne udvælge elementer på en side.
- At kunne bruge Composer i kommandolinjen for at tilføje et pakke til projektet.
Hvad selve crawlingen angår, er her følgende Skrabeværktøj de mest nyttige:
- Symfony DomCrawler + HttpClient : det førende par i dag. Det henter en side og navigerer i HTML’en ved hjælp af metoden
filter()fra DomCrawler. For at starte klienten skal du brugeHttpClient::create()med de ønskede indstillinger. - HTTP Client af Laravel : baseret på Guzzle, henter han et simpelt indhold med
Http::get()og håndterer opkald til en API. - Puppeteer / Headless Chrome : en browser uden brugergrænseflade, der er uundværlig til at scrape sider, der indlæser deres indhold i JavaScript eller via Ajax.
Vejledning i at skabe din første scraper med Laravel
Følg disse trin for at oprette en funktionel scraper med Laravel. Du skal installere et scraping-pakke og generere en kommando Artisan, og derefter målrette dataene med CSS-selektorer.
Trin 1: Installation og konfiguration
Opret et nyt projekt Laravel med Composer, og tilføjer derefter Goutte, en praktisk integration til scraping:
# 1) Opret et nyt Laravel-projekt
compose create-project laravel/laravel scraper-demo
cd scraper-demo
# 2) Tilføj Goutte (Laravel-integration)
composer kræver weidner/goutte
Pakkerne weidner/goutte og fabpot/goutte er i dag officielt udfaset. De fungerer stadig, men til et nyt projekt anbefales det at udskifte dem på Symfony er symfony/browser-kit, sammen med symfony/http-client og symfony/dom-crawler. Koden nedenfor gælder stadig, hvis du bruger weidner/goutte, som ganske enkelt indkapsler Goutte til Laravel.
Trin 2: Opret en Artisan-ordre
Opretter en kommando, der indeholder din scraping-logik med php artisan :
php artisan make:command ScrapeData
Filen oprettes her : app/Konsol/Kommandoer/ScrapeData.php. Det er i denne klasse at du skal skrive HTTP-anmodningen og udtrække dataene. Klassen ScrapeData udvider Kommando, og metoden public function handle() indeholder al logikken bag scraping.
Trin 3: Skriv scraper-koden
I den genererede kommando skal du sammensætte tre vigtige elementer:
- EN HTTP-anmodning for at hente sidens HTML-indhold.
- Af CSS-selektorer overført til DomCrawler for at udvælge data via
filter(). - EN Sløjfe for at gennemse emnerne og vise resultaterne.
Her er et eksempel på en komplet kodestreng til at scrape artikeloverskrifter fra en blog:
info('Scraping: {$url}");
// 1) HTTP-anmodning for at hente HTML-koden
$crawler = Goutte::request("GET', $url);
// 2) Brug af CSS-selektorer med DomCrawler
$nodes = $crawler->filter('h2 a');
// 3) Gennemløb af elementerne og visning
$nodes->each(function (Crawler $node, $i) {
$title = $node->text();
$link = $node->attr('href');
$this->line(($i+1) . '. " . $title . " - " . $link);
});
return self::SUCCESS;
}
}
Her, DomCrawler udfører hele HTML-analysen. Metoden filter('h2 a') henter hvert link, der findes i en overskrift, og derefter each() løkken ovenpå for at trække tekst og attributten href. Start derefter scraperen fra din terminal med php artisan scrape:data og så vil du se titlerne blive vist én efter én. Du kan også starte php artisan serve for at teste din app lokalt, inden du sætter den i drift.
Bedste praksis for webscraping med Laravel
For at udføre web-scraping korrekt med Laravel er der nogle få vaner, der gør hele forskellen. Her er de anbefalede fremgangsmåder, uanset om du arbejder med en webscraping-bot eller en engangsbestilling.
1. Opgavehåndtering og køhåndtering
Scraping kan tage flere sekunder pr. side. Forestil dig, at du skal scrape 1000 sider af et websted: Din app vil blive blokeret og være ubrugelig i et godt stykke tid. Løsningen kan sammenfattes i to ord: de job og køer fra Laravel.
- EN job, det er en opgave, du vil køre i baggrunden.
- EN Hale (kø) er det sted, hvor disse opgaver placeres, så de kan udføres én efter én, uden at blokere resten.
Sådan indkapsler du scraping-logikken i en opgave:
// app/Jobs/ScrapePageJob.php
<?php
namespace App\Jobs;
use Goutte\Client; // Ou Guzzle/Http, selon ta stack
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class ScrapePageJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected string $url;
public function __construct(string $url)
{
$this->url = $url;
}
offentlig funktion handle(): void
{
$client = new Client();
$crawler = $client->request('GET', $this->url);
// Simpelt eksempel: udtræk alle <h1>
$titles = $crawler->filter('h1')->each(function ($node) {
return $node->text();
});
// Persistens / logs / events...
foreach ($titles as $title) {
\Log::info("[Scraping] {$this->url} - H1: {$title}");
}
}
}
// app/Http/Controllers/ScraperController.php
onQueue('scraping'); // hvis du vil have en dedikeret kø
}
return response()->json(['status' => 'Scraping kører i baggrunden']);
}
}
For at aktivere denne controller skal du deklarere en vej i din fil ruter/web.php Hvor routes/api.php, for eksempel Route::get('/scrape', [ScraperController::class, 'start']). Du kan også generere en dedikeret controller med php artisan make:controller ScraperController.
Laravel tilbyder flere systemer til at administrere denne kø. De to mest anvendte er:
- Fil med database : Opgaverne gemmes som rækker i en SQL-tabel og udføres derefter én efter én af en worker.
- Gå med Redis : Opgaverne placeres i hukommelsen i en lynhurtig kø, hvilket er ideelt til store mængder opgaver.
2. Automatisering med Laravel task scheduler
Laravel integrerer en opgaveplanlægger (scheduler), der giver dig mulighed for at automatisere dine scrapers, uden at du behøver at tænke over det. Du kan således planlægge, at en kommando skal udføres med jævne mellemrum, for eksempel hver time.
Sådan konfigureres det i app/Konsol/Kernel.php :
command('scraper:run')->hourly();
// Nyttige eksempler:
// $schedule->command('scraper:run')->everyFifteenMinutes();
// $schedule->command('scraper:run')->dailyAt('02:30')->timezone('Indian/Antananarivo');
}
/**
* Registrering af kommandoer.
*/
protected function commands(): void
{
$this->load(__DIR__ . '/Commands');
}
}
3. Omgåelse af anti-scraping-beskyttelse
Mange hjemmesider har indført beskyttelse mod scrapers. For at undgå at blive blokeret:
- Ændre User-Agent : simulerer en rigtig browser i stedet for HTTP-klientens standard-header.
- Håndtering af deadlines : indsætter pauser (sleep, throttle) mellem anmodninger for ikke at overbelaste målserveren.
- Brug af proxyer : Fordel forespørgslerne på flere IP-adresser.
4. Overhold robots.txt og de lovgivningsmæssige rammer
At omgå en beskyttelse betyder ikke, at man kan gøre, hvad man vil. Scraping er stadig underlagt visse regler, og det kan koste dig dyrt at ignorere dem.
- Overhold filen robots.txt : Den angiver, hvilke sider webstedet tillader eller forbyder at indeksere. Det er den første høflighedsregel, man skal følge.
- Tjek brugsbetingelserne : En hjemmeside kan forbyde scraping via sine brugsbetingelser.
- Husk GDPR : hvis du henter nogle personlig data, skal du overholde EU-forordningen om indsamling og behandling af disse oplysninger.
Hvad er alternativerne til webscraping med Laravel?
Laravel er stadig praktisk, når man skal integrere scraping i en PHP-applikation den eksisterende. Men afhængigt af dit projekt kan andre løsninger undertiden være mere velegnede. Her er de to vigtigste alternativer med deres fordele og begrænsninger.
Webscraping med Python
Python er det mest anvendte sprog til scraping. Det bygger på veludviklede biblioteker som Scrapy og BeautifulSoup.
- Fordele : et meget rigt økosystem, indbygget håndtering af crawling i stor skala, et enormt brugerfællesskab.
- Ulemper : Man skal forlade Laravel-miljøet. Det er ikke særlig praktisk, hvis din hjemmeside og dit API allerede kører på PHP.
Konkret bør du vælge Python, hvis scraping udgør kernen i projektet og ikke blot er en del af din applikation.
Kodefri værktøjer
Der findes stadig flere værktøjer, der gør det muligt at scrape uden kodning, undertiden med hjælp fra’IA. De mest kendte er Lyse data, Oktoparse og Apify.
- Fordele : visuelt opsætning, sidehåndtering via JavaScript og indbygget fejlhåndtering – ingen kodelinjer skal skrives.
- Ulemper : betalt abonnement, mindre præcis kontrol end en hjemmelavet scraper i Laravel.

Ofte stillede spørgsmål
Hvordan scraper jeg en login-beskyttet hjemmeside med Laravel?
Princippet er simpelt: Du simulerer en forbindelse og genbruger derefter sessionen til at få adgang til de beskyttede sider. Konkret skal du:
- Simuler forbindelsen med en POST-anmodning, der sender e-mail-adressen og adgangskoden til formularen.
- Gem cookies session, så de efterfølgende forespørgsler forbliver godkendt.
Med HttpBrowser af Symfony, kan du udføre de to trin i træk på en meget pæn måde. Den opretter en instans af klienten via HttpClient::create(), og administrerer derefter cookies automatisk mellem hver forespørgsel:
use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;
$browser = new HttpBrowser(HttpClient::create());
$crawler = $browser->request('GET', 'https://exemple.com/login');
$form = $crawler->selectButton('Se connecter')->form();
$browser->submit($form, [
'email' => 'ton@email.com',
'password' => 'ton_mot_de_passe',
]);
// Les cookies de session sont gardés automatiquement
$page = $browser->request('GET', 'https://exemple.com/compte');
echo $page->filter('h1')->text();
Bemærk venligst: den HttpBrowser håndterer cookies helt på egen hånd mellem to forespørgsler. Du behøver altså ikke gemme noget manuelt.
Hvordan håndterer du paginering, når du laver webscraping med Laravel?
Hvis man vil bladre gennem flere sider i træk, skal man finde linket “næste side” med et CSS-vælger, og derefter at gentage det, så længe det eksisterer. Her er logikken:
- Skrab den første side og udtrække de relevante data.
- Find linket “næste” via en CSS-selektor.
- Afslutte indtil der ikke er flere sider.
$url = 'https://exemple.com/blog?page=1';
while ($url) {
$crawler = $browser->request('GET', $url);
$crawler->filter('.article-title')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Récupère le lien "page suivante" s'il existe
$next = $crawler->filter('a.next');
$url = $next->count() ? $next->attr('href') : null;
}
Denne løkke stopper af sig selv, så snart vælgeren a.next returnerer ikke længere noget.
Hvordan eksporterer man de indsamlede data (til CSV, Excel eller JSON)?
Når du har hentet dine data, kan du eksportere dem i flere formater med Laravel:
fputcsv()for at generere en fil CSV indfødt.- Boghandlen
Maatwebsite\Excelfor at generere en fil Excel. - Den oprindelige funktion
json_encode()til eksport JSON, hvilket er praktisk, hvis du senere stiller dine data til rådighed via et API.
Hvordan håndterer du fejl og undtagelser under scraping?
En hjemmeside kan returnere en fejl, ændre sin HTML-struktur eller afbryde forbindelsen. For at skabe en robust scraper skal du tage højde for disse situationer:
- Indkapsle hver forespørgsel i en
try/catch. - Kontroller HTTP-koderne (404, 429, 500…) og registrere fejlen eller gentage forsøget efter et stykke tid.
try {
$crawler = $browser->request('GET', $url);
$status = $browser->getResponse()->getStatusCode();
if ($status !== 200) {
\Log::warning("Réponse inattendue: $status sur $url");
}
} catch (\Exception $e) {
\Log::error('Scraping échoué: ' . $e->getMessage());
}
Er webscraping lovligt eller ulovligt?
Det Lovligheden af webscraping afhænger af det pågældende websted og den måde, du bruger dataene på. Her er de tre punkter, du skal huske på:
- Sui generis-retten til databaser den EU-direktiv 96/9/EF beskytter indholdet i en database. Det kan være forbudt at udtrække en væsentlig del af et websted.
- Vilkår og betingelser for brug : dommen Ryanair mod PR Aviation (EU-Domstolen, 2015) har bekræftet, at et websted kan forbyde scraping i sine brugsbetingelser, selv uden ophavsretlig beskyttelse.
- RGPD : så snart du indsamler personlig data (e-mails, navne, profiler), er du omfattet af den europæiske forordning. Vær yderst forsigtig.
I praksis skal du altid overholde filen robots.txt, begræns antallet af forespørgsler, og undgå at behandle personoplysninger uden et retsgrundlag. Har du et spørgsmål eller et særligt tilfælde? Skriv det i kommentarfeltet.





