Web scraping fácil com phpQuery
Suponho que uma grande maioria dos programadores já tiveram que fazer scraping a um website. Eu, pelo menos, já o tive que fazer várias vezes. Recentemente tive que exportar imagens e informação de um catálogo online e escolhi o PHP para o fazer. Uma das primeiras tentações é tentar extrair informação com substrings e outros hacks “fáceis”.
Quando começamos a ver a loucura que é utilizar abordagem, tentamos tirar partido da estrutura do DOM com bibliotecas que façam o parse de uma forma mais estruturada. Mesmo assim, a tarefa pode ser bastante desafiante e estas bibliotecas por vezes introduzem obstáculos que são difíceis de ultrapassar. Ao tentar resolver este problema, deparei-me com o phpQuery. A grande vantagem de usar esta biblioteca é que podemos aplicar os nossos conhecimentos de jQuery, visto que a sintaxe é idêntica.
Deixo aqui um exemplo que extrai o preço, ID, link e imagem dos templates no site TemplateMonster. O texto é exportado em CSV para o ecrã do browser. A parte de extrair as imagens apenas funciona para os templates de PrestaShop. Disclaimer: não sou grande “espingarda” a trabalhar com jQuery, por isso se tiverem alguma dica para tornar as queries mais bonitas, digam
require('phpQuery.php'); $type = 43; $domain = 'http://www.templatemonster.com'; $url = $domain."/prestashop-themes.php?type={$type}&from="; $pageNumber = 0; $templateNumber = 0; do { $pageNumber++; phpQuery::newDocumentFileHTML($url.$pageNumber,null); $validPage = pq('.thumbnail_wrapper')->html(); if($validPage) { $templates = pq('.preview_box td:not(.nav)'); foreach($templates as $t) { $templateNumber++; if(trim(pq($t)->html())) { $imageSmall = pq($t)->find('.thumbnail_wrapper img')->attr('src'); $demoLink = $domain.pq($t)->find('.picture_menu a:nth-child(1)')->attr('href'); $productLink = $domain.pq($t)->find('.picture_menu a:nth-child(2)')->attr('href'); $price = pq($t)->find('.price-l span:eq(1)'); $price = trim(str_replace('$','',$price)); $imageBig = str_replace('m.jpg','prestashop-b.jpg',$imageSmall); preg_match('/([\d]+)/', $productLink, $match); $productId = $match[0]; echo $templateNumber.';'.$productId.';'.$productLink.';'.$price.'< br/ >'; $imageFile = "img/{$fileNumber}.jpg"; if(!file_exists($imageFile)) file_put_contents($imageFile, file_get_contents($imageBig)); } } } }while($validPage);
Artigos relacionados:
-
Rui Covelo


























