Das Erlernen von PHP Web Scraping ist in verschiedenen Bereichen von Vorteil. Ganz gleich, ob Sie ein Vermarkter oder ein SEO-Forscher sind, der Zugriff auf aktuelle Daten ist immer unerlässlich, und die manuelle Datenerfassung kann zeitaufwändig sein. Hier kommt Web Scraping ins Spiel. Es kann in vielen Bereichen hilfreich sein, von Suchmaschinenoptimierung und SEO-Marketing bis hin zur Big Data-Analyse.
Inhaltsübersicht
Warum Scrape mit PHP
PHP ist eine leistungsstarke objektorientierte Programmiersprache, die speziell für die Webentwicklung entwickelt wurde. Dank ihrer benutzerfreundlichen Syntax ist sie auch für Anfänger leicht zu erlernen und zu verstehen. PHP ist nicht nur benutzerfreundlich, sondern auch außergewöhnlich leistungsstark, so dass PHP-Skripte schnell und effizient ausgeführt werden können.
Die starke Unterstützung durch die PHP-Community stellt sicher, dass Sie Zugang zu einer Vielzahl von Ressourcen, Tutorials und Foren haben, in denen Sie Anleitung erhalten und Wissen austauschen können. Alles in allem bietet PHP die perfekte Kombination aus Einfachheit, Geschwindigkeit und Vielseitigkeit, was es zu einer hervorragenden Programmiersprache für Web Scraping macht.
Einrichten der Umgebung für Web Scraping mit PHP
Um einen PHP Scraper zu erstellen, müssen wir PHP einrichten und die Bibliotheken herunterladen, die wir später in unsere Projekte einbinden werden. Es gibt jedoch zwei Möglichkeiten, wie wir dies tun können. Sie können alle Bibliotheken manuell herunterladen und die Initialisierungsdatei konfigurieren oder dies mit Composer automatisieren.
Da wir die Skripterstellung so weit wie möglich vereinfachen und Ihnen zeigen möchten, wie es geht, installieren wir Composer und erklären, wie Sie ihn verwenden.
Installieren der Komponenten
Um loszulegen, laden Sie PHP von der offiziellen Website herunter. Wenn Sie Windows verwenden, laden Sie die neueste stabile Version als Zip-Archiv herunter. Entpacken Sie es dann an einen Ort, den Sie sich gut merken können, z.B. in den Ordner "PHP" auf Ihrem Laufwerk C.
Wenn Sie Windows verwenden, müssen Sie den Pfad zu den PHP-Dateien in Ihrem System festlegen. Öffnen Sie dazu einen beliebigen Ordner auf Ihrem Computer und gehen Sie zu den Systemeinstellungen (klicken Sie mit der rechten Maustaste auf diesen PC und gehen Sie zu Eigenschaften).
Suchen Sie die Option "Erweiterte Systemeinstellungen" auf der Seite und klicken Sie darauf.
Suchen Sie auf der Registerkarte "Erweitert" die Schaltfläche "Umgebungsvariablen" und klicken Sie auf sie.
Suchen Sie im Abschnitt "Benutzervariablen für Benutzer" die Variable "Pfad" und klicken Sie auf die Schaltfläche "Bearbeiten".
Es wird ein neues Fenster geöffnet, in dem Sie den Wert der Variable "Path" bearbeiten können. Fügen Sie den Pfad zu den PHP-Dateien am Ende des bestehenden Wertes ein. Klicken Sie auf die Schaltfläche "OK", um die Änderungen zu speichern. Wenn Sie noch Fragen haben, können Sie die Dokumentation lesen.
Lassen Sie uns nun Composer installieren, einen Abhängigkeitsmanager für PHP, der die Verwaltung und Installation von Bibliotheken von Drittanbietern in Ihrem Projekt vereinfacht. Sie können alle Pakete von github.com herunterladen, aber nach unserer Erfahrung ist Composer bequemer.
Um zu beginnen, gehen Sie auf die offizielle Website und laden Sie Composer herunter. Folgen Sie dann den Anweisungen in der Installationsdatei. Sie müssen auch den Pfad angeben, in dem sich PHP befindet, stellen Sie also sicher, dass er korrekt eingestellt ist.
Erstellen Sie im Stammverzeichnis Ihres Projekts eine neue Datei namens composer.json. Diese Datei wird Informationen über die Abhängigkeiten Ihres Projekts enthalten. Wir haben eine einzige Datei vorbereitet, die alle im heutigen Tutorial verwendeten Bibliotheken enthält, damit Sie unsere Einstellungen übernehmen können.
{
"require": {
"fabpot/goutte": "^4.0",
"facebook/webdriver": "^1.1",
"guzzlehttp/guzzle": "^7.7",
"imangazaliev/didom": "^2.0",
"j4mie/idiorm": "^1.5",
"jaeger/querylist": "^4.2",
"kriswallsmith/buzz": "^0.15.0",
"nategood/httpful": "^0.3.2",
"php-webdriver/webdriver": "^1.1",
"querypath/querypath": "^3.0",
"sunra/php-simple-html-dom-parser": "^1.5",
"symfony/browser-kit": "^6.3",
"symfony/dom-crawler": "^6.3"
},
"config": {
"platform": {
"php": "8.2.7"
},
"preferred-install": {
"*": "dist"
},
"minimum-stability": "stable",
"prefer-stable": true,
"sort-packages": true
}
}
Um zu beginnen, navigieren Sie in der Befehlszeile zu dem Verzeichnis, das die Datei composer.json enthält, und führen den Befehl aus:
composer install
Der Composer lädt die angegebenen Abhängigkeiten herunter und installiert sie in das Vendor-Verzeichnis Ihres Projekts.
Sie können diese Bibliotheken nun mit einem einzigen Befehl in der Datei mit Ihrem Code in Ihr Projekt importieren.
require 'vendor/autoload.php';
Jetzt können Sie Klassen aus den installierten Bibliotheken verwenden, indem Sie sie einfach in Ihrem Code aufrufen.
Seite Analyse
Nachdem wir nun die Umgebung vorbereitet und alle Komponenten eingerichtet haben, können wir die Webseite analysieren, die wir scrapen werden. Als Beispiel verwenden wir diese Demo-Website. Rufen Sie die Website auf und öffnen Sie die Entwicklerkonsole (F12 oder klicken Sie mit der rechten Maustaste und gehen Sie zu Inspizieren).
Hier sehen wir, dass alle notwendigen Daten im übergeordneten Tag "div" mit dem Klassennamen "col" gespeichert sind, der alle Produkte auf der Seite enthält. Es enthält die folgenden Informationen:
- Der Tag "img" enthält den Link zum Produktbild im Attribut "src".
- Der Tag "a" enthält den Produktlink im Attribut "href".
- Der "h4"-Tag enthält den Produkttitel.
- Das Tag "p" enthält die Produktbeschreibung.
- Die Preise werden im Tag "span" mit verschiedenen Klassen gespeichert:
5.1. "Preis-alt" für den ursprünglichen Preis.
5.2. "Preis-neu" für den ermäßigten Preis.
5.3. "Preis-Steuer" für die Steuer.
Da wir nun wissen, wo die benötigten Informationen gespeichert sind, können wir mit dem Scraping beginnen.
Top 10 der besten PHP Web Scraping Bibliotheken
Es gibt so viele Bibliotheken in PHP, dass es eine Herausforderung ist, sie alle umfassend zu behandeln. Wir haben jedoch die beliebtesten und am häufigsten verwendeten Bibliotheken ausgewählt und werden uns nun jede einzelne ansehen.
Guzzle
Wir beginnen unsere Sammlung mit der Guzzle-Bibliothek. Das Einzige, was diese Bibliothek kann, ist die Bearbeitung von Anfragen, aber sie macht das außergewöhnlich gut.
Vor- und Nachteile der Bibliothek
Wie bereits erwähnt, ist Guzzle eine Bibliothek, die Anfragen stellt. Sie kann zwar den gesamten Code der Seite abrufen, aber sie kann die benötigten Daten nicht verarbeiten und extrahieren. Unsere Liste enthält jedoch auch Bibliotheken, die sich hervorragend zum Parsen eignen, aber keine Abfragen durchführen können. Für Scraping ist Guzzle daher unverzichtbar.
Beispiel für die Verwendung
Lassen Sie uns eine neue Datei mit der Erweiterung *.php erstellen und unsere Bibliotheken importieren. Wir haben diesen Befehl bereits verwendet, als wir die PHP-Bibliotheken für Web Scraping installiert haben.
<?php
require 'vendor/autoload.php';
// Here will be code
?>
Jetzt können wir den Guzzle-Client erstellen.
use GuzzleHttp\Client;
$client = new Client();
Viele Menschen haben jedoch Probleme mit SSL-Zertifikaten. Wenn Sie in einer lokalen Entwicklungsumgebung arbeiten, können Sie die Überprüfung von SSL-Zertifikaten vorübergehend deaktivieren, um Ihre Arbeit fortzusetzen. Dies wird in einer Produktionsumgebung nicht empfohlen, kann aber eine vorübergehende Lösung für Entwicklungs- und Testzwecke sein.
$client = new Client(['verify' => false]);
Geben Sie nun die URL der Seite an, die wir scrapen wollen.
$url="https://demo.opencart.com/";
Jetzt müssen wir nur noch eine Anfrage an die Ziel-Website stellen und das Ergebnis auf dem Bildschirm anzeigen. In dieser Phase treten jedoch häufig Fehler auf. Daher werden wir diesen Codeblock in eine try...catch()-Anweisung einschließen, um mögliche Probleme zu behandeln, ohne dass das Skript angehalten wird.
try {
$response = $client->request('GET', $url);
$body = $response->getBody()->getContents();
echo $body;
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
Wir könnten die Daten von dieser Seite mit regulären Ausdrücken abrufen, aber diese Methode wäre nicht einfach, da wir eine beträchtliche Menge an Daten benötigen. Vollständiger Code:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client(['verify' => false]);
$url="https://demo.opencart.com/";
try {
$response = $client->request('GET', $url);
$body = $response->getBody()->getContents();
echo $body;
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
?>
Lassen Sie uns nun zur nächsten Bibliothek übergehen.
HTTPful
HTTPful ist eine weitere funktionale und nützliche Abfragebibliothek. Sie unterstützt alle Anfragen, einschließlich POST, GET, DELETE und PUT.
Vor- und Nachteile der Bibliothek
Die Bibliothek ist einfach und leicht zu benutzen, hat aber eine kleinere Community als Guzzle. Leider hat sie weniger Funktionalität und ist trotz ihrer Einfachheit weniger beliebt. Außerdem wurde sie seit geraumer Zeit nicht mehr aktualisiert, so dass es bei ihrer Verwendung zu Problemen kommen kann.
Beispiel für die Verwendung
Da es sich um eine Abfragebibliothek handelt, geben wir ein zusätzliches kleines Beispiel für eine Abfrage, da wir für das Parsen eine andere Bibliothek verwenden müssten:
<?php
require 'vendor/autoload.php';
use Httpful\Request;
$response = Request::get('https://demo.opencart.com/')->send();
$html = $response->body;
?>
Sie können es also für Ihre Scraping-Projekte verwenden, aber wir empfehlen Ihnen, etwas anderes zu verwenden.
Symfony
Symfony ist ein Framework, das viele Komponenten für Scraping enthält. Es unterstützt eine Vielzahl von Möglichkeiten zur Verarbeitung von HTML-Dokumenten und zur Durchführung von Abfragen.
Vor- und Nachteile der Bibliothek
Mit Symfony können Sie beliebige Daten aus einer HTML-Struktur extrahieren und sowohl CSS-Selektoren als auch XPath verwenden. Unabhängig von der Größe der Seite führt es die Verarbeitung recht schnell durch.
Obwohl es als eigenständiges Scraping-Tool verwendet werden kann, ist Symfony jedoch ein sehr großes und schweres Framework. Aus diesem Grund ist es nicht üblich, das gesamte Framework zu verwenden, sondern nur eine bestimmte Komponente.
Beispiel für die Verwendung
Lassen Sie uns also den Crawler verwenden, um Seiten zu verarbeiten, und die Guzzle-Bibliothek, die wir bereits besprochen haben, um Anfragen zu stellen. Wir werden sie nicht noch einmal durchgehen und sehen, wie wir einen Client erstellen und eine Abfrage ausführen.
Fügen Sie use hinzu, was bedeutet, dass wir den Crawler der Symfony-Bibliothek verwenden werden.
use Symfony\Component\DomCrawler\Crawler;
Erweitern Sie nun den Code, den wir im try{...}-Block geschrieben haben. Wir werden die Anfrage verarbeiten und alle Elemente mit der Klasse ".col" abrufen.
$body = $response->getBody()->getContents();
$crawler->addHtmlContent($body);
$elements = $crawler->filter('.col');
Jetzt müssen wir nur noch jedes gesammelte Element durchgehen und die gewünschten Informationen auswählen. Dazu verwenden wir den XPath der Elemente, die wir bei der Analyse der Seite berücksichtigt haben.
Sie haben jedoch vielleicht bemerkt, dass nicht alle Artikel den alten Preis haben. Da also Artikel mit der Klasse ".preis-alt" möglicherweise nicht existieren, zeigen wir dies im Skript an und verwenden "-" anstelle von Preis.
foreach ($elements as $element) {
$image = $crawler->filterXPath('.//img', $element)->attr('src');
$title = $crawler->filterXPath('.//h4', $element)->text();
$link = $crawler->filterXPath('.//h4/a', $element)->attr('href');
$desc = $crawler->filterXPath('.//p', $element)->text();
$old_p_element = $crawler->filterXPath('.//span.price-old', $element);
$old_p = $old_p_element->count() ? $old_p_element->text() : '-';
$new_p = $crawler->filterXPath('.//span.price-new', $element)->text();
$tax = $crawler->filterXPath('.//span.price-tax', $element)->text();
// Here will be code
}
Und schließlich müssen wir nur noch alle gesammelten Daten auf dem Bildschirm anzeigen:
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
So haben wir alle Daten in der Konsole:
Wenn Sie sich für den endgültigen Code interessieren oder wenn Sie uns während des Tutorials verloren haben, finden Sie hier das vollständige Skript:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;
$client = new Client([
'verify' => false
]);
$crawler = new Crawler();
$url="https://demo.opencart.com/";
try {
$response = $client->request('GET', $url);
$body = $response->getBody()->getContents();
$crawler->addHtmlContent($body);
$elements = $crawler->filter('.col');
foreach ($elements as $element) {
$image = $crawler->filterXPath('.//img', $element)->attr('src');
$title = $crawler->filterXPath('.//h4', $element)->text();
$link = $crawler->filterXPath('.//h4/a', $element)->attr('href');
$desc = $crawler->filterXPath('.//p', $element)->text();
$old_p_element = $crawler->filterXPath('.//span.price-old', $element);
$old_p = $old_p_element->count() ? $old_p_element->text() : '-';
$new_p = $crawler->filterXPath('.//span.price-new', $element)->text();
$tax = $crawler->filterXPath('.//span.price-tax', $element)->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
?>
Wenn Sie nur das Symfony-Framework verwenden möchten, können Sie dessen Panther-Komponente nutzen. Wir werden die Verwendung von Panther nicht Schritt für Schritt durchgehen, aber wir geben Ihnen ein Beispiel, das die gleichen Daten liefert:
<?php
require 'vendor/autoload.php';
use Symfony\Component\Panther\Panther;
$client = Panther::createChromeClient();
$crawler = $client->request('GET', 'https://demo.opencart.com/');
$elements = $crawler->filter('.col');
$elements->each(function ($element) {
$image = $element->filter('img')->attr('src');
$title = $element->filter('h4')->text();
$link = $element->filter('h4 > a')->attr('href');
$desc = $element->filter('p')->text();
$old_p_element = $element->filter('span.price-old');
$old_p = $old_p_element->count() > 0 ? $old_p_element->text() : '-';
$new_p = $element->filter('span.price-new')->text();
$tax = $element->filter('span.price-tax')->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
});
$client->quit();
?>
Lassen Sie uns zu einer Bibliothek übergehen, die die beiden besprochenen ersetzen kann.
Goutte
Goutte ist eine PHP-Bibliothek, die eine bequeme Möglichkeit zum Scrapen von Webseiten bietet. Sie basiert auf Symfony-Komponenten wie DomCrawler und BrowserKit und verwendet Guzzle als HTTP-Client. Daher kombiniert sie die Vorteile dieser beiden Bibliotheken.
Vor- und Nachteile der Bibliothek
Goutte verfügt über einfache Funktionen, die das Scrapen von Webseiten auch für Anfänger leicht machen. Außerdem unterstützt es sowohl CSS-Selektoren als auch XPath.
Obwohl Goutte eine leistungsstarke und praktische Bibliothek für Web Scraping in PHP ist, hat sie einige Einschränkungen und Nachteile. Es fehlt die integrierte Unterstützung für die Ausführung von JavaScript auf der Seite. Wenn die Zielseite für die Anzeige oder das Laden von Daten stark auf JavaScript angewiesen ist, ist Goutte möglicherweise nicht die beste Wahl.
Beispiel für die Verwendung
Wenn man bedenkt, dass die Guotte-Bibliothek auf Guzzle und Symfony basiert, ist ihre Verwendung ähnlich wie die, die wir uns bereits angesehen haben. Auch hier verwenden wir Methoden wie filter() und attr() oder text(), um die benötigten Daten zu extrahieren, wie z.B. Bilder, Titel oder Links:
<?php
require 'vendor/autoload.php';
$guzzleClient = new \GuzzleHttp\Client([
'verify' => false
]);
$client = new \Goutte\Client();
$client->setClient($guzzleClient);
try {
$crawler = $client->request('GET', 'https://demo.opencart.com/');
$elements = $crawler->filter('.col');
$elements->each(function ($element) {
$image = $element->filter('img')->attr('src');
$title = $element->filter('h4')->text();
$link = $element->filter('h4 > a')->attr('href');
$desc = $element->filter('p')->text();
$old_p_element = $element->filter('span.price-old');
$old_p = $old_p_element->count() ? $old_p_element->text() : '-';
$new_p = $element->filter('span.price-new')->text();
$tax = $element->filter('span.price-tax')->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
});
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
?>
Wir haben also die gleichen Daten, aber mit einer anderen Bibliothek:
Wie Sie sehen können, ist Goutte eine recht praktische PHP-Bibliothek für Web-Scraping.
Scrape-It.Cloud API
Scrape-It.Cloud API ist eine spezielle Schnittstelle, die wir zur Vereinfachung des Scraping-Prozesses entwickelt haben. Beim Scrapen von Daten sehen sich Entwickler oft mit verschiedenen Herausforderungen konfrontiert, z. B. JavaScript-Rendering, Captcha, Blöcke usw. Mit unserer API können Sie diese Probleme jedoch umgehen und sich auf die Verarbeitung der Daten konzentrieren, die Sie bereits erhalten haben.
Vor- und Nachteile der Bibliothek
Wie bereits erwähnt, können Sie mit unserer Web Scraping API viele Herausforderungen bei der Entwicklung Ihres Scrapers vermeiden. Außerdem werden Sie damit Geld sparen. Wir haben bereits die Top 10 der Proxy-Anbieter besprochen und die Kosten für den Kauf verglichen rotating Proxy und unser Abonnement.
Außerdem können Sie, wenn Sie Daten benötigen und keinen Scraper entwickeln möchten, unsere No-Code-Scraper für die beliebtesten Websites verwenden. Wenn Sie Zweifel haben und es ausprobieren möchten, melden Sie sich auf unserer Website an und erhalten Sie kostenlose Credits als Teil der Testversion.
Beispiel für die Verwendung
Um die API zu nutzen, müssen wir eine Anfrage stellen. Wir werden die Guzzle-Bibliothek verwenden, die wir bereits besprochen haben. Verbinden wir sie und setzen den API-Link.
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$apiUrl="https://api.scrape-it.cloud/scrape";
Jetzt müssen wir eine Anfrage erstellen, die aus zwei Teilen besteht - den Kopfzeilen der Anfrage und dem Text der Anfrage. Richten Sie zunächst die Kopfzeilen ein:
$headers = [
'x-api-key' => 'YOUR-API-KEY',
'Content-Type' => 'application/json',
];
Sie müssen "YOUR-API-KEY" durch Ihren einzigartigen Schlüssel ersetzen, den Sie nach der Anmeldung auf unserer Website in Ihrem Konto finden.
Dann müssen wir den Körper der Anfrage festlegen, um der API mitzuteilen, welche Daten wir wollen. Hier können Sie die Regeln für die Datenextraktion, den Proxy und den Typ des Proxys, den Sie verwenden möchten, das zu extrahierende Skript, den Link zur Ressource und vieles mehr angeben. Eine vollständige Liste der Parameter finden Sie in unserer Dokumentation.
$data = [
'extract_rules' => [
'Image' => 'img @src',
'Title' => 'h4',
'Link' => 'h4 > a @href',
'Description' => 'p',
'Old Price' => 'span.price-old',
'New Price' => 'span.price-new',
'Tax' => 'span.price-tax',
],
'wait' => 0,
'screenshot' => true,
'block_resources' => false,
'url' => 'https://demo.opencart.com/',
];
Wir haben Extraktionsregeln verwendet, um nur die gewünschten Daten zu erhalten. Die API gibt die Antwort im JSON-Format zurück, das wir verwenden können, um nur die Extraktionsregeln aus der Antwort zu extrahieren.
$data = json_decode($response->getBody(), true);
if ($data['status'] === 'ok') {
$extractionData = $data['scrapingResult']['extractedData'];
foreach ($extractionData as $key => $value) {
echo $key . ": " . json_encode($value) . "\n\n";
}
} else {
echo "An error occurred: " . $data['message'];
}
Wir werden die gewünschten Informationen erhalten, indem wir das von uns erstellte Skript ausführen. Das Beste daran ist, dass dieses Skript unabhängig von der Website funktioniert, die Sie scrapen möchten. Alles, was Sie tun müssen, ist, die Extraktionsregeln zu ändern und den Link zur Zielressource anzugeben.
Vollständiger Code:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$apiUrl="https://api.scrape-it.cloud/scrape";
$headers = [
'x-api-key' => 'YOUR-API-KEY',
'Content-Type' => 'application/json',
];
$data = [
'extract_rules' => [
'Image' => 'img @src',
'Title' => 'h4',
'Link' => 'h4 > a @href',
'Description' => 'p',
'Old Price' => 'span.price-old',
'New Price' => 'span.price-new',
'Tax' => 'span.price-tax',
],
'wait' => 0,
'screenshot' => true,
'block_resources' => false,
'url' => 'https://demo.opencart.com/',
];
$client = new Client(['verify' => false]);
$response = $client->post($apiUrl, [
'headers' => $headers,
'json' => $data,
]);
$data = json_decode($response->getBody(), true);
if ($data['status'] === 'ok') {
$extractionData = $data['scrapingResult']['extractedData'];
foreach ($extractionData as $key => $value) {
echo $key . ": " . json_encode($value) . "\n\n";
}
} else {
echo "An error occurred: " . $data['message'];
}
?>
Das Ergebnis ist:
Mit unserer Web Scraping API können Sie Ergebnisse von jeder beliebigen Website abrufen, unabhängig davon, ob sie in Ihrem Land zugänglich ist oder ob der Inhalt dynamisch generiert wird.
Einfaches HTML DOM
Die Simple HTML DOM-Bibliothek ist eine der einfachsten PHP-DOM-Bibliotheken. Sie eignet sich hervorragend für Anfänger, verfügt über eine vollständige Scraping-Bibliothek und ist sehr einfach zu bedienen.
Vor- und Nachteile der Bibliothek
Diese Bibliothek ist sehr benutzerfreundlich und perfekt für das Scraping einfacher Seiten. Allerdings können Sie keine Daten von dynamisch generierten Seiten sammeln. Außerdem erlaubt diese Bibliothek nur die Verwendung von CSS-Selektoren und unterstützt kein XPath.
Beispiel für die Verwendung
Lassen Sie uns an einem Beispiel sehen, dass es sehr einfach zu verwenden ist. Verbinden Sie zunächst die Abhängigkeiten und geben Sie die Website an, von der wir die Daten abrufen wollen.
require 'vendor/autoload.php';
use Sunra\PhpSimple\HtmlDomParser;
$html = HtmlDomParser::file_get_html('https://demo.opencart.com/');
Suchen Sie nun alle Produkte mit der Funktion find() und dem CSS-Selektor.
$elements = $html->find('.col');
Lassen Sie uns nun alle gesammelten Elemente durchgehen und die Daten auswählen, die wir benötigen. Dabei müssen wir angeben, was wir extrahieren möchten. Wir müssen den Attributnamen angeben, wenn es sich um einen Attributwert handelt. Wenn wir den Textinhalt eines Tags extrahieren möchten, verwenden wir "plaintext". Wie zuvor zeigen wir den Text sofort auf dem Bildschirm an.
foreach ($elements as $element) {
$image = $element->find('img', 0)->src;
$title = $element->find('h4', 0)->plaintext;
$link = $element->find('h4 > a', 0)->href;
$desc = $element->find('p', 0)->plaintext;
$old_p_element = $element->find('span.price-old', 0);
$old_p = $old_p_element ? $old_p_element->plaintext : '-';
$new_p = $element->find('span.price-new', 0)->plaintext;
$tax = $element->find('span.price-tax', 0)->plaintext;
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
Danach müssen wir nur noch Ressourcen freigeben und das Skript beenden.
$html->clear();
Vollständiger Code:
<?php
require 'vendor/autoload.php';
use Sunra\PhpSimple\HtmlDomParser;
$html = HtmlDomParser::file_get_html('https://demo.opencart.com/');
$elements = $html->find('.col');
foreach ($elements as $element) {
$image = $element->find('img', 0)->src;
$title = $element->find('h4', 0)->plaintext;
$link = $element->find('h4 > a', 0)->href;
$desc = $element->find('p', 0)->plaintext;
$old_p_element = $element->find('span.price-old', 0);
$old_p = $old_p_element ? $old_p_element->plaintext : '-';
$new_p = $element->find('span.price-new', 0)->plaintext;
$tax = $element->find('span.price-tax', 0)->plaintext;
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
$html->clear();
?>
Das Ergebnis sind die gleichen Daten wie in den vorherigen Beispielen, aber in nur wenigen Zeilen Code.
Selen
Wir haben schon oft über Selenium in Sammlungen für andere Programmiersprachen wie Python, R, Ruby und C# geschrieben. Wir möchten diese Bibliothek erneut besprechen, weil sie unglaublich praktisch ist. Sie hat eine gut geschriebene Dokumentation und eine aktive Community, die sie unterstützt.
Vor- und Nachteile der Bibliothek
Diese Bibliothek hat viele Vorteile und nur wenige Nachteile. Sie wird von der Community hervorragend unterstützt, hat eine umfangreiche Dokumentation und wird ständig weiterentwickelt und verbessert.
Selenium ermöglicht Ihnen die Verwendung von Headless Browsern, um echtes Benutzerverhalten zu simulieren. Das bedeutet, dass Sie das Risiko einer Entdeckung beim Scraping verringern können. Außerdem können Sie mit Elementen auf einer Webseite interagieren, z. B. Formulare ausfüllen oder auf Schaltflächen klicken.
Was die Nachteile betrifft, so ist es in PHP nicht so populär wie NodeJS oder Python und kann für Anfänger eine Herausforderung darstellen.
Beispiel für die Verwendung
Schauen wir uns nun ein Beispiel für die Verwendung von Selenium an. Damit es funktioniert, benötigen wir einen Webtreiber. Wir werden den Chrome-Web-Treiber verwenden. Stellen Sie sicher, dass er mit der auf Ihrem Computer installierten Version des Chrome-Browsers übereinstimmt. Entpacken Sie den Webtreiber auf Ihrem Laufwerk C.
Sie können jeden von Ihnen bevorzugten Web-Treiber verwenden. Sie können zum Beispiel Mozilla Firefox oder einen anderen von Selenium unterstützten Treiber wählen.
Um zu beginnen, fügen Sie unserem Projekt die erforderlichen Abhängigkeiten hinzu.
require 'vendor/autoload.php';
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverBy;
Lassen Sie uns nun die Parameter des Hosts angeben, auf dem unser Webtreiber läuft. Führen Sie dazu die Webtreiberdatei aus und sehen Sie nach, auf welchem Port sie gestartet wird.
Geben Sie diese Parameter in dem Skript an:
$host="http://localhost:9515";
Als nächstes müssen wir einen Browser starten und zur Zielressource gehen.
$capabilities = DesiredCapabilities::chrome();
$driver = RemoteWebDriver::create($host, $capabilities);
$driver->get('https://demo.opencart.com/');
Jetzt müssen wir die Produkte auf der Webseite finden, jedes einzelne durchgehen und die gewünschten Daten abrufen. Danach sollten wir die Daten auf dem Bildschirm anzeigen. Das haben wir bereits in früheren Beispielen getan, so dass wir auf diesen Schritt nicht weiter eingehen werden.
$elements = $driver->findElements(WebDriverBy::cssSelector('.col'));
foreach ($elements as $element) {
$image = $element->findElement(WebDriverBy::tagName('img'))->getAttribute('src');
$title = $element->findElement(WebDriverBy::tagName('h4'))->getText();
$link = $element->findElement(WebDriverBy::cssSelector('h4 > a'))->getAttribute('href');
$desc = $element->findElement(WebDriverBy::tagName('p'))->getText();
$old_p_element = $element->findElement(WebDriverBy::cssSelector('span.price-old'));
$old_p = $old_p_element ? $old_p_element->getText() : '-';
$new_p = $element->findElement(WebDriverBy::cssSelector('span.price-new'))->getText();
$tax = $element->findElement(WebDriverBy::cssSelector('span.price-tax'))->getText();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
Selenium bietet viele Optionen für die Suche nach verschiedenen Elementen auf einer Seite. In diesem Tutorial haben wir die CSS-Selektorsuche und die Tag-Suche verwendet.
Zum Schluss sollten Sie den Browser schließen.
$driver->quit();
Wenn wir das Skript ausführen, wird es den Browser starten, zu der Seite navigieren und ihn nach der Erfassung der Daten schließen.
Wenn Sie verwirrt sind und etwas vermissen, finden Sie hier den vollständigen Skriptcode:
<?php
require 'vendor/autoload.php';
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverBy;
$host="http://localhost:9515";
$capabilities = DesiredCapabilities::chrome();
$driver = RemoteWebDriver::create($host, $capabilities);
$driver->get('https://demo.opencart.com/');
$elements = $driver->findElements(WebDriverBy::cssSelector('.col'));
foreach ($elements as $element) {
$image = $element->findElement(WebDriverBy::tagName('img'))->getAttribute('src');
$title = $element->findElement(WebDriverBy::tagName('h4'))->getText();
$link = $element->findElement(WebDriverBy::cssSelector('h4 > a'))->getAttribute('href');
$desc = $element->findElement(WebDriverBy::tagName('p'))->getText();
$old_p_element = $element->findElement(WebDriverBy::cssSelector('span.price-old'));
$old_p = $old_p_element ? $old_p_element->getText() : '-';
$new_p = $element->findElement(WebDriverBy::cssSelector('span.price-new'))->getText();
$tax = $element->findElement(WebDriverBy::cssSelector('span.price-tax'))->getText();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
$driver->quit();
?>
Wie Sie sehen können, ist Selenium in PHP recht praktisch, aber etwas komplizierter als andere Bibliotheken.
AbfragePfad
QueryPath ist eine Bibliothek zum Extrahieren von Daten aus einer HTML-Seite, Filtern und Verarbeiten von Elementen.
Vor- und Nachteile der Bibliothek
Die QueryPath-Bibliothek ist sehr einfach zu bedienen, so dass sie eine gute Option für Anfänger ist. Sie unterstützt außerdem eine jQuery-ähnliche Syntax für das Parsen und Verarbeiten von HTML/XML. Allerdings ist der Funktionsumfang im Vergleich zu einigen anderen Bibliotheken begrenzt.
Beispiel für die Verwendung
Sie verfügt über ähnliche Befehle für die Suche wie die zuvor besprochenen Bibliotheken. Dank ihrer Einfachheit müssen wir nur eine Anfrage an die Website stellen und die empfangenen Daten verarbeiten. Daher werden wir die Schritte, die wir bereits behandelt haben, nicht wiederholen und ein vollständiges Beispiel für die Verwendung der Bibliothek geben:
<?php
require 'vendor/autoload.php';
use QueryPath\Query;
$html = file_get_contents('https://demo.opencart.com/');
$qp = Query::withHTML($html);
$elements = $qp->find('.col');
foreach ($elements as $element) {
$image = $element->find('img')->attr('src');
$title = $element->find('h4')->text();
$link = $element->find('h4 > a')->attr('href');
$desc = $element->find('p')->text();
$old_p_element = $element->find('span.price-old')->get(0);
$old_p = $old_p_element ? $old_p_element->text() : '-';
$new_p = $element->find('span.price-new')->text();
$tax = $element->find('span.price-tax')->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
$qp->unload();
?>
Wie Sie also sehen, gibt es nur geringe Unterschiede zu den bereits besprochenen Bibliotheken.
AbfrageListe
Der nächste Punkt auf unserer Liste ist die QueryList-Bibliothek. Sie verfügt über mehr Funktionalität als die vorherige Bibliothek. Wir können auch sagen, dass sich die Prinzipien ihrer Verwendung leicht von denen der bereits besprochenen Bibliotheken unterscheiden.
Vor- und Nachteile der Bibliothek
QueryList ist ein leistungsstarkes und flexibles Tool zum Extrahieren und Verarbeiten von Daten aus HTML/XML. Allerdings kann es für Anfänger aufgrund der vielen Funktionen und Merkmale kompliziert sein.
Beispiel für die Verwendung
Verbinden Sie zunächst die Abhängigkeiten und fragen Sie die Zielsite ab.
require 'vendor/autoload.php';
use QL\QueryList;
$html = QueryList::get('https://demo.opencart.com/')->getHtml();
Analysieren Sie dann den HTML-Code der Seite.
$ql = QueryList::html($html);
Verarbeiten wir alle Daten, die wir haben, um die gewünschten Informationen zu extrahieren. Danach erstellen wir einen Datenrahmen und speichern die Daten darin.
$elements = $ql->find('.col')->map(function ($item) {
$image = $item->find('img')->attr('src');
$title = $item->find('h4')->text();
$link = $item->find('h4 > a')->attr('href');
$desc = $item->find('p')->text();
$old_p = $item->find('span.price-old')->text() ?: '-';
$new_p = $item->find('span.price-new')->text();
$tax = $item->find('span.price-tax')->text();
return [
'Image' => $image,
'Title' => $title,
'Link' => $link,
'Description' => $desc,
'Old Price' => $old_p,
'New Price' => $new_p,
'Tax' => $tax
];
});
Gehen wir nun die einzelnen Elemente durch und drucken sie auf dem Display aus:
foreach ($elements as $element) {
foreach ($element as $key => $value) {
echo $key . ': ' . $value . "\n";
}
echo "\n";
}
Das war's, wir haben die Daten, die wir brauchen, und wenn Sie etwas übersehen haben, geben wir Ihnen den vollständigen Code:
<?php
require 'vendor/autoload.php';
use QL\QueryList;
$html = QueryList::get('https://demo.opencart.com/')->getHtml();
$ql = QueryList::html($html);
$elements = $ql->find('.col')->map(function ($item) {
$image = $item->find('img')->attr('src');
$title = $item->find('h4')->text();
$link = $item->find('h4 > a')->attr('href');
$desc = $item->find('p')->text();
$old_p = $item->find('span.price-old')->text() ?: '-';
$new_p = $item->find('span.price-new')->text();
$tax = $item->find('span.price-tax')->text();
return [
'Image' => $image,
'Title' => $title,
'Link' => $link,
'Description' => $desc,
'Old Price' => $old_p,
'New Price' => $new_p,
'Tax' => $tax
];
});
foreach ($elements as $element) {
foreach ($element as $key => $value) {
echo $key . ': ' . $value . "\n";
}
echo "\n";
}
?>
Diese Bibliothek verfügt über viele Funktionen und ein reichhaltiges Angebot an Funktionen. Für Anfänger kann es jedoch eine ziemliche Herausforderung sein, sich darin zurechtzufinden.
DiDOM
Die letzte Bibliothek in unserem Artikel ist DiDom. Sie eignet sich hervorragend, um Daten aus einem HTML-Dokument zu extrahieren und in eine brauchbare Ansicht zu konvertieren.
Vor- und Nachteile der Bibliothek
DiDom ist eine leichtgewichtige Bibliothek mit einfachen und klaren Funktionen. Sie hat auch eine gute Leistung. Leider ist sie weniger populär und hat eine kleinere Support-Community als andere Bibliotheken.
Beispiel für die Verwendung
Verbinden Sie die Abhängigkeiten und stellen Sie eine Anfrage an die Zielsite:
require 'vendor/autoload.php';
use DiDom\Document;
$document = new Document('https://demo.opencart.com/', true);
Finden Sie alle Produkte, die die Klasse ".col" haben:
$elements = $document->find('.col');
Gehen wir sie alle durch, erfassen die Daten und zeigen sie auf dem Bildschirm an:
foreach ($elements as $element) {
$image = $element->find('img', 0)->getAttribute('src');
$title = $element->find('h4', 0)->text();
$link = $element->find('h4 > a', 0)->getAttribute('href');
$desc = $element->find('p', 0)->text();
$old_p_element = $element->find('span.price-old', 0);
$old_p = $old_p_element ? $old_p_element->text() : '-';
$new_p = $element->find('span.price-new', 0)->text();
$tax = $element->find('span.price-tax', 0)->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
Jetzt ist das Skript fertig und Sie können die Daten auf jede beliebige Weise verarbeiten. Außerdem fügen wir ein vollständiges Code-Beispiel bei:
<?php
require 'vendor/autoload.php';
use DiDom\Document;
$document = new Document('https://demo.opencart.com/', true);
$elements = $document->find('.col');
foreach ($elements as $element) {
$image = $element->find('img', 0)->getAttribute('src');
$title = $element->find('h4', 0)->text();
$link = $element->find('h4 > a', 0)->getAttribute('href');
$desc = $element->find('p', 0)->text();
$old_p_element = $element->find('span.price-old', 0);
$old_p = $old_p_element ? $old_p_element->text() : '-';
$new_p = $element->find('span.price-new', 0)->text();
$tax = $element->find('span.price-tax', 0)->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
?>
Damit ist unsere Sammlung der besten PHP-Scraping-Bibliotheken abgeschlossen. Jetzt ist es an der Zeit, die beste Bibliothek aus allen getesteten Bibliotheken auszuwählen.
Die beste PHP-Bibliothek für Scraping
Die Wahl der besten Web Scraping PHP-Bibliothek hängt von mehreren Faktoren ab: Projektziele, Anforderungen und Ihre Programmierkenntnisse. Um Ihnen die Entscheidung zu erleichtern, haben wir die in diesem Artikel besprochenen Schlüsselinformationen zusammengetragen und eine Vergleichstabelle der 10 besten Scraping-Bibliotheken erstellt.
Bibliothek | Profis | Nachteile | Scraping dynamischer Daten | Benutzerfreundlichkeit |
---|---|---|---|---|
Guzzle |
|
|
Nein | Zwischenstufe |
HTTPful |
|
|
Nein | Anfänger |
Symfony |
|
|
Ja | Fortgeschrittene |
Goutte |
|
|
Nein | Anfänger |
Scrape-It.Cloud |
|
Ja | Anfänger | |
Einfaches HTML DOM |
|
|
Nein | Anfänger |
Selen |
|
|
Ja | Zwischenstufe |
AbfragePfad |
|
|
Nein | Zwischenstufe |
AbfrageListe |
|
|
Ja | Zwischenstufe |
DiDom |
|
|
Nein | Anfänger |
Dies wird Ihnen helfen, die beste PHP Scraping-Bibliothek zu finden, mit der Sie Ihre Ziele perfekt erreichen können.
Fazit und Schlussfolgerungen
In diesem Artikel haben wir uns mit der Einrichtung einer PHP-Programmierumgebung befasst und die Möglichkeiten zur Automatisierung der Integration und Aktualisierung von Bibliotheken untersucht. Außerdem haben wir die 10 besten Web-Scraping-Bibliotheken vorgestellt, die Ihnen verschiedene Optionen für Ihre Scraping-Projekte bieten.
Wenn Sie jedoch Schwierigkeiten bei der Auswahl der besten Bibliothek haben, haben wir alle in Frage kommenden Bibliotheken miteinander verglichen. Wenn Sie aber immer noch nicht wissen, was Sie wählen sollen, können Sie unsere Web Scraping API ausprobieren. Sie vereinfacht nicht nur den Prozess der Datenerfassung, sondern hilft auch bei der Bewältigung möglicher Herausforderungen. Mit ihren Fähigkeiten können Sie Aufgaben zur Datenerfassung automatisieren und alle Schwierigkeiten überwinden.