Ir para conteúdo

POWERED BY:

Arquivado

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

Smart Developer

Ler conteudo de RSS, encontrar imagens e baixar as respectivas imagens

Recommended Posts

Bom dia pessoal, estou criando um script que lê um arquivo RSS do Tumblr, copia o conteudo do RSS para uma variavel.

 

No entanto, preciso fazer com que o script encontre todas as imagens que estão no código, entre as tags <img src=" e "/>

 

as tags são codificadas (charset) e portanto se encontram da seguinte maneira:

 

<img src="http://caminhodaimagem.jpg"/>

 

ou seja, preciso que o script varra todo o conteudo da variavel $string e me retorne todos os valores contigos dentro das tags <img> exemplo: http://caminhodaimagem.jpg

 

Alguém pode me ajudar?

 

abaixo segue o script até onde conseguir fazer... acho que precisarei usar expressões regulares, mas não sei as usar direito...

 

<?php
ini_set("allow_url_fopen", 1);
$url = "http://soupsoup.tumblr.com/rss";
$string = file_get_contents($url);

//AQUI PRECISO TRABALHAR COM O CONTEUDO DA VARIAVEL $string

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria algo tipo isso:

<?php

$subject = 'alsdkfhj al~skdj <img src="http://caminhodaimagem1.jpg"/> ausiodfcbniol <img src="http://caminhodaimagem2.jpg"/>
joidfjgo odifjo<img src="http://caminhodaimagem3.jpg"/>ksoipdfgusbhdfio';

$pattern = "/src=['\"][\S]*\"\/\>/";

preg_match_all($pattern,$subject,$matches);

array_walk($matches[0],function(&$img)
		{
			$img = substr(substr($img,0,-6),5);	
		});

var_dump($matches);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ER ficaria mais legível se fosse usado apenas usar um grupo quantificador não guloso.

 

No mesmo código do Kratos, bastaria trocar o padrão por:

 

$pattern = "/<img src=['\"](.*?)['\"]/";

Na bem da verdade você nem precisaria considerar ambos os tipos de aspas (simples e duplas), mas é melhor do que correr o risco de haver uma formação defierenciada no XML do site.

 

Com isso, você dispensa o uso de array_walk(), já que todas imagens já estarão no índice 1 de $matches, gerado por preg_match_all().

 

E uma vez dispensado o uso dessa função, ganha-se um pouco de performance.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Bruno, Kratos...

 

Utilizei um pouco do que cada um falou e realmente deu certo, no entanto tive que mudar de estratégia...

 

O RSS gerado pelo Tumblr não é completo... ou seja, reporta apenas os artigos mais recentes. A solução foi então fazer a leitura a partir da página inicial do tumblr.

No entanto, a estrutura de paginação do tumblr funciona da seguinte forma:

 

Home -> meuendereco.tumblr.com

pagina2 -> meunedereco.tumblr.com/page/2

.

.

.

pagina 520 -> meuendereco.tumblr.com/page/520 (lol).

 

A Expressão regular criada pelo Kratos, caiu como uma luva na versão para RSS devido ao charset do documento XML, no entanto, como tive que utilizar a versão HTML mesmo, utilizei a versão do Bruno ;)

 

Modifiquei meu codigo da seguinte maneira:

 

<?php
set_time_limit(0);

//A URL que será lida
$url = "http://soupsoup.tumblr.com";
//Quantidade de páginas a serem lidas
$pages = 10;
//Padrão a ser satisfeito
$pattern = "/<img src=\"http\:\/\/(.*?)\"/";

for ($contaPaginas=1; $contaPaginas<=$pages; $contaPaginas++){



if ($contaPaginas==1){
	//Habilita a leitura de arquivo por URL
	ini_set("allow_url_fopen", 1);
	//A variável que receberá o conteúdo da URL lida
	$string[$contaPaginas] = file_get_contents($url);
}else{
	//Habilita a leitura de arquivo por URL
	ini_set("allow_url_fopen", $contaPaginas);
	//A variável que receberá o conteúdo da URL lida
	$string[$contaPaginas] = file_get_contents($url."/page/".$contaPaginas);
}


}


for ($resultados=1; $resultados<=count($string); $resultados++){
//Armazena em $matches os valores que encontrados em $string pelo padrão $pattern
preg_match_all($pattern,$string[$resultados],$matches[$resultados]);
//echo "\$matches[$resultados] - GRAVADO<br/>";
}

for ($a=1; $a<=count($matches); $a++){
	for ($c=0; $c<count($matches[$a][0]); $c++){
		$url_apenas = str_replace("<img src=\"", "", $matches[$a][0][$c]);
		$url_apenas2 = substr_replace($url_apenas, "", -1, 1);
                       $todas_imagens[] = $url_apenas2;
		var_dump($todas_imagens);
	}
}
?>

 

Então agora as minhas dúvidas são:

 

1 - No linux, por linha de comando, quando quero baixar um arquivo para o servidor, basta digitar

wget URL_AQUI/arquivo.extensao 

e o mesmo será baixado para o servidor. É possível fazer algo semelhante no PHP? Ou seja, após ele retornar os endereços das imagens, eu solicitar que o servidor faça uma cópia desses arquivos encontrados?

 

2 - Muito obrigado pelo tempo cedido nessa ajuda, mesmo! Sempre que puder vou colaborar com vocês da mesma forma!

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desde que a diretiva allow_url_fopen esteja habilitada no PHP.INI, você pode usar copy.

 

Uma vez que você terá um array, logicamente devera iterar sobre ele, chamando a função para cada item nele presente.

 

Agora... Você mencionou ter tido problemas com charset quando usou o esquema do KRATOS. Como assim?

 

Eu esqueci de mencionar que, adicionalmente ao código do KRATOS, havia passado a string pot html_entity_decode() logo após ela ter sido lida do Tumblr.

 

Assim as entidades voltavam a ser os sinais de maior e menor que montam as tags. No mais, eu apenas alterei a URL, adicionando um grupo quantificador não guloso e opcional. :thumbsup:

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.