Web Scraping com a linguagem de programação PHP

Guias, Como fazer, Raspagem, Dez-25-20245 minutos de leitura

O Web scraping tornou-se uma ferramenta essencial para programadores e analistas de dados que precisam de extrair e analisar informações da Web. Quer esteja a acompanhar os preços dos produtos, a recolher dados para investigação ou a criar um painel de controlo personalizado, o Web scraping oferece possibilidades infinitas.

Se é um entusiasta de PHP, a Goutte é uma biblioteca fantástica a considerar para as suas necessidades de recolha de dados da web. Goutte é leve, fácil de usar e poderosa, combinando as capacidades do cliente HTTP do Guzzle com o DomCrawler do Symfony para uma raspagem suave e eficiente da web.

Este guia irá guiá-lo pelas noções básicas de raspagem da Web com PHP usando Goutte - desde ainstalação e seu primeiro script até técnicas avançadas como manipulação de formulários e paginação.

Porquê escolher a Goutte para Web Scraping?

A Goutte ganhou popularidade entre os programadores por várias razões, tornando-a uma das bibliotecas de raspagem de referência para PHP:

  • API simples e limpa: Goutte fornece uma interface limpa e intuitiva que é fácil de aprender, mesmo para principiantes.
  • Integração perfeita: Combina pedidos HTTP com análise de HTML, eliminando a necessidade de bibliotecas separadas.
  • Caraterísticas poderosas: O Goutte suporta funcionalidades avançadas como o tratamento de sessões, a gestão de cookies e a apresentação de formulários de forma programática.
  • Fácil de utilizar para principiantes, mas robusto: Desde as tarefas de raspagem mais simples até projectos mais complexos, tem tudo o que precisa para começar.

Quer seja um novato em PHP ou um programador experiente, o Goutte consegue um equilíbrio ideal entre simplicidade e potência.

Instalação da Goutte

Antes de se lançar na codificação, certifique-se de que os pré-requisitos necessários estão reunidos:

  • PHP instalado: Certifique-se de que tem o PHP 7.3 ou superior instalado no seu ambiente de desenvolvimento. Faça o download do PHP diretamente usando este link.
  • Composer Instalado: O Composer é necessário para gerir as dependências e instalar o Goutte.

Para instalar o Goutte, basta executar o seguinte comando no seu terminal:

compositor require fabpot/goutte

Depois de instalada, verifique se a biblioteca está acessível, exigindo o carregador automático do Composer no seu projeto:

requerer 'vendor/autoload.php';

Agora está pronto para começar a raspar!

Seu primeiro script de raspagem da Web com o Goutte

Vamos começar com um exemplo simples. Vamos recolher o título de uma página Web utilizando o Goutte. Abaixo está o script básico:

Obtenção e exibição do título da página

<?php
require 'vendor/autoload.php';

use Goutte\Client;

// Initialize Goutte Client
$client = new Client();

// Send a GET request to the target URL
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract the title of the page
$title = $crawler->filter('title')->text();
echo "Page Title: $title\n";

// Extract the titles of the first 5 books
echo "First 5 Book Titles:\n";
$crawler->filter('.product_pod h3 a')->slice(0, 5)->each(function ($node) {
    echo "- " . $node->attr('title') . "\n";
});
?>

Saída:

Título da página: Todos os produtos | Livros para raspar - Sandbox
Primeiros 5 títulos de livros:
- Uma luz no sótão
- A ponta do veludo
- A Soumission
- Objectos Afiados
- Sapiens: Uma Breve História da Humanidade

É tão fácil quanto isso! Com apenas algumas linhas de código, você pode buscar e exibir o títulode qualquer página web.

Extração de dados de páginas Web

Depois de aprender a obter uma página Web, o passo seguinte é extrair dados específicos, tais como ligações ou conteúdos de elementos HTML específicos.

Extracting All Links (`<a>` Tags)

O seguinte script extrai o href atributos de todos os <a> numa página web:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

Isto devolverá todas as hiperligações presentes na página.

Extração de conteúdo por classe ou ID

O Goutte facilita a extração ou análise de dados de HTML utilizando classe ou ID selectores. Para este exemplo, vamos utilizar o seletor Livros para o sítio Web Scrape. Especificamente, vamos recolher informações sobre cada livro, uma vez que todos partilham a mesma classe, produto_pod. Eis como aparece no sítio Web:

Eis um exemplo de como pode conseguir isto utilizando Goutte:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

// Extract elements with class 'product_pod'
$products = $crawler->filter('.product_pod')->each(function ($node) {
    return $node->text();
});

// Print all extracted product details
foreach ($products as $product) {
    echo $product . "\n";
}

Navegar entre páginas

Agora, vamos explorar como navegar ou paginar entre páginas. Na página de exemplo que estamos a utilizar, existe um botão "Seguinte" que permite a paginação para a página seguinte. Vamos aproveitar esse botão para implementar a paginação.

Primeiro, vamos localizar o botão utilizando o seu classe atributo que tem como valor seguinte . Dentro deste elemento, existe um <a> que contém o URL da página seguinte. Ao extrair este URL, podemos utilizá-lo para enviar um novo pedido e passar sem problemas para a página seguinte. seguinte na página.

Eis o aspeto do código que permite atingir este objetivo:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Handle pagination using the 'next' button
while ($crawler->filter('li.next a')->count() > 0) {
    $nextLink = $crawler->filter('li.next a')->attr('href');
    $crawler = $client->request('GET', 'https://books.toscrape.com/catalogue/' . $nextLink);
    
    // Extract and print the current page URL
    echo "Currently on: " . $crawler->getUri() . "\n";
}

Com esta abordagem, pode automatizar a navegação entre páginas e continuar a extrair dados.

Manipulação de formulários com Goutte

O Goutte também é capaz de lidar com formulários. Para demonstrar esta funcionalidade, vamos utilizar este sítio Web, que tem um único campo de entrada, como mostra a imagem abaixo:

Eis o aspeto do código para submeter este formulário:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://www.scrapethissite.com/pages/forms/');

// Submit the search form with a query
$form = $crawler->selectButton('Search')->form();
$form['q'] = 'Canada';

$crawler = $client->submit($form);

// Extract and print the results
$results = $crawler->filter('.team')->each(function ($node) {
    return $node->text();
});

foreach ($results as $result) {
    echo $result . "\n";
}

Este script preenche um campo de formulário chamado q com o valor raspagem da web e submete-o. A partir daqui, pode extrair conteúdo da página de resultados da pesquisa, tal como nos exemplos anteriores.

Tratamento de erros e boas práticas

Tratamento de erros de rede

Adicione sempre o tratamento de erros para gerir situações inesperadas, como uma ligação de rede falhada ou URLs inexistentes.

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();

try {
    $crawler = $client->request('GET', 'https://invalid-url-example.com');
    echo "Page title: " . $crawler->filter('title')->text();
} catch (Exception $e) {
    echo "An error occurred: " . $e->getMessage();
}
}

Respeitar o Robots.txt

A raspagem da Web deve ser sempre efectuada de forma ética e responsável. O ficheiro `robots.txt` é um ficheiro de texto simples utilizado pelos Web sites para comunicar com os Web crawlers, descrevendo as partes do site que podem ou não ser acedidas. Antes de fazer scraping, é importante verificar o ficheiro `robots.txt` para garantir que está a seguir as regras do sítio e a respeitar os seus termos. Ignorar estas diretrizes pode levar a problemas legais e éticos, por isso, faça sempre deste passo uma prioridade no seu processo de recolha de dados.

Saiba mais sobre robots.txt aqui.

Limitação da taxa

Seja cortês e evite enviar demasiados pedidos num curto período de tempo, uma vez que isso pode sobrecarregar o servidor e perturbar o seu desempenho para outros utilizadores. É uma boa prática incluir um pequeno atraso entre cada pedido para minimizar a carga no servidor e garantir que este consegue lidar com o tráfego de forma eficiente. A adoção destas medidas não só ajuda a manter a estabilidade do servidor, como também demonstra uma utilização responsável e atenciosa dos recursos partilhados.

sleep(1); // Espera 1 segundo entre pedidos

Armadilhas comuns

  • Muitos sites modernos dependem do JavaScript para carregar o conteúdo, o que significa que as ferramentas de raspagem tradicionais podem não capturar todos os dados de que você precisa. Ferramentas como o Puppeteer ou o Selenium podem simular as interações do utilizador e carregar o conteúdo como um browser faria.
  • Certifique-se de que os pontos de extremidade HTTPS que recolhe mostram certificados válidos para evitar erros. Certificados inválidos ou expirados podem fazer com que o seu raspador falhe ou levantar problemas de segurança. Verifique sempre o estado do certificado antes de efetuar o scraping e considere a utilização de bibliotecas que tratem estes problemas sem problemas.

Conclusão

O Web scraping é uma ferramenta poderosa para recolher dados de forma eficiente, mas requer uma abordagem responsável e ponderada para evitar armadilhas comuns e garantir uma utilização ética. Ao aderir às melhores práticas, como respeitar os termos de serviço dos sítios Web, implementar atrasos adequados entre pedidos e utilizar ferramentas capazes de lidar com conteúdos dinâmicos, pode criar um raspador com um desempenho eficaz, minimizando o impacto nos servidores. Além disso, a verificação de certificados HTTPS e a atenção às considerações de segurança protegerão o seu raspador e os dados que recolhe. Com um planeamento e execução adequados, a recolha de dados da Web pode tornar-se um recurso inestimável para investigação, análise e inovação.