Curl para fazer parse de um HTML

  • Autor Autor Prospero
  • Data de início Data de início
Tradução em andamento: em alguns minutos este tópico estará em português. Por enquanto, o conteúdo está no original em espanhol. Ver original
Prospero

Prospero

Eta
Verificación en dos pasos activada
Hola amigos, estoy trantando de parsear otra web en este caso Mercadolibre para traer solo la cantidad de vendidos y no logro llegar. Algun compadre que pueda explicar como llegar o donde leer como llegar?

PHP:
<?php

function price(){
    $url = 'https://articulo.mercadolibre.com.ar/MLA-648903966-pulsera-hombre-mujer-de-soga-dije-acero-quirurgico-modelo-ancla-nautica-brazalete-hombre-pulsera-ancla-_JM';
    $ch = curl_init();
   
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER,array("Accept-Lenguage: es-es,es"));
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $html = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);

    preg_match_all('|<div class="item-conditions">(.*)</div>|', $html, $result);

    return $result;
   
   
   
}

price();


?>

Sabiendo que el Div con class "item-conditions tiene el dato.

HTML:
<div class="item-conditions">
           
                Nuevo
           
           
               
                    &nbsp;-&nbsp;
               
                1801
                vendidos
           
        </div>

gracias!! los leo!!
 
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
Saludos, no te sirve SIMPLE HTML DOM? Es mucho mas simple
 
Pero estas imprimiendo los datos?

print_r(price());
 
Hola!!! genio!! me imprime el array sin datos.

Array ( [0] => Array ( ) [1] => Array ( ) )

Prueba con esto
PHP:
preg_match_all('|<div class="item-conditions">(.*)</div>|sU', $html, $result);
 
Esta la solucion que logre hacer, no se si esta perfecta pero funciona.
PHP:
<?php
function cURL($url, $posts, $cookies, $referer, $proxy){
    $headers = array (
        'Accept-Language: en-US;q=0.6,en;q=0.4',
    );
    $tiempo = time();
    $agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; es-MX; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13";
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies);
    curl_setopt($ch, CURLOPT_TIMEOUT, 2);
    if($proxy){
        if(stristr($proxy, '@')){
            $datosproxy = explode('@', $proxy);
            curl_setopt($ch, CURLOPT_PROXY, $datosproxy[1]);
            curl_setopt($ch, CURLOPT_PROXYUSERPWD, $datosproxy[0]);
            //echo $datosproxy[0];
        }else{
            curl_setopt($ch, CURLOPT_PROXY, $proxy);
        }
    }
    if($posts){
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $posts);
    }
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $page = curl_exec($ch);
    curl_close($ch);

    if($page){
        return $page;
    }
    return 'curl '.$url.'';
}
$url = 'https://articulo.mercadolibre.com.ar/MLA-648903966-pulsera-hombre-mujer-de-soga-dije-acero-quirurgico-modelo-ancla-nautica-brazalete-hombre-pulsera-ancla-_JM';
$data = cURL($url,'','mercadolibre.txt',$url,'');
preg_match('|<div class="item-conditions">(.*?)</div>|is',$data,$result);
$text = preg_replace('/\s\s+/', ' ',$result[1]);
$esto = array('/ (.*?) &nbsp;-&nbsp; (.*?) (.*?) /is');
// $estado = preg_replace($esto, array('$1'), $text);
$cantidad = preg_replace($esto, array('$2'), $text);
echo $cantidad;

?>

Resultado
Inserir CODE, HTML ou PHP:
1801

Saludos, si necesitas hacer un scraper mas avanzado me hablas por mp
 
Última edição:
hay una línea ( 7012 en este caso ) que en parte dice:
availableStock":1956,"soldStock":1801,

tal vez te es más fácil ubicar esa línea y sacar todos los valores de ahí

el problema con eso es que pueden cambiar el html en cualquier minuto y tu programa va a fallar

¿has probado usando la API de MercadoLibre? https://developers.mercadolibre.com/
 
hay una línea ( 7012 en este caso ) que en parte dice:
availableStock":1956,"soldStock":1801,

tal vez te es más fácil ubicar esa línea y sacar todos los valores de ahí

el problema con eso es que pueden cambiar el html en cualquier minuto y tu programa va a fallar

¿has probado usando la API de MercadoLibre? https://developers.mercadolibre.com/
Solucion usando soldStock
PHP:
<?php
function cURL($url, $posts, $cookies, $referer, $proxy){
    $headers = array (
        'Accept-Language: en-US;q=0.6,en;q=0.4',
    );
    $tiempo = time();
    $agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; es-MX; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13";
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies);
    curl_setopt($ch, CURLOPT_TIMEOUT, 2);
    if($proxy){
        if(stristr($proxy, '@')){
            $datosproxy = explode('@', $proxy);
            curl_setopt($ch, CURLOPT_PROXY, $datosproxy[1]);
            curl_setopt($ch, CURLOPT_PROXYUSERPWD, $datosproxy[0]);
            //echo $datosproxy[0];
        }else{
            curl_setopt($ch, CURLOPT_PROXY, $proxy);
        }
    }
    if($posts){
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $posts);
    }
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $page = curl_exec($ch);
    curl_close($ch);

    if($page){
        return $page;
    }
    return 'curl '.$url.'';
}
$url = 'https://articulo.mercadolibre.com.ar/MLA-648903966-pulsera-hombre-mujer-de-soga-dije-acero-quirurgico-modelo-ancla-nautica-brazalete-hombre-pulsera-ancla-_JM';
$data = cURL($url,'','mercadolibre.txt',$url,'');
preg_match('|"soldStock":(.*?),|is',$data,$result);
echo $result[1];

?>
 
hay una línea ( 7012 en este caso ) que en parte dice:
availableStock":1956,"soldStock":1801,

tal vez te es más fácil ubicar esa línea y sacar todos los valores de ahí

el problema con eso es que pueden cambiar el html en cualquier minuto y tu programa va a fallar

¿has probado usando la API de MercadoLibre? https://developers.mercadolibre.com/

las api no devuelven el la cantidad de ventas del producto.
 
Se puede saber cual recomiendan? Porque yo uso SIMPLE HTML DOM, para scrapper simple de un web, como por ejemplo día y fecha de algunos eventos, pero cual es la diferencia con CURL?
 

Tópicos similares

Voltar
Topo