Vícios e amores servem para preencher o vazio
Introdução
A uns tempos atrás postei aqui na academia um vídeo meu criando um downloader, hoje resolvi
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