我正在练习网络爬虫,我需要优化此代码,我是一个初学者,我编写了此代码,我觉得它很慢,如何优化它? 简而言之,我想获得此电子商务的页面,并过滤将要定义的折扣和现金返还。 请给我建议。 感激!
已经尝试作为库 simpledomparser guzzle和PHPHtmlParser,我也尝试通过cURL和file_get_contents
<?php
require "vendor/autoload.php";
use PHPHtmlParser\Dom;
echo 'INICIANDO<br/>';
$ame = 15;
$discount = 15;
$busca = 'https://www.shoptime.com.br/lojista/b2w';
$padraoPagina = 2; //1 é soma 24 , 2 é padrão 'pagina-1'
$numPaginaMax = 5000; //valor a ser imputado para o numero maximo de paginas a ser buscado
$offset = 24;
$numPagina = 0;
function soNumero($str) {
return preg_replace("/[^0-9]/", "", $str);
}
for ($i = 1; $i <= $numPaginaMax; $i++) {
$url = $busca;
if ($padraoPagina == 1) {
$i == 1 ? $numPagina = 0 : $numPagina += $offset; //usando operador ternario (praticando)
$url .= "?limite=24&offset=".$numPagina;
}
else { //diferente de $padraoPagina ==1
$numPagina = '/pagina-'.$i;
$url .= "$numPagina";
}
$html = new Dom;
foreach ($html->loadFromUrl($url)->find('a.card-product-url') as $ref2) {
$url_produto_localizado = 'https://www.shoptime.com.br'.$ref2->getAttribute('href');
unset($html);
$html2 = new Dom;
$html2->loadFromUrl($url_produto_localizado);
$discountProd = $html2->find('span.discount',0); // desconto no produto
if (!empty($discountProd)) { //testar ($discountProd !== null) e colocar ternario
$discountProd = soNumero($discountProd->plaintext);
}
$amePorcText = $html2->find('span.hMwkMY',0)."<br/>";
$pos1 = strpos($amePorcText, '(');
$pos2 = strpos($amePorcText, '%');
$ameReal = substr($amePorcText, $pos1+1, ($pos2-$pos1)-1);
if ($ameReal >= $ame or $discountProd >= $discount) {
if ($ameReal >=$ame) {
echo "<br/><b><br/>❤️ Opa, cashback de $ameReal% ❤️<br/></b>";
}
if ($discountProd >= $discount) {
echo " Desconto de $discountProd% <br/>" ;
}
echo $html2->find('h1.gzujnn',0)->text.'</br>'; //mostra o produto dentro da condição master rs
echo "<a href='$url_produto_localizado' target='_blank'>ABRIR PRODUTO</a> da pagina $i<br/><br/>";
}
else {
echo " ☹️ ";
}
unset($html2); //limpar memoria
}
}