es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo establecer el encabezado Referer en Guzzle y obtener contenido de CDN.

Quiero hacer scraping de un sitio web y estoy usando Guzzle 7.4 y Symfony Dom Crawler.

He recuperado con éxito los datos HTML, pero el sitio web utiliza un CDN para alojar algunos recursos y no se cargan porque no se envía la cabecera para obtener esos recursos.

A continuación se muestra el código para recuperar el HTML:

<?php
require "vendor/autoload.php";
use Symfony\Component\DomCrawler\Crawler;

// URL
$url = 'scrapingdomain.com';
$headers = [
    'referer' => 'examplescrapingdomain.com'
];

$client = new \GuzzleHttp\Client([
    'headers' => $headers
]);

// Obtener datos del URL
$response = $client->request('GET', $url);
$html =  ''.$response->getBody();
$crawler = new Crawler($html);

echo $html;
?>

Si accedo directamente al CDN y establezco la cabecera de referencia, obtengo una respuesta de 200.

A continuación se muestra el código:

<?php
require "vendor/autoload.php";
use Symfony\Component\DomCrawler\Crawler;

// URL
$url = 'examplecdnresource.com/Images.png';
$headers = [
    'referer' => 'examplescrapingdomain.com'
];

$client = new \GuzzleHttp\Client([
    'headers' => $headers
]);

// Obtener datos del URL
$response = $client->request('GET', $url);
$html =  ''.$response->getBody();
$crawler = new Crawler($html);

echo $html;
?>

Quiero obtener los recursos del dominio de scraping y descargar las imágenes alojadas en el CDN.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para recuperar los recursos de CDN, puedes modificar tu código para extraer los enlaces de recursos a partir del HTML utilizando DomCrawler, y luego hacer una petición para cada recurso utilizando el cliente Guzzle con el encabezado referente adecuado.

    Aquí hay un código de ejemplo que demuestra esto:

    PHP

    require "vendor/autoload.php";
    
    use Symfony\Component\DomCrawler\Crawler;
    
    // Url
    $url = 'scrapingdomain.com';
    $headers = [
        'referer' => 'examplescrapingdomain.com'
    ];
    
    $client = new \GuzzleHttp\Client([
        'headers' => $headers
    ]);
    
    // obtener los datos de la URL
    $response = $client->request('GET', $url);
    $html =  ''.$response->getBody();
    $crawler = new Crawler($html);
    
    // encontrar todos los enlaces de imagen en el HTML
    $imageLinks = $crawler->filter('img')->extract(['src']);
    
    foreach ($imageLinks as $link) {
        // verificar si el enlace es de CDN
        if (strpos($link, 'examplecdnresource.com') !== false) {
    
            // enviar una solicitud de recurso con el encabezado referente
            $resourceResponse = $client->request('GET', $link, [
                'headers' => [
                    'referer' => 'examplescrapingdomain.com'
                ]
            ]);
    
            // guardar el recurso en un archivo local
            $filename = basename($link);
            file_put_contents($filename, $resourceResponse->getBody());
        }
    }
    

    Este código extraerá todos los enlaces de imagen del HTML y verificará si son del recurso de CDN. Si lo son, hará una solicitud para cada recurso con el encabezado referente y guardará la respuesta en un archivo local. Puede modificar este código para manejar otros tipos de recursos también.

    Es importante tener en cuenta que hacer scraping y descargar recursos de un sitio web sin permiso puede ser ilegal y poco ético, así que asegúrate de tener la autorización adecuada antes de hacerlo.

Comments are closed.