Este pacote fornece uma classe para rastrear links em um site. Nos bastidores, as promessas do Guzzle são usadas para rastrear vários URLs simultaneamente.
Como o rastreador pode executar JavaScript, ele pode rastrear sites renderizados em JavaScript. Nos bastidores, o Chrome e o Puppeteer são usados para potencializar esse recurso.
Investimos muitos recursos na criação dos melhores pacotes de código aberto. Você pode nos apoiar comprando um de nossos produtos pagos.
Agradecemos muito que você nos envie um cartão postal de sua cidade natal, mencionando qual(is) de nossos pacotes você está usando. Você encontrará nosso endereço em nossa página de contato. Publicamos todos os cartões postais recebidos em nosso mural virtual de cartões postais.
Este pacote pode ser instalado via Composer:
compositor requer spatie/crawler
O rastreador pode ser instanciado assim
usar SpatieCrawlerCrawler; Rastreador::criar() ->setCrawlObserver(<classe que estende SpatieCrawlerCrawlObserversCrawlObserver>) ->startCrawling($url);
O argumento passado para setCrawlObserver
deve ser um objeto que estende a classe abstrata SpatieCrawlerCrawlObserversCrawlObserver
:
namespace SpatieCrawlerCrawlObservers;use GuzzleHttpExceptionRequestException;use PsrHttpMessageResponseInterface;use PsrHttpMessageUriInterface;classe abstrata CrawlObserver {/* * Chamado quando o rastreador rastreará o URL. */função pública willCrawl(UriInterface $url, ?string $linkText): void{ }/* * Chamado quando o rastreador rastreou o URL fornecido com êxito. */função pública abstrata rastreada(UriInterface $url,ResponseInterface $response, ?UriInterface $foundOnUrl = nulo, ?string $linkText, ): void;/* * Chamado quando o rastreador teve um problema ao rastrear o URL fornecido. */função pública abstrata crawlFailed(UriInterface $url,RequestException $requestException, ?UriInterface $foundOnUrl = nulo, ?string $linkText = nulo, ): void;/** * Chamado quando o rastreamento termina. */função pública finalizadaCrawling(): void{ } }
Você pode definir vários observadores com setCrawlObservers
:
Rastreador::criar() ->setCrawlObservers([ <classe que estende SpatieCrawlerCrawlObserversCrawlObserver>, <classe que estende SpatieCrawlerCrawlObserversCrawlObserver>, ... ]) ->startCrawling($url);
Alternativamente, você pode definir vários observadores um por um com addCrawlObserver
:
Rastreador::criar() ->addCrawlObserver(<classe que estende SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<classe que estende SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<classe que estende SpatieCrawlerCrawlObserversCrawlObserver>) ->startCrawling($url);
Por padrão, o rastreador não executará JavaScript. É assim que você pode ativar a execução de JavaScript:
Rastreador::criar() ->executarJavaScript() ...
Para que seja possível obter o body html após a execução do javascript, este pacote depende do nosso pacote Browsershot. Este pacote usa o Puppeteer nos bastidores. Aqui estão algumas dicas sobre como instalá-lo em seu sistema.
O Browsershot fará uma estimativa fundamentada de onde suas dependências estão instaladas em seu sistema. Por padrão, o Crawler instanciará uma nova instância do Browsershot. Você pode achar necessário definir uma instância personalizada usando o método setBrowsershot(Browsershot $browsershot)
.
Rastreador::criar() ->setBrowsershot($browsershot) ->executarJavaScript() ...
Observe que o rastreador ainda funcionará mesmo se você não tiver as dependências de sistema exigidas pelo Browsershot. Essas dependências do sistema só serão necessárias se você estiver chamando executeJavaScript()
.
Você pode dizer ao rastreador para não visitar determinados URLs usando a função setCrawlProfile
. Essa função espera um objeto que estenda SpatieCrawlerCrawlProfilesCrawlProfile
:
/* * Determine se o URL fornecido deve ser rastreado. */função pública deveriaCrawl(UriInterface $url): bool;
Este pacote vem com três CrawlProfiles
prontos para uso:
CrawlAllUrls
: este perfil rastreará todos os URLs em todas as páginas, incluindo URLs para um site externo.
CrawlInternalUrls
: este perfil rastreará apenas as URLs internas nas páginas de um host.
CrawlSubdomains
: este perfil rastreará apenas as URLs internas e seus subdomínios nas páginas de um host.
Você pode personalizar como os links são extraídos de uma página passando um UrlParser
personalizado para o rastreador.
Rastreador::criar() ->setUrlParserClass(<classe que implementa SpatieCrawlerUrlParsersUrlParser>::class) ...
Por padrão, o LinkUrlParser
é usado. Este analisador extrairá todos os links do atributo href
de a
tag.
Há também um SitemapUrlParser
integrado que extrairá e rastreará todos os links de um mapa do site. Ele oferece suporte a arquivos de índice de mapa de site.
Rastreador::criar() ->setUrlParserClass(SitemapUrlParser::class) ...
Por padrão, o rastreador respeitará os dados dos robôs. É possível desabilitar essas verificações da seguinte forma:
Rastreador::criar() ->ignorarRobôs() ...
Os dados dos robôs podem vir de um arquivo robots.txt
, meta tags ou cabeçalhos de resposta. Mais informações sobre as especificações podem ser encontradas aqui: http://www.robotstxt.org/.
A análise dos dados dos robôs é feita pelo nosso pacote spatie/robots-txt.
Por padrão, o rastreador rejeitará todos os links que contenham o atributo rel="nofollow". É possível desabilitar essas verificações da seguinte forma:
Rastreador::criar() ->aceitarNofollowLinks() ...
Para respeitar as regras do robots.txt para um User Agent personalizado, você pode especificar seu próprio User Agent personalizado.
Rastreador::criar() ->setUserAgent('meu-agente')
Você pode adicionar seu grupo de regras de rastreamento específico para 'my-agent' no robots.txt. Este exemplo não permite rastrear todo o site em busca de rastreadores identificados por 'meu-agente'.
// Não permite rastreamento para meu agente Agente do usuário: meu agente Proibir: /
Para melhorar a velocidade do rastreamento, o pacote rastreia simultaneamente 10 URLs por padrão. Se você quiser alterar esse número, você pode usar o método setConcurrency
.
Rastreador::criar() ->setConcurrency(1) // agora todos os URLs serão rastreados um por um
Por padrão, o rastreador continua até rastrear todas as páginas que encontrar. Esse comportamento poderá causar problemas se você estiver trabalhando em um ambiente com limitações, como um ambiente sem servidor.
O comportamento de rastreamento pode ser controlado com as duas opções a seguir:
Limite total de rastreamento ( setTotalCrawlLimit
): este limite define a contagem máxima de URLs a serem rastreados.
Limite de rastreamento atual ( setCurrentCrawlLimit
): define quantos URLs são processados durante o rastreamento atual.
Vejamos alguns exemplos para esclarecer a diferença entre esses dois métodos.
O método setTotalCrawlLimit
permite limitar o número total de URLs a serem rastreadas, independentemente da frequência com que você chama o rastreador.
$queue = <sua seleção/implementação de uma fila>;// Rastreia 5 URLs e termina.Crawler::create() ->setCrawlQueue($queue) -> definirTotalCrawlLimit(5) ->startCrawling($url);// Não rastreia mais quando o limite total é atingido.Crawler::create() ->setCrawlQueue($queue) -> definirTotalCrawlLimit(5) ->startCrawling($url);
O setCurrentCrawlLimit
definirá um limite de quantos URls serão rastreados por execução. Este trecho de código processará 5 páginas em cada execução, sem limite total de páginas para rastrear.
$queue = <sua seleção/implementação de uma fila>;// Rastreia 5 URLs e termina.Crawler::create() ->setCrawlQueue($queue) -> definir Limite de Rastreamento Atual (5) ->startCrawling($url);// Rastreia os próximos 5 URLs e termina.Crawler::create() ->setCrawlQueue($queue) -> definir Limite de Rastreamento Atual (5) ->startCrawling($url);
Ambos os limites podem ser combinados para controlar o rastreador:
$queue = <sua seleção/implementação de uma fila>;// Rastreia 5 URLs e termina.Crawler::create() ->setCrawlQueue($queue) -> definirTotalCrawlLimit(10) -> definir Limite de Rastreamento Atual (5) ->startCrawling($url);// Rastreia os próximos 5 URLs e termina.Crawler::create() ->setCrawlQueue($queue) -> definirTotalCrawlLimit(10) -> definir Limite de Rastreamento Atual (5) ->startCrawling($url);// Não rastreia mais quando o limite total é atingido.Crawler::create() ->setCrawlQueue($queue) -> definirTotalCrawlLimit(10) -> definir Limite de Rastreamento Atual (5) ->startCrawling($url);
Você pode usar setCurrentCrawlLimit
para interromper rastreamentos longos. O exemplo a seguir demonstra uma abordagem (simplificada). É composto por uma solicitação inicial e qualquer número de solicitações de acompanhamento que continuam o rastreamento.
Para começar a rastrear diferentes solicitações, você precisará criar uma nova fila do driver de fila selecionado. Comece passando a instância da fila para o rastreador. O rastreador começará a preencher a fila à medida que as páginas forem processadas e novos URLs forem descobertos. Serialize e armazene a referência da fila após a conclusão do rastreador (usando o limite de rastreamento atual).
// Crie uma fila usando seu queue-driver.$queue = <sua seleção/implementação de uma fila>;// Rastreie o primeiro conjunto de URLsCrawler::create() ->setCrawlQueue($queue) -> definir Limite de rastreamento atual (10) ->startCrawling($url);// Serialize e armazene sua fila$serializedQueue = serialize($queue);
Para quaisquer solicitações a seguir, você precisará desserializar sua fila original e passá-la ao rastreador:
// Desserialize queue$queue = unserialize($serializedQueue); // Rastreia o próximo conjunto de URLsCrawler::create() ->setCrawlQueue($queue) -> definir Limite de rastreamento atual (10) ->startCrawling($url);// Serialize e armazene sua fila$serialized_queue = serialize($queue);
O comportamento é baseado nas informações da fila. Somente se a mesma instância de fila for passada no comportamento funciona conforme descrito. Quando uma fila completamente nova é passada, os limites dos rastreamentos anteriores, mesmo para o mesmo site, não se aplicam.
Um exemplo com mais detalhes pode ser encontrado aqui.
Por padrão, o rastreador continua até rastrear todas as páginas do URL fornecido. Se quiser limitar a profundidade do rastreador, você pode usar o método setMaximumDepth
.
Rastreador::criar() -> definir Profundidade Máxima (2)
A maioria das páginas HTML são bem pequenas. Mas o rastreador pode acidentalmente detectar arquivos grandes, como PDFs e MP3s. Para manter baixo o uso de memória nesses casos, o rastreador usará apenas as respostas menores que 2 MB. Se, durante o streaming de uma resposta, ela ficar maior que 2 MB, o rastreador interromperá o streaming da resposta. Um corpo de resposta vazio será assumido.
Você pode alterar o tamanho máximo da resposta.
// vamos usar no máximo 3 MB.Crawler::create() -> definir Tamanho Máximo de Resposta (1024 * 1024 * 3)
Em alguns casos, você pode ficar com taxa limitada ao rastrear de forma muito agressiva. Para contornar isso, você pode usar o método setDelayBetweenRequests()
para adicionar uma pausa entre cada solicitação. Este valor é expresso em milissegundos.
Rastreador::criar() ->setDelayBetweenRequests(150) // Após cada página rastreada, o rastreador irá esperar 150ms
Por padrão, cada página encontrada será baixada (até setMaximumResponseSize()
em tamanho) e analisada em busca de links adicionais. Você pode limitar quais tipos de conteúdo devem ser baixados e analisados definindo setParseableMimeTypes()
com uma matriz de tipos permitidos.
Rastreador::criar() ->setParseableMimeTypes(['text/html', 'text/plain'])
Isso impedirá o download do corpo de páginas que possuem diferentes tipos MIME, como arquivos binários, áudio/vídeo, ... que provavelmente não terão links incorporados. Esse recurso economiza principalmente largura de banda.
Ao rastrear um site, o rastreador colocará os URLs a serem rastreados em uma fila. Por padrão, essa fila é armazenada na memória usando o ArrayCrawlQueue
integrado.
Quando um site é muito grande, você pode querer armazenar essa fila em outro lugar, talvez em um banco de dados. Nesses casos, você pode escrever sua própria fila de rastreamento.
Uma fila de rastreamento válida é qualquer classe que implemente a interface SpatieCrawlerCrawlQueuesCrawlQueue
. Você pode passar sua fila de rastreamento personalizada por meio do método setCrawlQueue
no rastreador.
Rastreador::criar() ->setCrawlQueue(<implementação de SpatieCrawlerCrawlQueuesCrawlQueue>)
Aqui
ArrayCrawlQueue
RedisCrawlQueue (pacote de terceiros)
CacheCrawlQueue para Laravel (pacote de terceiros)
Modelo Laravel como fila (aplicativo de exemplo de terceiros)
Por padrão, o rastreador definirá o esquema de URL base como http
se não houver nenhum. Você pode alterar isso com setDefaultScheme
.
Rastreador::criar() ->setDefaultScheme('https')
Consulte CHANGELOG para obter mais informações sobre o que mudou recentemente.
Consulte CONTRIBUINDO para obter detalhes.
Primeiro, instale a dependência do Puppeteer ou seus testes falharão.
npm install puppeteer
Para executar os testes, você terá que iniciar primeiro o servidor baseado em nó incluído em uma janela de terminal separada.
testes de cd/servidor instalação npm nó server.js
Com o servidor em execução, você pode começar a testar.
teste de compositor
Se você encontrou um bug relacionado à segurança, envie um email para [email protected] em vez de usar o rastreador de problemas.
Você é livre para usar este pacote, mas se ele chegar ao seu ambiente de produção, agradecemos muito que você nos envie um cartão postal de sua cidade natal, mencionando quais de nossos pacotes você está usando.
Nosso endereço é: Spatie, Kruikstraat 22, 2018 Antuérpia, Bélgica.
Publicamos todos os cartões postais recebidos no site da nossa empresa.
Freek Van der Herten
Todos os colaboradores
A licença MIT (MIT). Consulte Arquivo de licença para obter mais informações.