🤔 Para Refletir :
"Não, não olhe para mim, olhe para seu mouse e teclado e comece a desenvolver!"
- Victor Sena

Comentando o downloader do thumblr em Ruby

HermesPasser Masculino

Duque
Membro
Membro
Vícios e amores servem para preencher o vazio
Juntou-se
23 de Março de 2017
Postagens
836
Bravecoins
92
Introdução

A uns tempos atrás postei aqui na academia um vídeo meu criando um downloader, hoje resolvi ao invés de trabalhar em meu jogo comentar método-a-método para aqueles que não entenderam plenamente o que fiz. Isso requirirá conhecimentos mínimos em ruby.
O código completo se encontra aqui e sim, eu sei, de nada.

Comentando

Aqui temos os dois principais módulos, o OpenURI é um wrapper para o Net::HTTP e este ultimo serve para criação de user agents e realizar acessos a internet.
Código:
require 'open-uri'
require 'net/http'

Esse método retorna o html de uma página.
Net::HTTP.get pega o html de uma página usando um objeto URI. URI converte a minha string url.
Código:
def get_url url
	Net::HTTP.get(URI(url))
end

Esse método usa expressões regulares para pegar o html dentro da tag div que tenha como classe "body-text" que é onde fica o conteúdo das postagens do thumbl usado.
As variáveis usadas estão aí somente para ficar mais fácil a visualização.
O text.match retorna o conteúdo em MatchData e to_s converte-o para string.
Código:
def get_body_content text
	beginwith = "<div class=\"body-text\">"
	endwith = "</div>"
	text.match("\\#{beginwith}(.*?)#{endwith}").to_s
end

Aqui eu faço como em cima mas pego todas as ocorrências de textos que estejam depois de "https" e antes de "aspas (")".
Algo interessante é que a engine do regex não funciona neste caso sse eu passar como parâmetro uma string (""), só se eu usar notação de expressão regular (//) diferente do acima.
Código:
def get_page_links text
	# begin with 'https:' and end with '" '
	text.scan(/(?<=https:)(.*?)(?=" )/)
end

Aqui faço o download da image.
File.open(path, 'wb') cria o arquivo com o nome armazenado em path;
open("http:#{url}").read) acessa o url e lê seus bites;
file.write escreve a imagem no arquivo.
Código:
def download_image url, path
	File.open(path, 'wb') do |file|
		file.write(open("http:#{url}").read)
	end
end

Aqui temos o urls que é um array de strings com os links das imagens então ele para cada link ele faz o download (via download_image) e salvando como o nome armazenado em path + iterator.
Código:
def download_all urls, path
	iterator = 1
	urls.each do |url|
		download_image(url[0], "#{path}\\#{iterator}.jpg")	
		puts "downloading #{url[0]} as #{path}\\#{iterator}.jpg"
		iterator += 1
	end
end

Aqui é o main do programa que precisa receber dois argumentos, o link do post e o local + nome de onde será salvo.
ARGV armazena os argumentos de linha de comando.
url recebe o primeiro argumento (link) e path o segundo (caminho).

Seguindo ele adiciona https:// ao inicio do link se não houve já que o Net::HTTP.get teria problemas para acessar se não tiver, e "pega" o html da página usando o get_url e armazena em text. Daí nós extraímos o conteúdo (dentro daquela div) e pegamos todos os links de imagens dentro desta div. Por fim, fazemos o download de todas usando o download_all e passando esse (agora) array text o caminho path.

Código:
if ARGV.length == 2
	url = ARGV[0]
	path = ARGV[1]
	
	url = url.include?("https://") ? url : "https://#{url}"
	
	text = get_url(url)
	text = get_body_content(text)
	text = get_page_links(text)
	download_all(text, path)
	puts "complete"
end
 
Voltar
Topo Inferior