Web Scraping mit der Programmiersprache PHP

Leitfäden, How to's, Kratzen, 25.12.20245 Min. gelesen

Web Scraping ist zu einem unverzichtbaren Werkzeug für Entwickler und Datenanalysten geworden, die Informationen aus dem Internet extrahieren und analysieren müssen. Ganz gleich, ob Sie Produktpreise verfolgen, Daten für Forschungszwecke sammeln oder ein benutzerdefiniertes Dashboard erstellen möchten - Web Scraping bietet unendlich viele Möglichkeiten.

Wenn Sie ein PHP-Enthusiast sind, ist Goutte eine fantastische Bibliothek, die Sie für Ihre Web-Scraping-Anforderungen in Betracht ziehen sollten. Goutte ist leichtgewichtig, benutzerfreundlich und leistungsstark und kombiniert die HTTP-Client-Fähigkeiten von Guzzle mit dem DomCrawler von Symfony für reibungsloses und effizientes Web-Scraping.

Dieser Leitfaden führt Sie durch die Grundlagen des Web Scraping mit PHP unter Verwendung von Goutte - von derInstallation und Ihrem ersten Skript bis hin zu fortgeschrittenen Techniken wie Formularverarbeitung und Paginierung.

Warum Goutte für Web Scraping wählen?

Goutte hat aus verschiedenen Gründen an Popularität unter Entwicklern gewonnen und ist zu einer der beliebtesten Scraping-Bibliotheken für PHP geworden:

  • Einfache und saubere API: Goutte bietet eine saubere und intuitive Schnittstelle, die auch für Anfänger leicht zu erlernen ist.
  • Nahtlose Integration: Es kombiniert HTTP-Anfragen mit HTML-Parsing, so dass keine separaten Bibliotheken erforderlich sind.
  • Leistungsstarke Funktionen: Goutte unterstützt fortgeschrittene Funktionen wie die Behandlung von Sitzungen, die Verwaltung von Cookies und die programmgesteuerte Übermittlung von Formularen.
  • Einsteigerfreundlich, aber robust: Von den einfachsten Scraping-Aufgaben bis hin zu komplexeren Projekten bietet es alles, was Sie für den Einstieg brauchen.

Ganz gleich, ob Sie ein PHP-Neuling oder ein erfahrener Entwickler sind, Goutte bietet ein ideales Gleichgewicht zwischen Einfachheit und Leistungsfähigkeit.

Installation der Goutte

Bevor Sie mit dem Programmieren beginnen, sollten Sie sicherstellen, dass die notwendigen Voraussetzungen gegeben sind:

  • Installiertes PHP: Stellen Sie sicher, dass Sie PHP 7.3 oder höher in Ihrer Entwicklungsumgebung installiert haben. Laden Sie PHP direkt über diesen Link herunter.
  • Der Composer ist installiert: Composer ist erforderlich, um Abhängigkeiten zu verwalten und Goutte zu installieren.

Um Goutte zu installieren, führen Sie einfach den folgenden Befehl in Ihrem Terminal aus:

Komponist benötigt fabpot/goutte

Überprüfen Sie nach der Installation, ob die Bibliothek zugänglich ist, indem Sie den Autoloader von Composer in Ihrem Projekt benötigen:

erfordern 'vendor/autoload.php';

Jetzt können Sie mit dem Schaben beginnen!

Ihr erstes Web Scraping Script mit Goutte

Lassen Sie uns mit einem einfachen Beispiel beginnen. Wir werden den Titel einer Webseite mit Hilfe von Goutte scrapen. Im Folgenden finden Sie das grundlegende Skript:

Abrufen und Anzeigen des Seitentitels

<?php
require 'vendor/autoload.php';

use Goutte\Client;

// Initialize Goutte Client
$client = new Client();

// Send a GET request to the target URL
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract the title of the page
$title = $crawler->filter('title')->text();
echo "Page Title: $title\n";

// Extract the titles of the first 5 books
echo "First 5 Book Titles:\n";
$crawler->filter('.product_pod h3 a')->slice(0, 5)->each(function ($node) {
    echo "- " . $node->attr('title') . "\n";
});
?>

Ausgabe:

Titel der Seite: Alle Produkte | Bücher zum Verschrotten - Sandkasten
Die ersten 5 Buchtitel:
- Ein Licht auf dem Dachboden
- Tipping the Velvet
- Soumission
- Sharp Objects
- Sapiens: Eine kurze Geschichte der Menschheit

So einfach ist das! Mit nur ein paar Zeilen Code können Sie die TitelTag einer beliebigen Webseite.

Extrahieren von Daten aus Webseiten

Sobald Sie gelernt haben, wie man eine Webseite abruft, besteht der nächste Schritt darin, bestimmte Daten wie Links oder Inhalte aus bestimmten HTML-Elementen zu extrahieren.

Extracting All Links (`<a>` Tags)

Das folgende Skript extrahiert die href Attribute aller <a> Tags auf einer Webseite:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

Dadurch werden alle auf der Seite vorhandenen Hyperlinks angezeigt.

Inhalt nach Klasse oder ID extrahieren

Goutte macht es einfach, Daten aus HTML zu extrahieren oder zu parsen, indem es Klasse oder ID Selektoren. Für dieses Beispiel verwenden wir den Bücher zu scrapen Website. Konkret werden wir Informationen über jedes Buch abrufen, da sie alle dieselbe Klasse haben, produkt_pod. So sieht es auf der Website aus:

Hier ist ein Beispiel, wie Sie dies mit Goutte erreichen können:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

// Extract elements with class 'product_pod'
$products = $crawler->filter('.product_pod')->each(function ($node) {
    return $node->text();
});

// Print all extracted product details
foreach ($products as $product) {
    echo $product . "\n";
}

Navigieren zwischen Seiten

Nun wollen wir uns ansehen, wie man zwischen den Seiten navigiert oder paginiert. Auf der Beispielseite, die wir verwenden, gibt es eine Schaltfläche "Weiter", die einen Seitenwechsel zur nächsten Seite ermöglicht. Wir werden diese Schaltfläche nutzen, um eine Paginierung zu implementieren.

Zunächst suchen wir die Schaltfläche mit Hilfe ihrer Klasse Attribut mit dem Wert nächste . Innerhalb dieses Elements gibt es eine <a> Tag, der die URL für die nächste Seite enthält. Wenn wir diese URL extrahieren, können wir sie verwenden, um eine neue Anfrage zu senden und nahtlos zur nächsten Seite zu wechseln. nächste Schaltfläche auf der Seite.

So sieht der Code aus, mit dem dies erreicht wird:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Handle pagination using the 'next' button
while ($crawler->filter('li.next a')->count() > 0) {
    $nextLink = $crawler->filter('li.next a')->attr('href');
    $crawler = $client->request('GET', 'https://books.toscrape.com/catalogue/' . $nextLink);
    
    // Extract and print the current page URL
    echo "Currently on: " . $crawler->getUri() . "\n";
}

Mit diesem Ansatz können Sie die Navigation zwischen den Seiten automatisieren und das Scraping von Daten fortsetzen.

Handhabung von Formularen mit Goutte

Goutte ist auch in der Lage, Formulare zu verarbeiten. Um diese Funktionalität zu demonstrieren, verwenden wir diese Website, die ein einziges Eingabefeld hat, wie in der Abbildung unten gezeigt:

So sieht der Code für die Übermittlung dieses Formulars aus:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://www.scrapethissite.com/pages/forms/');

// Submit the search form with a query
$form = $crawler->selectButton('Search')->form();
$form['q'] = 'Canada';

$crawler = $client->submit($form);

// Extract and print the results
$results = $crawler->filter('.team')->each(function ($node) {
    return $node->text();
});

foreach ($results as $result) {
    echo $result . "\n";
}

Dieses Skript füllt ein Formularfeld namens q mit dem Wert Web-Scraping und sendet es ab. Von hier aus können Sie Inhalte aus der Suchergebnisseite extrahieren, genau wie in den früheren Beispielen.

Fehlerbehandlung und bewährte Praktiken

Behandlung von Netzwerkfehlern

Fügen Sie immer eine Fehlerbehandlung hinzu, um unerwartete Situationen wie eine fehlgeschlagene Netzwerkverbindung oder nicht existierende URLs zu bewältigen.

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();

try {
    $crawler = $client->request('GET', 'https://invalid-url-example.com');
    echo "Page title: " . $crawler->filter('title')->text();
} catch (Exception $e) {
    echo "An error occurred: " . $e->getMessage();
}
}

Robots.txt respektieren

Web Scraping sollte immer ethisch und verantwortungsbewusst durchgeführt werden. Die Datei "robots.txt" ist eine einfache Textdatei, die von Websites verwendet wird, um mit Web-Crawlern zu kommunizieren, und die angibt, auf welche Teile der Website zugegriffen werden kann und auf welche nicht. Vor dem Scraping ist es wichtig, die Datei "robots.txt" zu überprüfen, um sicherzustellen, dass Sie die Regeln der Website befolgen und ihre Bedingungen respektieren. Die Nichtbeachtung dieser Richtlinien kann zu rechtlichen und ethischen Problemen führen, daher sollten Sie diesem Schritt in Ihrem Scraping-Prozess immer Priorität einräumen.

Lesen Sie mehr über robots.txt hier.

Ratenbegrenzung

Seien Sie höflich und vermeiden Sie es, zu viele Anfragen in kurzer Zeit zu senden, da dies den Server überlasten und seine Leistung für andere Benutzer beeinträchtigen kann. Es ist eine gute Praxis, eine kurze Verzögerung zwischen den einzelnen Anfragen einzuplanen, um die Belastung des Servers zu minimieren und sicherzustellen, dass er den Datenverkehr effizient verarbeiten kann. Diese Maßnahmen tragen nicht nur zur Stabilität des Servers bei, sondern zeugen auch von einem verantwortungsvollen und rücksichtsvollen Umgang mit den gemeinsamen Ressourcen.

sleep(1); // 1 Sekunde zwischen den Anfragen warten

Häufige Fallstricke

  • Viele moderne Websites nutzen JavaScript, um Inhalte zu laden, was bedeutet, dass herkömmliche Scraping-Tools möglicherweise nicht alle benötigten Daten erfassen. Tools wie Puppeteer oder Selenium können Benutzerinteraktionen simulieren und Inhalte wie in einem Browser laden.
  • Stellen Sie sicher, dass die von Ihnen gescrapten HTTPS-Endpunkte gültige Zertifikate aufweisen, um Fehler zu vermeiden. Ungültige oder abgelaufene Zertifikate können dazu führen, dass Ihr Scraper fehlschlägt oder Sicherheitsbedenken aufkommen. Überprüfen Sie vor dem Scrapen immer den Zertifikatsstatus und ziehen Sie die Verwendung von Bibliotheken in Betracht, die diese Probleme nahtlos lösen.

Schlussfolgerung

Web-Scraping ist ein leistungsfähiges Instrument zur effizienten Datenerfassung, aber es erfordert einen verantwortungsvollen und durchdachten Ansatz, um häufige Fallstricke zu vermeiden und eine ethische Nutzung zu gewährleisten. Durch die Einhaltung von Best Practices, wie z. B. die Einhaltung der Nutzungsbedingungen von Websites, die Implementierung angemessener Verzögerungen zwischen Anfragen und die Verwendung von Tools, die dynamische Inhalte verarbeiten können, können Sie einen Scraper erstellen, der effektiv arbeitet und gleichzeitig die Auswirkungen auf die Server minimiert. Die Überprüfung von HTTPS-Zertifikaten und die Beachtung von Sicherheitsaspekten schützen Ihren Scraper und die von ihm gesammelten Daten. Mit der richtigen Planung und Ausführung kann Web Scraping zu einer unschätzbaren Ressource für Forschung, Analyse und Innovation werden.