Maison >cadre php >Laravel >Utiliser Puppeteer dans Laravel pour collecter le contenu de pages Web chargées de manière asynchrone

Utiliser Puppeteer dans Laravel pour collecter le contenu de pages Web chargées de manière asynchrone

藏色散人
藏色散人avant
2019-10-16 14:24:233569parcourir

Utiliser Puppeteer dans Laravel pour collecter le contenu de pages Web chargées de manière asynchrone

La collecte de contenu Web est un besoin très courant Pour les pages statiques plus traditionnelles, curl peut le gérer. Mais s'il y a du contenu chargé dynamiquement dans la page, comme le contenu textuel des articles chargés via ajax dans certaines pages, et si certaines pages subissent un traitement supplémentaire après le chargement (remplacement de l'adresse de l'image, etc....) et que vous souhaitez collecter ces contenus traités. Alors la superbe boucle est impuissante.

Les personnes qui ont eu des besoins similaires diront peut-être, mon vieux, utilise PhantomJS !

Oui, c'est une solution, et PhantomJS est depuis longtemps l'un des rares outils capables de résoudre de tels besoins.

Mais ce que je souhaite vous présenter aujourd'hui, c'est un outil venu de derrière - le marionnettiste, qui s'est développé rapidement avec l'essor de la technologie Chrome Headless. Et très important, Puppeteer est développé et maintenu par l’équipe officielle de Chrome, qui peut être considérée comme assez fiable !

puppeteer est un package js Si vous souhaitez l'utiliser dans Laravel, vous devez utiliser un autre artefact, spatie/browsershot.

Installer

Installer spatie/browsershot

browsershot est un package de composition de l'équipe principale spatie

$ composer require spatie/browsershot

Install puppeteer

$ npm i puppeteer --save

Vous pouvez également sécuriser le marionnettiste globalement. Mais par expérience personnelle, il est plus recommandé de l'installer dans le projet, car de cette manière, différents projets ne seront pas affectés par le marionnettiste installé globalement en même temps. dans le projet, il est également pratique d'utiliser phpdeployer Upgrade (la mise à niveau de phpdeploy n'affectera pas le fonctionnement des projets en ligne. Vous devez savoir que la mise à niveau/installation de Puppeteer prend beaucoup de temps et que parfois le succès n'est pas garanti).

Lors de l'installation de Puppeteer, Chromium-Browser sera téléchargé. Compte tenu de nos conditions nationales particulières, il est très probable qu'il ne puisse pas être téléchargé. À cet égard, veuillez montrer vos compétences...

<.>

Utilisez

pour collecter le contenu des articles de la page mobile de Toutiao à titre d'exemple.

use Spatie\Browsershot\Browsershot;
public function getBodyHtml()
{
    $newsUrl = &#39;https://m.toutiao.com/i6546884151050502660/&#39;;
    
    $html = Browsershot::url($newsUrl)
        ->windowSize(480, 800)
        ->userAgent(&#39;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&#39;)
        ->mobile()
        ->touch()
        ->bodyHtml();
    \Log::info($html);
}

Après l'exécution, vous pouvez voir le contenu suivant dans le journal (la capture d'écran n'en est qu'une partie)

Utiliser Puppeteer dans Laravel pour collecter le contenu de pages Web chargées de manière asynchrone

De plus, vous pouvez également enregistrer la page sous forme d’image ou de document PDF.

use Spatie\Browsershot\Browsershot;
public function getBodyHtml()
{
    $newsUrl = &#39;https://m.toutiao.com/i6546884151050502660/&#39;;
    
    Browsershot::url($newsUrl)
        ->windowSize(480, 800)
        ->userAgent(&#39;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&#39;)
        ->mobile()
        ->touch()
        ->setDelay(1000)
        ->save(public_path(&#39;images/toutiao.jpg&#39;));
}

Utiliser Puppeteer dans Laravel pour collecter le contenu de pages Web chargées de manière asynchrone

Les cases dans l'image sont liées aux polices système. Une méthode setDelay() est utilisée dans le code pour prendre une capture d'écran après le chargement du contenu. C'est simple et grossier et ce n'est peut-être pas la meilleure solution.

Problèmes possibles

Le système doit prendre en charge le navigateur Chromium. Bien sûr, la plupart des navigateurs le prennent désormais en charge. Sinon, vous ne pouvez rien faire. .

Une fois Puppeteer installé dans le projet, il peut y avoir des problèmes d'autorisation lors de l'appel. Cela nécessite d'accorder les autorisations appropriées au répertoire /node_modules/puppeteer sous le projet.

Résumé

puppeteer est utilisé dans les tests, la collecte et d'autres scénarios, et est un outil très puissant. C'est suffisant pour des tâches de collecte légères, comme cet article, qui sert à collecter quelques petites pages dans Laravel (php), mais si vous avez besoin de collecter rapidement une grande quantité de contenu, Python ou quelque chose du genre

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer