Web Scraping com a linguagem de programação PHP

Guias, Como fazer, Scraping, 25/12/20245 minutos de leitura

A Web scraping tornou-se uma ferramenta essencial para desenvolvedores e analistas de dados que precisam extrair e analisar informações da Web. Seja para rastrear preços de produtos, coletar dados para pesquisa ou criar um painel personalizado, a Web scraping oferece infinitas possibilidades.

Se você é um entusiasta do PHP, a Goutte é uma biblioteca fantástica a ser considerada para suas necessidades na Web scraping . A Goutte é leve, fácil de usar e avançada, combinando os recursos de cliente HTTP do Guzzle com o DomCrawler do Symfony para obter uma Web fácil e eficiente scraping.

Este guia o guiará pelos conceitos básicos da Web scraping com PHP usando o Goutte - desde ainstalação e seu primeiro script até técnicas avançadas, como manipulação de formulários e paginação.

Por que escolher a Goutte para o site Scraping?

A Goutte ganhou popularidade entre os desenvolvedores por vários motivos, tornando-a uma das bibliotecas scraping para PHP:

  • API simples e limpa: O Goutte oferece uma interface limpa e intuitiva que é fácil de aprender, mesmo para iniciantes.
  • Integração perfeita: Ele combina solicitações HTTP com análise de HTML, eliminando a necessidade de bibliotecas separadas.
  • Recursos avançados: O Goutte oferece suporte a funcionalidades avançadas, como manipulação de sessões, gerenciamento de cookies e envio de formulários de forma programática.
  • Fácil de usar para iniciantes, mas robusto: Desde as tarefas mais simples do scraping até projetos mais complexos, ele tem tudo o que você precisa para começar.

Seja você um novato em PHP ou um desenvolvedor experiente, o Goutte atinge o equilíbrio ideal entre simplicidade e potência.

Instalação do Goutte

Antes de começar a codificar, certifique-se de que os pré-requisitos necessários estejam em vigor:

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

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

compositor require fabpot/goutte

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

requerer 'vendor/autoload.php';

Agora você está pronto para começar scraping!

Seu primeiro script para a Web Scraping com o Goutte

Vamos começar com um exemplo simples. Vamos acessar scrape o título de uma página da Web usando 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 Scrape - Sandbox
Primeiros 5 títulos de livros:
- Uma luz no sótão
- Derrubando o Veludo
- Soumission
- Sharp Objects
- 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 da Web.

Extração de dados de páginas da Web

Depois de aprender a buscar uma página da Web, a próxima etapa é extrair dados específicos, como links ou conteúdo de elementos HTML específicos.

Extracting All Links (`<a>` Tags)

O script a seguir extrai o href atributos de todos os <a> em uma página da 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";
}

Isso retornará todos os hiperlinks 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 usando classe ou ID seletores. Para este exemplo, usaremos o seletor Livros para o site Scrape. Especificamente, vamos scrape informações sobre cada livro, já que todos compartilham a mesma classe, produto_pod. Veja como ele aparece no site:

Aqui está um exemplo de como você pode fazer isso usando o 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";
}

Navegação entre páginas

Agora, vamos explorar como navegar ou paginar entre as páginas. Na página de exemplo que estamos usando, há um botão "Next" que permite a paginação para a próxima página. Aproveitaremos esse botão para implementar a paginação.

Primeiro, localizaremos o botão usando seu classe que tem como valor próxima . Dentro desse elemento, há um <a> que contém o URL da próxima página. Ao extrair esse URL, podemos usá-lo para enviar uma nova solicitação e passar sem problemas para a próxima página. próxima na página.

Veja a seguir como é o código que faz isso:

<?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 essa abordagem, você pode automatizar a navegação entre as páginas e continuar scraping dados.

Manuseio de formulários com o Goutte

O Goutte também é capaz de lidar com formulários. Para demonstrar essa funcionalidade, usaremos este site, que tem um único campo de entrada, conforme mostrado na imagem abaixo:

Veja como é o código para enviar esse 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";
}

Esse script preenche um campo de formulário chamado q com o valor web scraping e o envia. A partir daí, você pode extrair conteúdo da página de resultados de pesquisa, como nos exemplos anteriores.

Tratamento de erros e práticas recomendadas

Tratamento de erros de rede

Sempre adicione o tratamento de erros para gerenciar situações inesperadas, como uma falha na conexão de rede 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 Web scraping deve ser sempre executada de forma ética e responsável. O arquivo `robots.txt` é um arquivo de texto simples usado pelos sites para se comunicar com os rastreadores da Web, descrevendo quais partes do site podem ou não ser acessadas. Antes de acessar scraping, é importante verificar o arquivo `robots.txt` para garantir que você esteja seguindo as regras do site e respeitando seus termos. Ignorar essas diretrizes pode levar a problemas legais e éticos, portanto, sempre faça dessa etapa uma prioridade em seu processo de scraping .

Leia mais sobre robots.txt aqui.

Limitação de taxa

Seja cortês e evite enviar muitas solicitações em um curto período de tempo, pois isso pode sobrecarregar o servidor e prejudicar seu desempenho para outros usuários. É uma boa prática incluir um pequeno atraso entre cada solicitação para minimizar a carga no servidor e garantir que ele possa lidar com o tráfego de forma eficiente. A adoção dessas etapas não só ajuda a manter a estabilidade do servidor, mas também demonstra o uso responsável e atencioso dos recursos compartilhados.

sleep(1); // Aguarde 1 segundo entre as solicitações

Armadilhas comuns

  • Muitos sites modernos dependem do JavaScript para carregar o conteúdo, o que significa que as ferramentas tradicionais do scraping podem não capturar todos os dados de que você precisa. Ferramentas como Puppeteer ou Selenium podem simular as interações do usuário e carregar o conteúdo como um navegador faria.
  • Certifique-se de que os pontos de extremidade HTTPS que você scrape mostrem certificados válidos para evitar erros. Certificados inválidos ou expirados podem fazer com que seu coletor de dados falhe ou gerar problemas de segurança. Sempre verifique o status do certificado antes de scraping e considere o uso de bibliotecas que lidam com esses problemas sem problemas.

Conclusão

A Web scraping é uma ferramenta poderosa para coletar dados com eficiência, mas requer uma abordagem responsável e cuidadosa para evitar armadilhas comuns e garantir o uso ético. Ao aderir às práticas recomendadas, como respeitar os termos de serviço do site, implementar atrasos apropriados entre as solicitações e usar ferramentas capazes de lidar com conteúdo dinâmico, você pode criar um raspador que funcione com eficiência e minimize 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 seu scraper e todos os dados que ele coletar. Com planejamento e execução adequados, a Web scraping pode se tornar um recurso inestimável para pesquisa, análise e inovação.