Scrapear web con Slim y HTML Dom Parser


Apuntes de como scrapear una web mediante Simple HTML Dom Parser de PHP pero usando el micro-framework Slim.

Analizar la web

Primero analizar la web a escrapear, enlaces, titulos, bloques de contenido etc…, en este caso lo he realizado sobre un proyecto de github, para extraer su contenido a una base de datos SQL

https://github.com/1milligram/1loc

Dependencias

Añadir al archivo composer.json lo siguiente «voku/simple_html_dom»: «^4.7»

actualizar las dependencias con el comando composer update

o bien

composer require voku/simple_html_dom

Escrapeo de enlaces

Extraer todos los enlaces de la página web

private function getLinks($url) {

    $context = stream_context_create();
    stream_context_set_params($context, array('user_agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/90.0.4430.216 Mobile/15E148 Safari/604.1'));

    $baseUrl = "https://localhost";
    $html = HtmlDomParser::file_get_html($url, 0, $context);

    $hrefs = $html->find('div[class="page-snippet__content"]',0);

    foreach($hrefs->find('a') as $link) { 
        $links[] =  $baseUrl . $link->href;
    } 

    return $links;
}

con el método ->href se puede obtener el href del enlace con ->plaintext se obtiene el texto del enlace

Escrapeo de detalle

Ahora se debe extraer el contenido de cada enlace, se compone de titulo, bloque de javascript, bloque de typescript y bloque de ejemplo

private function getDetail($url, $category) {

    $context = stream_context_create();
    stream_context_set_params($context, array('user_agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/90.0.4430.216 Mobile/15E148 Safari/604.1'));

    $html = HtmlDomParser::file_get_html($url, 0, $context);

    $header_1 = $html->find('h1',0)->innertext;

    $javascript = null;
    $typescript = null;
    $sample = null;

    $b1 = $html->find('div[class="block-markdown__div"]',0)->plaintext;
    $javascript = $html->find('pre',0)->plaintext;
    
    $b2 = $html->find('div[class="block-markdown__div"]',1)->plaintext;
    $b2src = $html->find('pre',1)->plaintext;

    if(str_starts_with($b2, "Example")) {
        $sample = $b2src;
    } else {
        $typescript = $b2src;
    }
    

    $b3 = $html->find('div[class="block-markdown__div"]',2)->plaintext;
    $b3src = $html->find('pre',2)->plaintext;

    if(str_starts_with($b3, "Example")) {
        $sample = $b3src;
    }


    $uid =  vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(md5($url), 4));
    $item = array(
        "uid" => $uid,
        "category" => $category,
        "title" => htmlspecialchars_decode($header_1),
        "javascript" => htmlspecialchars_decode($javascript),
        "typescript" => htmlspecialchars_decode($typescript),
        "sample" => htmlspecialchars_decode($sample),

    );

    //print_r($item);

    try {
        $this->dataaccess->add( _TABLE_ , $item);
        $item["result"] = "✔️";
    } catch( \Exception $e ) {
        $item["result"] = "↻" . $e;
    }
    
    $item["url"] = $url;
    return $item;

}

Anuncio publicitario

Publicado por Codelaby

Mobile DevDesigner

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: