Este paquete proporciona una clase para rastrear enlaces en un sitio web. Debajo del capó, las promesas de Guzzle se utilizan para rastrear varias URL al mismo tiempo.
Debido a que el rastreador puede ejecutar JavaScript, puede rastrear sitios renderizados con JavaScript. Debajo del capó, se utilizan Chrome y Puppeteer para potenciar esta función.
Invertimos muchos recursos en la creación de los mejores paquetes de código abierto. Puedes apoyarnos comprando uno de nuestros productos pagos.
Apreciamos mucho que nos envíe una postal desde su ciudad natal, mencionando cuál de nuestros paquetes está utilizando. Encontrarás nuestra dirección en nuestra página de contacto. Publicamos todas las postales recibidas en nuestro muro virtual de postales.
Este paquete se puede instalar a través de Composer:
el compositor requiere spatie/crawler
Se puede crear una instancia del rastreador de esta manera.
utilizar SpatieCrawlerCrawler; Rastreador::crear() ->setCrawlObserver(<clase que extiende SpatieCrawlerCrawlObserversCrawlObserver>) ->startCrawling($url);
El argumento pasado a setCrawlObserver
debe ser un objeto que extienda la clase abstracta SpatieCrawlerCrawlObserversCrawlObserver
:
espacio de nombres SpatieCrawlerCrawlObservers; use GuzzleHttpExceptionRequestException; use PsrHttpMessageResponseInterface; use PsrHttpMessageUriInterface; clase abstracta CrawlObserver {/* * Se llama cuando el rastreador rastreará la URL. */función pública willCrawl(UriInterface $url,?cadena $linkText): void{ }/* * Se llama cuando el rastreador ha rastreado correctamente la URL proporcionada. */función pública abstracta rastreada(UriInterface $url,ResponseInterface $respuesta, ?UriInterface $foundOnUrl = nulo, ?cadena $enlaceTexto, ): void;/* * Se llama cuando el rastreador tuvo un problema al rastrear la URL proporcionada. */rastreo de función pública abstractaFailed(UriInterface $url,RequestException $requestException, ?UriInterface $foundOnUrl = nulo, ?cadena $textoenlace = nulo, ): void;/** * Se llama cuando finaliza el rastreo. */función pública terminadaCrawling(): void{ } }
Puedes configurar varios observadores con setCrawlObservers
:
Rastreador::crear() ->setCrawlObservers([ <clase que extiende SpatieCrawlerCrawlObserversCrawlObserver>, <clase que extiende SpatieCrawlerCrawlObserversCrawlObserver>, ... ]) ->startCrawling($url);
Alternativamente, puedes configurar varios observadores uno por uno con addCrawlObserver
:
Rastreador::crear() ->addCrawlObserver(<clase que extiende SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<clase que extiende SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<clase que extiende SpatieCrawlerCrawlObserversCrawlObserver>) ->startCrawling($url);
De forma predeterminada, el rastreador no ejecutará JavaScript. Así es como puedes habilitar la ejecución de JavaScript:
Rastreador::crear() ->ejecutarJavaScript() ...
Para que sea posible obtener el cuerpo html después de ejecutar javascript, este paquete depende de nuestro paquete Browsershot. Este paquete utiliza Puppeteer bajo el capó. A continuación se ofrecen algunos consejos sobre cómo instalarlo en su sistema.
Browsershot hará una suposición fundamentada sobre dónde están instaladas sus dependencias en su sistema. De forma predeterminada, el rastreador creará una nueva instancia de Browsershot. Es posible que necesite configurar una instancia creada personalizada utilizando el método setBrowsershot(Browsershot $browsershot)
.
Rastreador::crear() ->setBrowsershot($browsershot) ->ejecutarJavaScript() ...
Tenga en cuenta que el rastreador seguirá funcionando incluso si no tiene las dependencias del sistema requeridas por Browsershot. Estas dependencias del sistema solo son necesarias si llamas a executeJavaScript()
.
Puede indicarle al rastreador que no visite determinadas URL utilizando la función setCrawlProfile
. Esa función espera un objeto que extienda SpatieCrawlerCrawlProfilesCrawlProfile
:
/* * Determinar si se debe rastrear la URL proporcionada. */función pública deberíaCrawl(UriInterface $url): bool;
Este paquete viene con tres CrawlProfiles
listos para usar:
CrawlAllUrls
: este perfil rastreará todas las URL de todas las páginas, incluidas las URL de un sitio externo.
CrawlInternalUrls
: este perfil solo rastreará las URL internas de las páginas de un host.
CrawlSubdomains
: este perfil solo rastreará las URL internas y sus subdominios en las páginas de un host.
Puede personalizar cómo se extraen los enlaces de una página pasando un UrlParser
personalizado al rastreador.
Rastreador::crear() ->setUrlParserClass(<clase que implementa SpatieCrawlerUrlParsersUrlParser>::clase) ...
De forma predeterminada, se utiliza LinkUrlParser
. Este analizador extraerá todos los enlaces del atributo href
de a
etiqueta.
También hay un SitemapUrlParser
integrado que extraerá y rastreará todos los enlaces de un mapa del sitio. Admite archivos de índice de mapas de sitios.
Rastreador::crear() ->setUrlParserClass(Mapa del sitioUrlParser::clase) ...
De forma predeterminada, el rastreador respetará los datos de los robots. Es posible desactivar estas comprobaciones de esta manera:
Rastreador::crear() ->ignorarRobots() ...
Los datos de los robots pueden provenir de un archivo robots.txt
, metaetiquetas o encabezados de respuesta. Puede encontrar más información sobre las especificaciones aquí: http://www.robotstxt.org/.
El análisis de los datos de los robots se realiza mediante nuestro paquete spatie/robots-txt.
De forma predeterminada, el rastreador rechazará todos los enlaces que contengan el atributo rel="nofollow". Es posible desactivar estas comprobaciones de esta manera:
Rastreador::crear() ->aceptarEnlacesNofollow() ...
Para respetar las reglas de robots.txt para un agente de usuario personalizado, puede especificar su propio agente de usuario personalizado.
Rastreador::crear() ->setUserAgent('mi-agente')
Puede agregar su grupo de reglas de rastreo específico para 'mi-agente' en robots.txt. Este ejemplo no permite rastrear todo el sitio en busca de rastreadores identificados por "mi-agente".
// No permitir el rastreo de mi agente Agente-usuario: mi-agente No permitir: /
Para mejorar la velocidad del rastreo, el paquete rastrea simultáneamente 10 URL de forma predeterminada. Si desea cambiar ese número, puede utilizar el método setConcurrency
.
Rastreador::crear() ->setConcurrency(1) // ahora todas las URL se rastrearán una por una
De forma predeterminada, el rastreador continúa hasta que ha rastreado todas las páginas que puede encontrar. Este comportamiento puede causar problemas si trabaja en un entorno con limitaciones, como un entorno sin servidor.
El comportamiento de rastreo se puede controlar con las dos opciones siguientes:
Límite total de rastreo ( setTotalCrawlLimit
): este límite define el recuento máximo de URL para rastrear.
Límite de rastreo actual ( setCurrentCrawlLimit
): esto define cuántas URL se procesan durante el rastreo actual.
Echemos un vistazo a algunos ejemplos para aclarar la diferencia entre estos dos métodos.
El método setTotalCrawlLimit
le permite limitar la cantidad total de URL a rastrear, sin importar la frecuencia con la que llame al rastreador.
$queue = <su selección/implementación de una cola>;// Rastrea 5 URL y finaliza.Crawler::create() ->setCrawlQueue($cola) ->establecer límite de rastreo total(5) ->startCrawling($url);// No se rastrea más cuando se alcanza el límite total.Crawler::create() ->setCrawlQueue($cola) ->establecer límite de rastreo total (5) ->startCrawling($url);
setCurrentCrawlLimit
establecerá un límite sobre cuántas URL se rastrearán por ejecución. Este fragmento de código procesará 5 páginas con cada ejecución, sin un límite total de páginas para rastrear.
$queue = <su selección/implementación de una cola>;// Rastrea 5 URL y finaliza.Crawler::create() ->setCrawlQueue($cola) ->establecer límite de rastreo actual(5) ->startCrawling($url);// Rastrea las siguientes 5 URL y finaliza.Crawler::create() ->setCrawlQueue($cola) ->establecer límite de rastreo actual(5) ->startCrawling($url);
Ambos límites se pueden combinar para controlar el rastreador:
$queue = <su selección/implementación de una cola>;// Rastrea 5 URL y finaliza.Crawler::create() ->setCrawlQueue($cola) ->establecer límite de rastreo total (10) ->establecer límite de rastreo actual(5) ->startCrawling($url);// Rastrea las siguientes 5 URL y finaliza.Crawler::create() ->setCrawlQueue($cola) ->establecer límite de rastreo total (10) ->establecer límite de rastreo actual(5) ->startCrawling($url);// No se rastrea más cuando se alcanza el límite total.Crawler::create() ->setCrawlQueue($cola) ->establecer límite de rastreo total (10) ->establecer límite de rastreo actual(5) ->startCrawling($url);
Puede utilizar setCurrentCrawlLimit
para interrumpir rastreos de larga duración. El siguiente ejemplo demuestra un enfoque (simplificado). Se compone de una solicitud inicial y cualquier cantidad de solicitudes de seguimiento que continúan el rastreo.
Para comenzar a rastrear diferentes solicitudes, deberá crear una nueva cola del controlador de cola seleccionado. Comience pasando la instancia de cola al rastreador. El rastreador comenzará a llenar la cola a medida que se procesen las páginas y se descubran nuevas URL. Serializar y almacenar la referencia de la cola una vez que el rastreador haya finalizado (utilizando el límite de rastreo actual).
// Crea una cola usando tu controlador de cola.$queue = <tu selección/implementación de una cola>;// Rastrea el primer conjunto de URLsCrawler::create() ->setCrawlQueue($cola) ->establecer límite de rastreo actual (10) ->startCrawling($url);// Serializa y almacena tu cola$serializedQueue = serialize($queue);
Para las siguientes solicitudes, deberá deserializar su cola original y pasarla al rastreador:
// Deserializar cola$queue = unserialize($serializedQueue);// Rastrea el siguiente conjunto de URLsCrawler::create() ->setCrawlQueue($cola) ->establecer límite de rastreo actual (10) ->startCrawling($url);// Serializa y almacena tu cola$serialized_queue = serialize($queue);
El comportamiento se basa en la información de la cola. Solo si se pasa la misma instancia de cola en el comportamiento funciona como se describe. Cuando se pasa una cola completamente nueva, no se aplicarán los límites de rastreos anteriores, incluso para el mismo sitio web.
Puede encontrar un ejemplo con más detalles aquí.
De forma predeterminada, el rastreador continúa hasta haber rastreado todas las páginas de la URL proporcionada. Si desea limitar la profundidad del rastreador, puede utilizar el método setMaximumDepth
.
Rastreador::crear() ->establecer profundidad máxima(2)
La mayoría de las páginas HTML son bastante pequeñas. Pero el rastreador podría detectar accidentalmente archivos grandes como PDF y MP3. Para mantener bajo el uso de la memoria en tales casos, el rastreador solo utilizará respuestas que tengan menos de 2 MB. Si, al transmitir una respuesta, ésta supera los 2 MB, el rastreador dejará de transmitir la respuesta. Se asumirá un cuerpo de respuesta vacío.
Puede cambiar el tamaño máximo de respuesta.
// usemos un máximo de 3 MB.Crawler::create() ->establecerTamaño de respuesta máxima (1024 * 1024 * 3)
En algunos casos, es posible que la velocidad se limite si el rastreo es demasiado agresivo. Para evitar esto, puede utilizar el método setDelayBetweenRequests()
para agregar una pausa entre cada solicitud. Este valor se expresa en milisegundos.
Rastreador::crear() ->setDelayBetweenRequests(150) // Después de cada página rastreada, el rastreador esperará 150 ms
De forma predeterminada, cada página encontrada se descargará (hasta el tamaño de setMaximumResponseSize()
) y se analizará en busca de enlaces adicionales. Puede limitar qué tipos de contenido deben descargarse y analizarse configurando setParseableMimeTypes()
con una variedad de tipos permitidos.
Rastreador::crear() ->setParseableMimeTypes(['texto/html', 'texto/plain'])
Esto evitará descargar el cuerpo de páginas que tienen diferentes tipos de mime, como archivos binarios, audio/vídeo, ... que es poco probable que tengan enlaces incrustados. Esta característica ahorra principalmente ancho de banda.
Al rastrear un sitio, el rastreador pondrá las URL que se rastrearán en una cola. De forma predeterminada, esta cola se almacena en la memoria mediante el ArrayCrawlQueue
integrado.
Cuando un sitio es muy grande, es posible que desee almacenar esa cola en otro lugar, tal vez en una base de datos. En tales casos, puede escribir su propia cola de rastreo.
Una cola de rastreo válida es cualquier clase que implemente la interfaz SpatieCrawlerCrawlQueuesCrawlQueue
. Puede pasar su cola de rastreo personalizada a través del método setCrawlQueue
en el rastreador.
Rastreador::crear() ->setCrawlQueue(<implementación de SpatieCrawlerCrawlQueuesCrawlQueue>)
Aquí
matrizrastreocola
RedisCrawlQueue (paquete de terceros)
CacheCrawlQueue para Laravel (paquete de terceros)
Modelo Laravel como cola (aplicación de ejemplo de terceros)
De forma predeterminada, el rastreador establecerá el esquema de URL base en http
si no hay ninguno. Tienes la posibilidad de cambiar eso con setDefaultScheme
.
Rastreador::crear() ->setDefaultScheme('https')
Consulte CHANGELOG para obtener más información sobre los cambios recientes.
Consulte CONTRIBUCIÓN para obtener más detalles.
Primero, instale la dependencia Puppeteer o sus pruebas fallarán.
npm install puppeteer
Para ejecutar las pruebas, primero deberá iniciar el servidor basado en nodos incluido en una ventana de terminal separada.
pruebas de cd/servidor instalación npm servidor de nodo.js
Con el servidor en ejecución, puede comenzar a realizar pruebas.
prueba de compositor
Si encuentra un error relacionado con la seguridad, envíe un correo electrónico a [email protected] en lugar de utilizar el rastreador de problemas.
Eres libre de utilizar este paquete, pero si llega a tu entorno de producción, te agradeceremos mucho que nos envíes una postal desde tu ciudad natal, mencionando cuál de nuestros paquetes estás utilizando.
Nuestra dirección es: Spatie, Kruikstraat 22, 2018 Amberes, Bélgica.
Publicamos todas las postales recibidas en el sitio web de nuestra empresa.
Freek Van der Herten
Todos los contribuyentes
La Licencia MIT (MIT). Consulte el archivo de licencia para obtener más información.