PHP bruges ikke kun til at oprette dynamiske websteder. Det kan også blive en allieret for indsamle data online.
Takket være specialiserede biblioteker kan du nemt sæt en skraber op effektiv. Lad os se på hvordan.

Forudsætninger for scraping med PHP
Før du går i gang, skal du sørge for :
- ✅ At have grundlæggende programmering med PHP.
- ✅ At have kendskab til HTML og CSS for at målrette de data, der skal trækkes ud.
- ✅ Vide, hvordan man bruger Drejeskive. Det er et værktøj til at administrere PHP-afhængigheder for at installere scraping-biblioteker som Guzzle, Symfony DomCrawler eller Goutte.
- ✅ At have en lokal webserver til at køre din kode (XAMPP, WAMP eller MAMP).
- ✅ At have en kode-editor til at skrive dine PHP-scripts.
Hvilke værktøjer er vigtige for webscraping med PHP?
PHP alene er ikke nok. Her er de Biblioteker der gør scraping hurtigt og effektivt.
1. Guzzle: HTTP-klienten
Gæt og grimasser er det mest udbredte bibliotek til sende HTTP-anmodninger. For at installere det med DrejeskiveÅbn din terminal, gå til din projektmappe, og skriv kommandoen :
composer kræver guzzlehttp/guzzle
Composer downloader biblioteket og gør det anvendeligt direkte i din kode.
Her er et eksempel på simpel kode til hent indholdet fra en URL :
request('GET', $url);
// Hent HTTP-koden
$statusCode = $response->getStatusCode();
// Hent sidens indhold
$content = $response->getBody()->getContents();
echo "HTTP-kode: " . $statusCode . PHP_EOL;
echo "Sideindhold:" . PHP_EOL;
echo $content;
} catch (\Exception $e) {
echo "Fejl: " . $e->getMessage();
}
2. Symfony DomCrawler og Goutte: Dataudtrækning
To biblioteker bruges i vid udstrækning til at gennemse og analysere HTML:
- Symfony DomCrawler som lader dig navigere i HTML ved hjælp af CSS-selektorer og målrette mod specifikke elementer.
- Drop som er en wrapper for Guzzle og DomCrawler, og som i høj grad forenkler scraping-processen.
Eksempel med Symfony DomCrawler :
request('GET', 'https://exemple.com');
$html = $response->getBody()->getContents();
$crawler = new Crawler($html);
// Udvælgelse efter klasse
$crawler->filter('.my-class')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Udvælgelse efter ID
$crawler->filter('#mon-id')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Udvælgelse efter tag
$crawler->filter('h1')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
Eksempel med Goutte
request('GET', 'https://exemple.com');
// Udvælgelse efter klasse
$crawler->filter('.ma-class')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Udvælgelse efter ID
$crawler->filter('#mon-id')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Udvælgelse efter tag
$crawler->filter('p')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
3. Andre biblioteker og værktøjer
For at gå videre, her er andre muligheder:
- 🔥 PHP-Scraper : Det er et PHP-bibliotek, der gør det nemmere at udtrække information fra websider ved at håndtere kompleksiteten i HTML og selektorer. Det bruges meget af udviklere i deres projekter via Composer.
#-installation med Composer
compose kræver fabpot/goutte
request('GET', 'https://example.com');
$title = $crawler->filter('title')->text();
echo "Sidetitel: " . $itle;
- 🔥 Lyse data : Det er en professionel platform til indsamling af data i stor skala med integrerede proxyservere.

- 🔥 ScraperAPI : Det er en cloudbaseret webscraping-tjeneste, der er tilgængelig via en API. I stedet for at bruge lokale biblioteker til at udføre alt arbejdet, sender du en simpel forespørgsel til ScraperAPI's API ved at angive URL'en til den side, der skal scrapes.
Hvordan laver jeg en simpel webscraper i PHP?
Her er en vejledning i at lave en funktionel scraper i PHP:
Trin 1: Installation af afhængigheder
Brug Drejeskive for at installere Drop takket være :
compose kræver fabpot/goutte
Trin 2: Hent indholdet fra en side
Lav en HTTP GET-anmodning og rskimme HTML-indholdet af siden ved hjælp af Goutte med kommandoen :
request('GET', $url);
// Hent den rå HTML, hvis det er nødvendigt
$html = $crawler->html();
echo substr($html, 0, 500) . '...'; // preview
Trin 3: Udtræk data
Når du har hentet HTML-indholdet fra siden, er målet at udtrække specifikke data.
👉 Her er et eksempel på PHP-kode til skrabe overskrifter fra en side blog med Goutte ved hjælp af en CSS-selektor til at målrette mod <h2> i elementerne ..
<?php
require 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$url = 'https://exemple.com/blog'; // Remplacez par l'URL de votre page cible
// Faire une requête GET pour récupérer la page
$crawler = $client->request('GET', $url);
// Sélectionner les éléments <h2> dans <article> avec le sélecteur CSS
$titres = [];
$crawler->filter('article h2')->each(function ($node) use (&$titres) {
// Récupérer le texte du titre
$titres[] = trim($node->text());
});
// Afficher les titres extraits
print_r($titres);
?>
I dette eksempel:
- Vi bruger CSS-vælgeren
element h2tags til at målrette artikeltitler i<h2>inden for tagene.. - Teksten til hver titel udtrækkes ved hjælp af
tekst(), og vi tilføjer det til tabellen$itler. - Titlerne vises derefter med
print_r($itles);.
Det CSS-selektorer (eller XPath) kan også bruges til at Uddrag Attributter HTML-elementer. For eksempel, hvis hver blogtitel er et link i en tag <a>, kan vi udtrække attributten href for at få URL'erne til artiklerne.
👉 Her er et eksempel med Goutte for udtrække Links artikler :
request('GET', $url);
// Vælg links i titlerne
$itles = [];
$crawler->filter('article h2 a')->each(function ($node) use (&$itles) {
$itle = trim($node->text());
$link = $node->attr('href'); // Uddrag af attributten href
// Tilføj titel og URL til tabellen
$itles[] = [
title' => $itle,
url' => $lien,
];
});
// Vis resultaterne
print_r($itles);
?>
I dette eksempel:
- Vi udvælger de links, der er indeholdt i
<a>inden for tagene<h2>i elementerne.. - Vi henter attributten
hrefaf hvert link medattr('href'). - Titler og deres URL'er tilføjes til tabellen
$itlervises derefter medprint_r($itles);.
👉 Maleriet $itler vil indeholde elementer med både titel og link for hvert element. Her er et eksempel på formatet af de returnerede data:
Array
(
[0] => Array
(
[title] => Artikel 1 titel
[url] => /artikel1
)
[1] => Array
(
[title] => Artikel 2 titel
[url] => /artikel2
)
)
I dette eksempel:
- Hvert element i arrayet er et associativt array med to nøgler :
titeltil artiklens titel ogurlfor den tilsvarende URL. - De udtrukne data præsenteres i form af en tabel med to niveauer, hvor hver post indeholder en titel og et tilhørende link.
Fase 4: Strukturering og lagring af data
Når dataene er trukket ud, er det vigtigt at organisere dem korrekt. For at gøre det skal vi strukturere dem i en PHP-tabelog derefter eksportere dem i et struktureret format som f.eks. JSON Hvor CSV.
request('GET', $url);
// Udtræk titler og URL'er i en struktureret tabel
$data = [];
$crawler->filter('article h2 a')->each(function ($node) use (&$data) {
$data[] = [
title' => trim($node->text()), // Uddrag af titel
url' => $node->attr('href'), // Uddrag af href-attributten (URL)
];
});
// Vis de udpakkede data
print_r($data);
?>
Når dataene er organiseret, kan du eksportere dem i formatet JSONhvilket er nyttigt for API'er eller til brug i webapplikationer:
<?php
// Exporter les données en JSON
file_put_contents('export.json', json_encode($data, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));
echo "Les données ont été exportées en JSON dans 'export.json'.";
?>
Filen eksport.json vil blive oprettet i et læsbart format, som kan se sådan ud:
[
{
"title": "Titel på artikel 1",
"url": "/article1"
},
{
"title": "Artikel 2 titel",
"url": "/article2"
}
]
Hvis du vil eksportere dataene som en CSV-tabel, kan du bruge fputcsv for at skrive dataene til en CSV-fil :
<?php
// Exporter les données en CSV
$fp = fopen('export.csv', 'w');
// Ajouter l'en-tête (titres des colonnes)
fputcsv($fp, ['title', 'url']);
// Ajouter chaque ligne de données
foreach ($data as $row) {
fputcsv($fp, [$row['title'], $row['url']]);
}
// Fermer le fichier
fclose($fp);
echo "Les données ont été exportées en CSV dans 'export.csv'.";
?>
Filen eksport.csv vil se sådan ud:
titel,url
Artikeltitel 1,/artikel1
Titel på artikel 2,/article2
Hvordan kan jeg håndtere almindelige problemer med webscraping i PHP?
Under en operation web scraping i PHPDet er dog muligt at støde på problemer. Her er løsningerne på de mest almindelige.
1. Håndtering af fejl
- Forbindelsesfejl
Nogle gange når forespørgslen ikke engang frem til serveren. Du kan støde på "Intet netværk", "Ugyldig URL", "Server utilgængelig"osv. I dette tilfælde er en try/catch for at undgå, at dit script stopper brat.
👉 Her er et eksempel med Guzzle :
request('GET', 'https://example.com/api/data');
// Kontroller, om anmodningen var vellykket
if ($response->getStatusCode() === 200) {
// Behandl svaret, hvis det lykkedes
$body = $response->getBody();
echo "Data modtaget: " . $body;
}
} catch (RequestException $e) {
// Optag forbindelses- og anmodningsfejl
if ($e->hasResponse()) {
// Vis fejlkoden, hvis den er tilgængelig
echo "Anmodningsfejl: " . $e->getResponse()->getStatusCode();
} else {
// Hvis forbindelsen mislykkes (f.eks. hvis serveren ikke kan nås)
echo "Forbindelsesfejl: " . $e->getMessage();
}
}
}
// Kald funktionen
make_request_with_guzzle();
?>
- HTTP-statuskoder
Selv om forbindelsen fungerer, kan serveren svare med en fejl (404 = siden blev ikke fundet, 500 = internetfejlosv.). Du kan teste statuskoden med getStatusCode().
request('GET', 'https://example.com/api/data');
// Tjek statuskoden for svaret
$status_code = $response->getStatusCode();
// Tjek, om anmodningen var vellykket
if ($status_code === 200) {
// Behandl svaret, hvis det lykkedes
$body = $response->getBody();
echo "Svar vellykket med kode: " . $status_code . "
";
echo "Data modtaget: " . $body;
} elseif ($status_code === 404) {
echo "Fejl 404: Siden blev ikke fundet
";
} elseif ($status_code === 500) {
echo "Fejl 500: Intern serverfejl
";
} else {
echo "Statuskode: " . $status_code . "
";
}
} catch (RequestException $e) {
// Optag forbindelses- og anmodningsfejl
if ($e->hasResponse()) {
// Vis HTTP-fejlkoden, hvis den er tilgængelig
echo "HTTP-fejl: " . $e->getResponse()->getStatusCode() . "
";
} else {
// I tilfælde af en forbindelsesfejl (f.eks. hvis serveren ikke kan nås)
echo "Forbindelsesfejl: " . $e->getMessage();
}
}
}
// Kald funktionen
make_request_with_guzzle();
?>
- Parsing-fejl
Parsing er din scrapers analyse af HTML. Hvis siden er dårligt formateret, kan DomCrawler eller Goutte gå ned eller ikke returnere noget.
For at håndtere denne type fejl skal du altid kontrollere, at indholdet findes, før du forsøger at hente det. Brug betingelser (count(), filter()...) for at sikre, at det ønskede element er til stede. Omgiv derefter parsingen med en try/catch for at forhindre scriptet i at gå ned.
request('GET', 'https://example.com');
// Tjek, at målelementet findes, før du prøver at udtrække det
$elements = $crawler->filter('div.target-element');
if ($elements->count() > 0) {
// Elementet er til stede, vi kan udtrække det
$content = $elements->first()->text();
echo "Uddraget indhold: " . $content;
} else {
// Elementet er ikke fundet
echo "Målelementet blev ikke fundet på siden;
}
} catch (Undtagelse $e) {
// Fang parsing-fejl
echo "Fejl under parsing af siden: " . $e->getMessage();
}
}
// Kald funktionen
scrape_website() funktion;
?>
2. At komme uden om begrænsninger
Nogle websteder bruger beskyttelsesforanstaltninger for at gøre scraping vanskeligere.
- ❗ Blokering efter IP Du kan bruge proxyer som dem på Bright Data-platformen.
- ❗ JavaScript Som standard kan PHP ikke Kør JavaScript. Til dette formål er det nødvendigt at bruge en headless browser.
- ❗ Robots.txt Før du skrotter, er det vigtigt at tjekke denne fil, så du kan handle lovligt og ansvarligt.
Ofte stillede spørgsmål
Er webscraping lovligt?
📌 Den Lovligheden af webscraping er et komplekst emne. I Frankrig, som andre steder, afhænger alt af de juridiske rammer, de indsamlede data og den måde, de bruges på.
Hvad er forskellen mellem webscraping og webcrawling?
- det web scraping er at udtrække præcise data fra et websted.
- det Gennemsøgning af nettet er at gennemse sider for at indeksere dem.

Hvordan scraper jeg et websted, der kræver autentificering (login)?
For at scrape et websted, der kræver godkendelse, skal du simulere forbindelsen. Med PHP er den mest almindelige løsning Gæt og grimasser.
Du sender identifikatorerne via en POST-anmodning og holder derefter sessionen åben for at hente de beskyttede sider.
Hvordan håndterer du scraping af websteder med dynamiske sider, der indlæses i AJAX?
⚠ Som en påmindelse kan PHP ikke udføre JavaScript-kode på klientsiden.
For at scrape denne type side med PHP kan du brug BrowserShotet bibliotek, der bruger en rigtig browser i baggrunden (Headless Chrome/Chromium) til at indlæse siden og udføre JavaScript.
En anden løsning er at integrere PHP med Node.js-baserede værktøjersom Puppeteer til at generere den gengivne HTML og derefter hente dataene fra PHP.
Til alle typer webscraping med dynamiske sider kan du også bruge specialiserede værktøjer kaldet hovedløse browsere.
Er der nogen alternativer til PHP til webscraping?
Ja, flere sprog er populære:
- Python med sine stærke biblioteker som BeautifulSoup og Scrapy.
- Node.js som er meget effektiv til scraping af dynamiske hjemmesider ved hjælp af biblioteker som Puppeteer eller Cheerio.

Hvordan programmerer man en "scraper" på en etisk og ansvarlig måde?
For at scrape etisk skal du :
- ✔ Tjek robots.txt-filen for at finde ud af reglerne.
- ✔ Begræns hyppigheden af dine anmodninger for ikke at overbelaste hjemmesidens server.
- ✔ Respekter betingelserne brug af webstedet.
- ✔ Indsaml ikke personlige data uden tilladelse.
✅ Sammenfattende web scraping er en stærk praksis, men den skal bruges metodisk og ansvarligt.
👉 Og du, har du nogensinde lavet en scraper i PHP eller et andet sprog? Del dine erfaringer i kommentarfeltet.





