Das Sammeln von Webinhalten ist ein sehr häufiger Bedarf. Bei traditionelleren statischen Seiten kann Curl damit umgehen. Wenn die Seite jedoch dynamisch geladene Inhalte enthält, z. B. den Textinhalt von Artikeln, die auf einigen Seiten über Ajax geladen werden, und wenn einige Seiten nach dem Laden einer zusätzlichen Verarbeitung unterzogen werden (Bildadressenersetzung usw.) und Sie dies möchten Sammeln Sie diese verarbeiteten Inhalte. Dann ist die tolle Locke hilflos.
Leute, die ähnliche Anforderungen erfüllt haben, sagen vielleicht: „Alter Mann, benutze PhantomJS!“
Ja, das ist ein Weg, und PhantomJS ist seit langem eines der wenigen Tools, das solche Anforderungen lösen kann.
Aber was ich heute vorstellen möchte, ist ein Werkzeug, das von hinten kam – Puppenspieler, das sich mit dem Aufkommen der Chrome Headless-Technologie schnell weiterentwickelte. Und ganz wichtig: Puppeteer wird vom offiziellen Chrome-Team entwickelt und gewartet, was als recht zuverlässig gilt!
puppeteer ist ein js-Paket. Wenn Sie es in Laravel verwenden möchten, müssen Sie ein anderes Artefakt verwenden, Spatie/Browsershot.
Installieren
Spatie/Browsershot installieren
Browsershot ist ein Composer-Paket vom Master-Team Spatie
$ composer require spatie/browsershot
Puppenspieler installieren
$ npm i puppeteer --save
Sie können Puppeteer auch global sichern, aber aus persönlicher Erfahrung ist es empfehlenswerter, es im Projekt zu installieren, da auf diese Weise nicht verschiedene Projekte gleichzeitig von der global installierten Installation betroffen sind Im Projekt ist es auch praktisch, das Upgrade von phpdeployer zu verwenden (das Upgrade von phpdeploy hat keinen Einfluss auf den Betrieb von Online-Projekten. Sie müssen wissen, dass das Upgrade/Installieren von Puppeteer sehr zeitaufwändig ist und der Erfolg manchmal nicht garantiert ist).
Bei der Installation von Puppeteer wird der Chromium-Browser wahrscheinlich nicht heruntergeladen. Bitte zeigen Sie diesbezüglich Ihre Fähigkeiten...
Verwenden Sie
, um den Inhalt von Artikeln auf der mobilen Seite von Toutiao heute als Beispiel zu sammeln.
use Spatie\Browsershot\Browsershot; public function getBodyHtml() { $newsUrl = 'https://m.toutiao.com/i6546884151050502660/'; $html = Browsershot::url($newsUrl) ->windowSize(480, 800) ->userAgent('Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36') ->mobile() ->touch() ->bodyHtml(); \Log::info($html); }
Nach dem Ausführen können Sie den folgenden Inhalt im Protokoll sehen (der Screenshot ist nur ein Teil davon)
Darüber hinaus können Sie auch speichern die Seite als Bild oder PDF-Dokument.
use Spatie\Browsershot\Browsershot; public function getBodyHtml() { $newsUrl = 'https://m.toutiao.com/i6546884151050502660/'; Browsershot::url($newsUrl) ->windowSize(480, 800) ->userAgent('Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36') ->mobile() ->touch() ->setDelay(1000) ->save(public_path('images/toutiao.jpg')); }
Die Kästchen im Bild beziehen sich auf die Systemschriftarten. Im Code wird eine setDelay()-Methode verwendet, um nach dem Laden des Inhalts einen Screenshot zu erstellen. Dies ist einfach und grob und möglicherweise nicht die beste Lösung.
Mögliche Probleme
Das System muss den Chromium-Browser unterstützen. Ansonsten können Sie nichts tun. .
Nachdem Puppeteer im Projekt installiert wurde, kann es beim Aufruf zu Berechtigungsproblemen kommen. Dazu müssen dem Verzeichnis /node_modules/puppeteer unter dem Projekt entsprechende Berechtigungen erteilt werden.
Zusammenfassung
puppeteer wird in Test-, Sammlungs- und anderen Szenarien verwendet und ist ein sehr leistungsfähiges Werkzeug. Es reicht für leichte Sammlungsaufgaben wie diesen Artikel, der zum Sammeln einiger kleiner Seiten in Laravel (PHP) verwendet wird. Wenn Sie jedoch schnell eine große Menge an Inhalten sammeln müssen, ist Python oder etwas anderes besser
Das obige ist der detaillierte Inhalt vonVerwendung von Puppeteer in Laravel zum Sammeln asynchron geladener Webseiteninhalte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!