Desenvolvedor de Software e Especialista em Tecnologia da Informação

Como clonar um site inteiro com PHP. 😱 Mini tutorial Web Scraping passo a passo na prática!

Você sabia que o PHP consegue copiar toda a estrutura de um site para fins de estudo? 🤯 Neste guia completo, vamos explorar como utilizar recursos nativos do PHP para baixar uma página HTML, localizar automaticamente arquivos CSS, JavaScript e imagens, fazer o download desses arquivos e reorganizar toda a estrutura localmente. Uma habilidade essencial para desenvolvedores que trabalham com automação, integração de sistemas e Web Scraping.

📅  10 de julho de 2026
⏱️  10 min
🏷️  PHP
📚 artigos +


Web Scraping com PHP puro: Como clonar sites para estudo usando cURL, DOMDocument e DOMXPath

O objetivo NÃO é incentivar a cópia de conteúdo de terceiros. O foco deste exemplo é demonstrar técnicas importantes de programação muito utilizadas por desenvolvedores que trabalham com automação, integração de sistemas, migração de aplicações, análise de páginas HTML e Web Scraping.

Como clonar um site inteiro com PHP. 😱 Mini tutorial Web Scraping passo a passo na prática!

PHP PHP 8 Web Scraping cURL DOMDocument DOMXPath Desenvolvimento Web Web Scraping PHP Programação PHP Backend RogerioPontesTI

"O PHP não é apenas uma linguagem para criar sites — ele também é uma ferramenta poderosa para automação, integração e Web Scraping. Com recursos nativos como cURL, DOMDocument e DOMXPath, é possível extrair, processar e reorganizar conteúdo da web de forma eficiente e profissional."



O que é Web Scraping e por que aprender?

O Web Scraping é uma técnica de extração de dados de sites e páginas da web. Ele permite que desenvolvedores coletem informações de forma automatizada, processem dados e os utilizem em aplicações, análises e sistemas.

Neste artigo, vamos construir um clone de site utilizando apenas PHP puro, sem frameworks ou bibliotecas externas. O projeto vai:

  • Baixar uma página HTML completa
  • Localizar automaticamente arquivos CSS, JavaScript e imagens
  • Fazer download de todos os assets
  • Reorganizar toda a estrutura localmente
  • Gerar uma versão funcional do site em seu computador

Tecnologias utilizadas no projeto

cURL

Requisições HTTP avançadas para baixar conteúdo

DOMDocument

Interpretação e navegação no HTML

DOMXPath

Localização precisa de elementos no DOM

Manipulação de Arquivos

Organização e salvamento de assets


Estrutura do projeto PHP

O projeto é composto por 4 arquivos principais:

📁 consts.php
Arquivo de configuração que armazena a URL do site que será clonado.
📁 lib.php
Biblioteca de funções reutilizáveis para download de arquivos e requisições HTTP.
📁 export.php
Script principal que orquestra todo o processo de clonagem.
📁 index.php
Página inicial que receberá o conteúdo clonado.

Código completo do projeto

1. consts.php — Configuração da URL

CONSTS.PHP

<?php

const URL = 'https://www.php.net/';
        

Este arquivo define a URL que será clonada. Para testar com outros sites, basta alterar esta constante.

2. lib.php — Funções auxiliares

LIB.PHP

<?php

function baixar($url)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $html = curl_exec($ch);
    curl_close($ch);

    return $html;
}

function baixarArquivo($url, $pasta)
{
    // Resolver URL completa
    if (!preg_match("/^https?:\/\//", $url)) {
        if (strpos($url, '//') === 0) {
            $url = 'https:' . $url;
        }
    }

    // Baixar conteúdo
    $conteudo = baixar($url);
    if (empty($conteudo)) {
        return false;
    }

    // Pegar nome do arquivo
    $nome = basename(parse_url($url, PHP_URL_PATH));

    // Se não tem extensão, tentar descobrir
    if (empty($nome) || !strpos($nome, '.')) {
        $tipo = mime_content_type($url);
        if ($tipo) {
            $extensoes = [
                'image/jpeg' => 'jpg',
                'image/png' => 'png',
                'image/gif' => 'gif',
                'image/webp' => 'webp',
                'image/svg+xml' => 'svg'
            ];
            $ext = $extensoes[$tipo] ?? 'jpg';
        } else {
            $ext = match ($pasta) {
                'css' => 'css',
                'js' => 'js',
                'img' => 'jpg',
                default => 'bin'
            };
        }
        $nome = uniqid() . '.' . $ext;
    }

    // Salvar arquivo
    $caminho = __DIR__ . "/assets/$pasta/" . $nome;
    file_put_contents($caminho, $conteudo);

    return $nome;
}
        

3. export.php — Script principal

EXPORT.PHP

<?php

require_once(__DIR__ . "/consts.php");
require_once(__DIR__ . "/lib.php");

// Criar pastas
$pastas = ['css', 'js', 'img'];
foreach ($pastas as $pasta) {
    $caminho = __DIR__ . "/assets/$pasta";
    if (!is_dir($caminho)) {
        mkdir($caminho, 0777, true);
    }
}

$html = baixar(URL);

// Carregar HTML
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();

$xpath = new DOMXPath($dom);

// Processar CSS
foreach ($xpath->query("//link[@rel='stylesheet']") as $link) {
    $href = $link->getAttribute('href');
    if ($href) {
        $nome = baixarArquivo($href, 'css');
        if ($nome) {
            $link->setAttribute('href', "assets/css/$nome");
        }
    }
}

// Processar JS
foreach ($xpath->query("//script[@src]") as $script) {
    $src = $script->getAttribute('src');
    if ($src && strpos($src, 'http') !== 0 && strpos($src, '//') !== 0) {
        $nome = baixarArquivo($src, 'js');
        if ($nome) {
            $script->setAttribute('src', "assets/js/$nome");
        }
    }
}

// Processar Imagens
foreach ($xpath->query("//img[@src]") as $img) {
    $src = $img->getAttribute('src');
    if ($src) {
        $nome = baixarArquivo($src, 'img');
        if ($nome) {
            $img->setAttribute('src', "assets/img/$nome");
        }
    }
}

// Salvar HTML
file_put_contents(__DIR__ . "/index.php", $dom->saveHTML());

echo "Cópia concluída!";
        

Explicando o código passo a passo

1. A função baixar() com cURL

A função baixar() utiliza a biblioteca cURL do PHP para fazer requisições HTTP. As opções configuradas são:

  • CURLOPT_RETURNTRANSFER: Retorna o conteúdo como string
  • CURLOPT_FOLLOWLOCATION: Segue redirecionamentos
  • CURLOPT_USERAGENT: Define um User-Agent válido
  • CURLOPT_SSL_VERIFYPEER: Desabilita verificação SSL para evitar erros

2. A função baixarArquivo()

Esta função é responsável por:

  • Resolver URLs relativas para URLs absolutas
  • Baixar o conteúdo do arquivo
  • Determinar o nome e extensão do arquivo
  • Salvar o arquivo na pasta correta
  • Retornar o nome do arquivo salvo

3. DOMDocument e DOMXPath

O DOMDocument carrega o HTML baixado e o transforma em uma estrutura de árvore DOM. O DOMXPath permite navegar e localizar elementos específicos:

  • //link[@rel='stylesheet']: Localiza todas as folhas de estilo
  • //script[@src]: Localiza todos os scripts
  • //img[@src]: Localiza todas as imagens

⏱️ Capítulos do vídeo

  • 00:00 — Introdução: Coisas proibidas para DEVs PHP
  • 00:03 — Aviso: Uso estritamente didático
  • 00:06 — Estrutura do projeto PHP
  • 00:13 — Conhecendo a Library e funções de download
  • 00:21 — Executando o script de exportação
  • 00:24 — Resultado final: Cópia concluída com sucesso
  • 00:32 — Encerramento e convite para seguir

🔗 Projeto completo no GitHub

GitHub - ClonePHP

Conclusão

O Web Scraping com PHP puro é uma habilidade poderosa para qualquer desenvolvedor. Este projeto demonstra como utilizar recursos nativos da linguagem para:

  • ✅ Fazer requisições HTTP com cURL
  • ✅ Processar HTML com DOMDocument
  • ✅ Localizar elementos com DOMXPath
  • ✅ Baixar e organizar assets automaticamente
  • ✅ Construir um projeto estruturado e reutilizável

💡 Lembre-se: O Web Scraping deve ser utilizado com responsabilidade e ética. Sempre respeite os termos de uso dos sites e utilize o conhecimento para aprender e evoluir como desenvolvedor.


🤔 O que você achou?

💬 Quer aprender JavaScript do ZERO? Comece agora a escrever seu primeiro código e seus fundamentos!


❓ FAQ: Perguntas Frequentes sobre Web Scraping com PHP

Ele copia a estrutura HTML e faz download dos arquivos referenciados na página, desde que estejam acessíveis e não tenham restrições de acesso.

Sim. Este projeto utiliza técnicas de Web Scraping para extrair dados e estruturas de páginas da web, com finalidade educacional.

Sim, para estudo, em ambientes autorizados e respeitando sempre os termos de uso dos sites acessados. O uso para fins comerciais ou maliciosos é proibido.

O DOMDocument permite navegar e manipular documentos HTML de forma estruturada, facilitando a localização e modificação de elementos.

O DOMXPath facilita a localização de elementos específicos como imagens, folhas de estilo e scripts, usando consultas XPath.

Não. Todo o código foi desenvolvido utilizando apenas PHP puro e recursos nativos da linguagem, sem frameworks ou bibliotecas externas.

Sim. O projeto foi desenvolvido com compatibilidade para PHP 8+ e utiliza recursos modernos da linguagem.

Sim. Basta alterar a constante URL no arquivo consts.php. O script se adaptará automaticamente à estrutura do novo site.

🎬 Assista ao Vídeos completo sobre Refatoração

O vídeo foi feito em Javascript mais o conceito pode ser utilizado em qualquer outra linguagem de programação..

🎬 Assista ao Vídeos completo sobre Refatoração


🔗 Conecte-se Comigo


💬 Você já utilizou PHP para automação ou Web Scraping? Qual biblioteca você costuma utilizar? Prefere PHP puro ou Framework? Escreva sua experiência nos comentários! 👇

#PHP #PHP8 #WebScraping #cURL #DOMDocument #DOMXPath #Programacao #DesenvolvimentoWeb #Codigo #Backend #Programador #DicasDeProgramação #RogerioPontesTI