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;
}