Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Deivid Ribeiro

Ajustes no código, foreach, explode, puxando dados de site externo.

Recommended Posts

Eu estou acompanhando o preço de alguns livros, então criei esse código que pega só o que me interessa, o código do produto e me retorna o preço de todas formas de pagamento existentes no site.
Mas o que eu queria mesmo é fazer esse código acompanhar dezenas de produtos nesse mesmo php ou até usar alguma variável que pegue do filename = 10000000 até o 10000090.
Segue o código:
<html>
<head>
<title>Follow</title>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
<style type="text/css">
.all {
	font-size: 9px;
	font-family:Verdana, Geneva, sans-serif;
	color:#444;
	text-decoration:none;
}
.allt {
	font-size: 10px;
	font-family:Verdana, Geneva, sans-serif;
	color:#000;
	text-decoration:none;
}
a:link, a:visited {
	text-decoration: none
	}
</style>
</head>
<body>

<?

$filename = 6583052;

$pagina_news = file('http://www.submarino.com.br/produto/'.$filename.'/');
foreach ($pagina_news as $linhas) { $HTML .= $linhas; }
$parte_1 = explode('<h1 class="title-product" itemprop="name">', $HTML);
$parte_2 = explode('<small class="cod-prod sku" itemprop="productID">', $parte_1["1"]);
echo "<a href='http://www.submarino.com.br/produto/$filename' target='_blank'><strong class='allt'>".$parte_2["0"]."</strong></a>";
?>
<p>
<?
foreach ($pagina_news as $linhas) { $HTML .= $linhas; }
$parte_1 = explode('<abbr class="currency" title="BRL">', $HTML);
$parte_2 = explode('<link itemprop="itemCondition"', $parte_1["1"]);

echo "<strong class='all'>Preço: ".$parte_2["0"]."</strong></a>";
?>
<p>
<?
foreach ($pagina_news as $linhas) { $HTML .= $linhas; }
$parte_1 = explode('<label class="label">1x no Boleto ou Bankline:</label>', $HTML);
$parte_2 = explode('<span class="amount">', $parte_1["1"]);

echo "<strong class='all'>Boleto: ".$parte_2["0"]."</strong></a>";
?>
<p>
<?
foreach ($pagina_news as $linhas) { $HTML .= $linhas; }
$parte_1 = explode('<div class="textCartaoSubmarino area-topo">', $HTML);
$parte_2 = explode('<div class="discountCard">', $parte_1["1"]);

echo "<strong class='all'>".$parte_2["0"]."</strong></a>";
?>
<p>
<?
foreach ($pagina_news as $linhas) { $HTML .= $linhas; }
$parte_1 = explode('<span class="discountCS">', $HTML);
$parte_2 = explode('<span class="rateCard">', $parte_1["1"]);

echo "<strong class='all'>".$parte_2["0"]."</strong></a>";
?>
</body>
</html>

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara ja tentou colocar todos os "IDS" qe você quer num array

 

ai dar um foreach no array e e no lugar do $filename colocar o valor do foreach? ex.

 

$id = array( 1 , 50, 60);

 

foreach($id as $valor){

echo $valor; // Primeiro: 1; depois 50 e depois 60 e assim por diante;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara ja tentou colocar todos os "IDS" qe você quer num array

 

ai dar um foreach no array e e no lugar do $filename colocar o valor do foreach? ex.

 

$id = array( 1 , 50, 60);

 

foreach($id as $valor){

echo $valor; // Primeiro: 1; depois 50 e depois 60 e assim por diante;

}

 

Funcionou legal, mas ainda estou com problemas em uma das partes, veja no link http://3178.a.hostable.me/klap/b2w/115259987.php, o hyperlink mostra o id correto, mas o nome pega sempre o mesmo, segue o código alterado:

<html>
<head>
<title>Follow</title>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
<style type="text/css">
.all {
	font-size: 9px;
	font-family:Verdana, Geneva, sans-serif;
	color:#444;
	text-decoration:none;
}
.allt {
	font-size: 10px;
	font-family:Verdana, Geneva, sans-serif;
	color:#000;
	text-decoration:none;
}
a:link, a:visited {
	text-decoration: none
	}
</style>
</head>
<body>

<?
$id = array( 115259987 , 6583052, 5413249);

foreach($id as $valor)
{
$pagina_news = file('http://www.submarino.com.br/produto/'.$valor.'');
foreach ($pagina_news as $linhas) { $HTML .= $linhas; }
$parte_1 = explode('<h1 class="title-product" itemprop="name">', $HTML);
$parte_2 = explode('<small class="cod-prod sku" itemprop="productID">', $parte_1["1"]);
echo "<a href='http://www.submarino.com.br/produto/$valor' target='_blank'><strong class='allt'>".$parte_2["0"]."</strong></a></br>";

$parte_1 = explode('<abbr class="currency" title="BRL">', $HTML);
$parte_2 = explode('<link itemprop="itemCondition"', $parte_1["1"]);
echo "<strong class='all'>Preço: ".$parte_2["0"]."</strong></a></br>";

$parte_1 = explode('<label class="label">1x no Boleto ou Bankline:</label>', $HTML);
$parte_2 = explode('<span class="amount">', $parte_1["1"]);
echo "<strong class='all'>Boleto: ".$parte_2["0"]."</strong></a></br>";

$parte_1 = explode('<div class="textCartaoSubmarino area-topo">', $HTML);
$parte_2 = explode('<div class="discountCard">', $parte_1["1"]);
echo "<strong class='all'>".$parte_2["0"]."</strong></a></br>";

$parte_1 = explode('<span class="discountCS">', $HTML);
$parte_2 = explode('<span class="rateCard">', $parte_1["1"]);
echo "<strong class='all'>".$parte_2["0"]."</strong></a><p><hr>";
}
?>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está colocando tudo na variavel "$HTML"

 

no caso quando voce entrar dentro do foreach voce deve zerar essa variavel "$HTML"

 

Segue alteração

 

 

foreach ( $id as $valor ) {
$HTML = "";
$pagina_news = file ( 'http://www.submarino.com.br/produto/' . $valor . '' );
foreach ( $pagina_news as $linhas ) {
$HTML .= $linhas;
}
// código etc...
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está colocando tudo na variavel "$HTML"

 

no caso quando voce entrar dentro do foreach voce deve zerar essa variavel "$HTML"

 

Segue alteração

 

Puts, funcionou lindamente agora!

 

 

Só mais uma duvida, se eu colocar um $id = array( 1 , 453534, 60);

e esse número 453534 não existir no $pagina_news = file ( 'http://www.submarino.com.br/produto/' . $valor . '' );, tem como ele não mostrar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

é só você fazer um "IF"

 

 

 

$HTML = "";
$pagina_news = file ( 'http://www.submarino.com.br/produto/' . $valor . '' );
foreach ( $pagina_news as $linhas ) {
$HTML .= $linhas;
}
$parte_1 = explode ( '<h1 class="title-product" itemprop="name">', $HTML );
if ($parte_1 [1] != '') {
$parte_2 = explode ( '<small class="cod-prod sku" itemprop="productID">', $parte_1 ["1"] );
echo "<a href='http://www.submarino.com.br/produto/$valor' target='_blank'><strong class='allt'>" . $parte_2 ["0"] . "</strong></a></br>";
$parte_1 = explode ( '<abbr class="currency" title="BRL">', $HTML );
$parte_2 = explode ( '<link itemprop="itemCondition"', $parte_1 ["1"] );
echo "<strong class='all'>Preço: " . $parte_2 ["0"] . "</strong></a></br>";
$parte_1 = explode ( '<label class="label">1x no Boleto ou Bankline:</label>', $HTML );
$parte_2 = explode ( '<span class="amount">', $parte_1 ["1"] );
echo "<strong class='all'>Boleto: " . $parte_2 ["0"] . "</strong></a></br>";
$parte_1 = explode ( '<div class="textCartaoSubmarino area-topo">', $HTML );
$parte_2 = explode ( '<div class="discountCard">', $parte_1 ["1"] );
echo "<strong class='all'>" . $parte_2 ["0"] . "</strong></a></br>";
$parte_1 = explode ( '<span class="discountCS">', $HTML );
$parte_2 = explode ( '<span class="rateCard">', $parte_1 ["1"] );
echo "<strong class='all'>" . $parte_2 ["0"] . "</strong></a><p><hr>";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz um range para pegar de um determinado id, até outro, mas estou com problemas do tipo Fatal error: Allowed memory size of 67108864 bytes exhausted

E mesmo quando coloco um range menor, ele trava em um determinado número, há alguma solução para eu não usar tanta memória assim ou não travar?

 

<html>
<head>
<title>Follow</title>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
<style type="text/css">
.all {
	font-size: 9px;
	font-family:Verdana, Geneva, sans-serif;
	color:#444;
	text-decoration:none;
}
.allt {
	font-size: 10px;
	font-family:Verdana, Geneva, sans-serif;
	color:#000;
	text-decoration:none;
}
a:link, a:visited {
	text-decoration: none
	}
</style>
</head>
<body>

<?
foreach (range(200000,2000000) as $valor){

$HTML = "";
$pagina_news = file ( 'http://www.submarino.com.br/produto/' . $valor . '' );
foreach ( $pagina_news as $linhas ) {
$HTML .= $linhas;
}
$parte_1 = explode ( '<h1 class="title-product" itemprop="name">', $HTML );
if ($parte_1 [1] != '') {
$parte_2 = explode ( 'itemprop="productID">', $parte_1 ["1"] );
echo "<strong class='allt'>$valor - " . $parte_2 ["0"] . "</strong></a></br>";

$parte_1 = explode ( '<abbr class="currency" title="BRL">', $HTML );
$parte_2 = explode ( '<link itemprop="itemCondition"', $parte_1 ["1"] );
echo "<strong class='all'>Preço: " . $parte_2 ["0"] . "</strong></a></br>";

$parte_1 = explode ( '<label class="label">1x no Boleto ou Bankline:</label>', $HTML );
$parte_2 = explode ( '<span class="amount">', $parte_1 ["1"] );
echo "<strong class='all'>Boleto: " . $parte_2 ["0"] . "</strong></a></br>";

$parte_1 = explode ( '<div class="textCartaoSubmarino area-topo">', $HTML );
$parte_2 = explode ( '<div class="discountCard">', $parte_1 ["1"] );
echo "<strong class='all'>" . $parte_2 ["0"] . "</strong></a></br>";
 
$parte_1 = explode ( '<span class="discountCS">', $HTML );
$parte_2 = explode ( '<span class="rateCard">', $parte_1 ["1"] );
echo "<strong class='all'>" . $parte_2 ["0"] . "</strong></a><p><hr>";
}
}
?>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nesse range vc esta puxando 1 milhão e 800 mil páginas, é muita coisa.

 

Você pode mudar o allowed memory size no php.ini, mas recomendo que veja direitinho os livros que vc quer e busque por eles.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outro ponto seria usar DOM ao invés de um monte de explode. Dê uma olhada no código e veja quanto código desnecessário e ilegível há.

 

Dei uma pesquisada e consegui fazer usando DOM, mais ainda estou com problemas, o código para em um certo momento quando coloco um range muito alto.

 

<html>
<head>
<title>Follow</title>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
</head>
<body>
<?php

include_once('simple_html_dom.php');

for ($valor=6583050; $valor<=6583100; $valor++){
$html = file_get_html('http://www.submarino.com.br/produto/' . $valor . '');
foreach($html->find('h1[class=title-product]') as $e)
    echo $e->innertext . '<br>';
	
foreach($html->find('small[class=cod-prod sku]') as $e)
    echo $e->innertext . '<br>';

foreach($html->find('del[class=price-val]') as $e)
    echo $e->innertext . '<br>';
	
foreach($html->find('li[class=pl-li sale-price]') as $e)
    echo $e->innertext . '<br>';

foreach($html->find('li[class=pl-li bankbill-price]') as $e)
    echo $e->innertext . '<br>';

foreach($html->find('span[class=leguasSubmarino]') as $e)
    $e->outertext = '';
	
foreach($html->find('div[class=textCartaoSubmarino area-topo]') as $e)
    echo $e->innertext . '<br><hr><p>';
}
?>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, há razões para isso acontecer: o Submarino provavelmente deve ter um limite de requisições para que não haja ataques DDoS e o consumo de memória pode ter chegado ao limite, já que acessar diversas páginas gasta um bocado de memória.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.