Ce package fournit une classe pour explorer les liens sur un site Web. Sous le capot, les promesses Guzzle sont utilisées pour explorer plusieurs URL simultanément.
Étant donné que le robot d'exploration peut exécuter du JavaScript, il peut explorer les sites rendus en JavaScript. Sous le capot, Chrome et Puppeteer sont utilisés pour alimenter cette fonctionnalité.
Nous investissons beaucoup de ressources dans la création des meilleurs packages open source de leur catégorie. Vous pouvez nous soutenir en achetant l'un de nos produits payants.
Nous apprécions grandement que vous nous envoyiez une carte postale de votre ville natale, mentionnant le(s) forfait(s) que vous utilisez. Vous trouverez notre adresse sur notre page contact. Nous publions toutes les cartes postales reçues sur notre mur virtuel de cartes postales.
Ce package peut être installé via Composer :
le compositeur nécessite spatie/crawler
Le robot d'exploration peut être instancié comme ceci
utilisez SpatieCrawlerCrawler ; Crawler ::create() ->setCrawlObserver(<classe qui étend SpatieCrawlerCrawlObserversCrawlObserver>) ->startCrawling($url);
L'argument passé à setCrawlObserver
doit être un objet qui étend la classe abstraite SpatieCrawlerCrawlObserversCrawlObserver
:
espace de noms SpatieCrawlerCrawlObservers ; utilisez GuzzleHttpExceptionRequestException ; utilisez PsrHttpMessageResponseInterface ; utilisez PsrHttpMessageUriInterface ; classe abstraite CrawlObserver {/* * Appelé lorsque le robot explore l'URL. */public function willCrawl(UriInterface $url, ?string $linkText) : void{ }/* * Appelé lorsque le robot a exploré avec succès l'URL donnée. */fonction publique abstraite analysée (UriInterface $url,ResponseInterface $response, ?UriInterface $foundOnUrl = nul, ?string $lienTexte, ): void;/* * Appelé lorsque le robot a rencontré un problème pour explorer l'URL donnée. */abstract public function crawlFailed(UriInterface $url,RequestException $requestException, ?UriInterface $foundOnUrl = nul, ?string $linkText = nul, ): void;/** * Appelé lorsque l'analyse est terminée. */fonction publique finishCrawling() : void{ } }
Vous pouvez définir plusieurs observateurs avec setCrawlObservers
:
Crawler ::create() ->setCrawlObservers([ <classe qui étend SpatieCrawlerCrawlObserversCrawlObserver>, <classe qui étend SpatieCrawlerCrawlObserversCrawlObserver>, ... ]) ->startCrawling($url);
Alternativement, vous pouvez définir plusieurs observateurs un par un avec addCrawlObserver
:
Crawler ::create() ->addCrawlObserver(<classe qui étend SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<classe qui étend SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<classe qui étend SpatieCrawlerCrawlObserversCrawlObserver>) ->startCrawling($url);
Par défaut, le robot n'exécutera pas JavaScript. Voici comment activer l'exécution de JavaScript :
Crawler ::create() ->exécuterJavaScript() ...
Afin de permettre d'obtenir le corps HTML après l'exécution du javascript, ce package dépend de notre package Browsershot. Ce package utilise Puppeteer sous le capot. Voici quelques conseils sur la façon de l’installer sur votre système.
Browsershot fera une estimation éclairée de l'endroit où ses dépendances sont installées sur votre système. Par défaut, le Crawler instanciera une nouvelle instance de Browsershot. Vous devrez peut-être définir une instance créée personnalisée à l'aide de la méthode setBrowsershot(Browsershot $browsershot)
.
Crawler ::create() ->setBrowsershot($browsershot) ->exécuterJavaScript() ...
Notez que le robot fonctionnera toujours même si vous ne disposez pas des dépendances système requises par Browsershot. Ces dépendances système ne sont requises que si vous appelez executeJavaScript()
.
Vous pouvez indiquer au robot d'exploration de ne pas visiter certaines URL en utilisant la fonction setCrawlProfile
. Cette fonction attend un objet qui étend SpatieCrawlerCrawlProfilesCrawlProfile
:
/* * Détermine si l'URL donnée doit être explorée. */fonction publique ShouldCrawl(UriInterface $url): bool;
Ce package est livré avec trois CrawlProfiles
prêts à l'emploi :
CrawlAllUrls
: ce profil explorera toutes les URL de toutes les pages, y compris les URL vers un site externe.
CrawlInternalUrls
: ce profil explorera uniquement les urls internes sur les pages d'un hébergeur.
CrawlSubdomains
: ce profil explorera uniquement les urls internes et ses sous-domaines sur les pages d'un hébergeur.
Vous pouvez personnaliser la façon dont les liens sont extraits d'une page en transmettant un UrlParser
personnalisé au robot d'exploration.
Crawler ::create() ->setUrlParserClass(<classe qui implémente SpatieCrawlerUrlParsersUrlParser>::class) ...
Par défaut, LinkUrlParser
est utilisé. Cet analyseur extraira tous les liens de l'attribut href
d' a
balise.
Il existe également un SitemapUrlParser
intégré qui extraira et explorera tous les liens d'un plan de site. Il prend en charge les fichiers d'index de plan de site.
Crawler ::create() ->setUrlParserClass(SitemapUrlParser::class) ...
Par défaut, le robot respectera les données des robots. Il est possible de désactiver ces vérifications comme ceci :
Crawler ::create() ->ignorerRobots() ...
Les données des robots peuvent provenir d'un fichier robots.txt
, de balises méta ou d'en-têtes de réponse. Plus d'informations sur les spécifications peuvent être trouvées ici : http://www.robotstxt.org/.
L'analyse des données des robots est effectuée par notre package spatie/robots-txt.
Par défaut, le robot rejettera tous les liens contenant l'attribut rel="nofollow". Il est possible de désactiver ces vérifications comme ceci :
Crawler ::create() ->accepterNofollowLinks() ...
Afin de respecter les règles robots.txt pour un agent utilisateur personnalisé, vous pouvez spécifier votre propre agent utilisateur personnalisé.
Crawler ::create() ->setUserAgent('mon-agent')
Vous pouvez ajouter votre groupe de règles d'analyse spécifique pour « mon-agent » dans robots.txt. Cet exemple interdit l'exploration de l'intégralité du site pour les robots identifiés par « mon-agent ».
// Interdire l'exploration pour mon-agent Agent utilisateur : mon-agent Interdire : /
Pour améliorer la vitesse d'analyse, le package analyse simultanément 10 URL par défaut. Si vous souhaitez modifier ce numéro, vous pouvez utiliser la méthode setConcurrency
.
Crawler ::create() ->setConcurrency(1) // désormais toutes les URL seront explorées une par une
Par défaut, le robot continue jusqu'à ce qu'il ait exploré toutes les pages qu'il peut trouver. Ce comportement peut entraîner des problèmes si vous travaillez dans un environnement comportant des limitations, tel qu'un environnement sans serveur.
Le comportement d'exploration peut être contrôlé avec les deux options suivantes :
Limite totale d'exploration ( setTotalCrawlLimit
) : cette limite définit le nombre maximal d'URL à explorer.
Limite d'exploration actuelle ( setCurrentCrawlLimit
) : ceci définit le nombre d'URL traitées au cours de l'analyse en cours.
Jetons un coup d'œil à quelques exemples pour clarifier la différence entre ces deux méthodes.
La méthode setTotalCrawlLimit
vous permet de limiter le nombre total d'URL à explorer, quelle que soit la fréquence à laquelle vous appelez le robot.
$queue = <votre sélection/implémentation d'une file d'attente>;// Crawler 5 URL et se termine.Crawler::create() ->setCrawlQueue($file d'attente) ->setTotalCrawlLimit(5) ->startCrawling($url);// N'explore pas plus loin lorsque la limite totale est atteinte.Crawler::create() ->setCrawlQueue($file d'attente) ->setTotalCrawlLimit(5) ->startCrawling($url);
Le setCurrentCrawlLimit
définira une limite sur le nombre d'URls qui seront analysées par exécution. Ce morceau de code traitera 5 pages à chaque exécution, sans limite totale de pages à explorer.
$queue = <votre sélection/implémentation d'une file d'attente>;// Crawler 5 URL et se termine.Crawler::create() ->setCrawlQueue($file d'attente) ->setCurrentCrawlLimit(5) ->startCrawling($url);// Analyse les 5 URL suivantes et termine.Crawler::create() ->setCrawlQueue($file d'attente) ->setCurrentCrawlLimit(5) ->startCrawling($url);
Les deux limites peuvent être combinées pour contrôler le robot :
$queue = <votre sélection/implémentation d'une file d'attente>;// Crawler 5 URL et se termine.Crawler::create() ->setCrawlQueue($file d'attente) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->startCrawling($url);// Analyse les 5 URL suivantes et termine.Crawler::create() ->setCrawlQueue($file d'attente) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->startCrawling($url);// N'explore pas plus loin lorsque la limite totale est atteinte.Crawler::create() ->setCrawlQueue($file d'attente) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->startCrawling($url);
Vous pouvez utiliser setCurrentCrawlLimit
pour interrompre les analyses de longue durée. L'exemple suivant illustre une approche (simplifiée). Il est composé d'une demande initiale et d'un certain nombre de demandes de suivi poursuivant l'exploration.
Pour commencer à explorer différentes requêtes, vous devrez créer une nouvelle file d'attente du pilote de file d'attente sélectionné. Commencez par transmettre l’instance de file d’attente au robot d’exploration. Le robot d'exploration commencera à remplir la file d'attente au fur et à mesure que les pages seront traitées et que de nouvelles URL seront découvertes. Sérialisez et stockez la référence de file d'attente une fois le robot d'exploration terminé (en utilisant la limite d'analyse actuelle).
// Créez une file d'attente à l'aide de votre pilote de file d'attente.$queue = <votre sélection/implémentation d'une file d'attente>;// Explorez le premier ensemble d'URLsCrawler::create() ->setCrawlQueue($file d'attente) ->setCurrentCrawlLimit(10) ->startCrawling($url);// Sérialisez et stockez votre file d'attente$serializedQueue = serialize($queue);
Pour toutes les requêtes suivantes, vous devrez désérialiser votre file d'attente d'origine et la transmettre au robot :
// Unserialize queue$queue = unserialize($serializedQueue);// Analyse l'ensemble suivant d'URLsCrawler::create() ->setCrawlQueue($file d'attente) ->setCurrentCrawlLimit(10) ->startCrawling($url);// Sérialisez et stockez votre file d'attente$serialized_queue = serialize($queue);
Le comportement est basé sur les informations contenues dans la file d'attente. Ce n'est que si la même instance de file d'attente est transmise que le comportement fonctionne comme décrit. Lorsqu'une toute nouvelle file d'attente est transmise, les limites des analyses précédentes - même pour le même site Web - ne s'appliqueront pas.
Un exemple avec plus de détails peut être trouvé ici.
Par défaut, le robot continue jusqu'à ce qu'il ait exploré chaque page de l'URL fournie. Si vous souhaitez limiter la profondeur du robot, vous pouvez utiliser la méthode setMaximumDepth
.
Crawler ::create() ->setMaximumDepth(2)
La plupart des pages HTML sont assez petites. Mais le robot d’exploration pourrait accidentellement récupérer des fichiers volumineux tels que des PDF et des MP3. Pour maintenir une faible utilisation de la mémoire dans de tels cas, le robot d'exploration n'utilisera que les réponses inférieures à 2 Mo. Si, lors de la diffusion d’une réponse, celle-ci dépasse 2 Mo, le robot d’exploration arrêtera la diffusion de la réponse. Un corps de réponse vide sera supposé.
Vous pouvez modifier la taille maximale de la réponse.
// utilisons 3 Mo maximum.Crawler::create() ->setMaximumResponseSize(1024 * 1024 * 3)
Dans certains cas, votre débit peut être limité lors d'une exploration trop agressive. Pour contourner cela, vous pouvez utiliser la méthode setDelayBetweenRequests()
pour ajouter une pause entre chaque requête. Cette valeur est exprimée en millisecondes.
Crawler ::create() ->setDelayBetweenRequests(150) // Après chaque page explorée, le robot attendra 150 ms
Par défaut, chaque page trouvée sera téléchargée (jusqu'à une taille de setMaximumResponseSize()
) et analysée pour des liens supplémentaires. Vous pouvez limiter les types de contenu à télécharger et analyser en définissant setParseableMimeTypes()
avec un tableau de types autorisés.
Crawler ::create() ->setParseableMimeTypes(['text/html', 'text/plain'])
Cela empêchera de télécharger le corps des pages contenant différents types MIME, comme des fichiers binaires, audio/vidéo, ... qui sont peu susceptibles de contenir des liens intégrés. Cette fonctionnalité permet d'économiser principalement de la bande passante.
Lors de l'exploration d'un site, le robot placera les URL à explorer dans une file d'attente. Par défaut, cette file d'attente est stockée en mémoire à l'aide du ArrayCrawlQueue
intégré.
Lorsqu'un site est très volumineux, vous souhaiterez peut-être stocker cette file d'attente ailleurs, peut-être dans une base de données. Dans de tels cas, vous pouvez écrire votre propre file d’attente d’analyse.
Une file d'attente d'analyse valide est toute classe qui implémente l'interface SpatieCrawlerCrawlQueuesCrawlQueue
. Vous pouvez transmettre votre file d'attente d'analyse personnalisée via la méthode setCrawlQueue
sur le robot d'exploration.
Crawler ::create() ->setCrawlQueue(<implémentation de SpatieCrawlerCrawlQueuesCrawlQueue>)
Ici
ArrayCrawlQueue
RedisCrawlQueue (package tiers)
CacheCrawlQueue pour Laravel (package tiers)
Modèle Laravel en tant que file d'attente (exemple d'application tierce)
Par défaut, le robot définira le schéma d'URL de base sur http
s'il n'y en a pas. Vous avez la possibilité de changer cela avec setDefaultScheme
.
Crawler ::create() ->setDefaultScheme('https')
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
Veuillez consulter CONTRIBUER pour plus de détails.
Tout d’abord, installez la dépendance Puppeteer, sinon vos tests échoueront.
npm install puppeteer
Pour exécuter les tests, vous devrez d'abord démarrer le serveur basé sur les nœuds inclus dans une fenêtre de terminal distincte.
tests cd/serveur installation npm serveur de nœud.js
Une fois le serveur en cours d'exécution, vous pouvez commencer les tests.
test de compositeur
Si vous avez trouvé un bug concernant la sécurité, veuillez envoyer un mail à [email protected] au lieu d'utiliser le suivi des problèmes.
Vous êtes libre d'utiliser ce package, mais s'il parvient à votre environnement de production, nous apprécions grandement que vous nous envoyiez une carte postale de votre ville natale, mentionnant lequel de nos packages vous utilisez.
Notre adresse est : Spatie, Kruikstraat 22, 2018 Anvers, Belgique.
Nous publions toutes les cartes postales reçues sur le site Internet de notre entreprise.
Freek Van der Herten
Tous les contributeurs
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.