Como baixar livros no Passei Direto usando R e Linux

como usar o R para baixar livros sem ter que fazer upload

Pedro Carvalho Brom http://blackbeltr.com.br/
2019-01-29

Passei Direto é um site para troca de arquivos. São áreas variadas e fornece livros, resoluções de livros, apostilas, artigos entre outros. É um repositório fora de série, mas tem o problema de ter que subir algum arquivo em “troca” de outro. O ponto desta postagem é como efetuar o download sem ter que fazer essa troca. A qui usaremos ferramentas de automação disponíveis para o R como as bilbiotecas RSelenium e o gmailr. Além deste usaremos o comando convert disponível para sistemas GNU/Linux.

Então segue o tutorial passo a passo.


library(RSelenium) # chamando a biblioteca

# abrindo sistema de navegacao
rD = rsDriver(browser = "chrome", check = F) # abre o navegador sem verificar o driver atual check = F
remDr = rD[["client"]] # inicia a marionete
Sys.sleep(10) # pausa de 10 segundos para carregar tudo 100%

# indo pro site e efetuando o login
remDr$navigate("https://www.passeidireto.com/login") # indo para a página de login
lg = "seu@login" # coloque o seu email cadastrado
pw = "seupass" # coloque a sua senha

Nesta tela podemos clicar no campo de Email e depois clicar o botão direito pedindo para inspecionar.

Aqui temos os caminhos de entrada do campo:

Na entrada imput temos o campo placeholder com o valor Email. Veja o script abaixo e compare os caminhos por conta própria das outras entradas.

Aqui fica uma dica. Se estiver usando o chrome então use sendKeysToElement. Caso esteja cmo o firefox use sendKeysToActiveElement.


webElem = remDr$findElement(using = 'xpath', "//input[@placeholder='Email']")
webElem$sendKeysToElement(list(lg))
Sys.sleep(runif(1, 1, 5)) # esperando de 1 a 5 segundos de modo pseudoaleatorio antes de avancar
webElem = remDr$findElement(using = 'xpath', "//input[@placeholder='Senha']")
webElem$sendKeysToElement(list(pw))
Sys.sleep(runif(1, 1, 5))
webElem = remDr$findElement(using = 'xpath', "//button[@class='button orange']")$clickElement()
Sys.sleep(10)

Agora vamos para o livro de interesse.


# indo para o livro
remDr$navigate("https://www.passeidireto.com/arquivo/23932176/barry-james-probabilidade-um-curso-em-nivel-intermediario---resolucoes-exercicio")

Neste momento pode aparecer alguma tela que impede a plena navegação do bot. Para tanto vamos resolver o problema. Caso não apareça basta excluir esse próximo passo do script.

No mesmo esquema do login clique o botão direito no campo de interesse, digamos Ensino Fundamental.

Caixa de seleção:

Agora a opção Estudos Gerais

Estudos Gerais

webElem = remDr$findElement(using = 'xpath', "//div[@class='v-select__selections']")$clickElement() # caixa de selecao
webElem = remDr$findElement(using = 'xpath', "//div[@class='v-list__tile__title' and contains(text(), 'Estudos Gerais')]")$clickElement() # opcao que contem o texto Estudos Gerais

Faça o mesmo esquema para Estado, Cidade e depois Salvar alterações.


# estado
webElem = remDr$findElement(using = 'xpath', "//div[@class='v-list__tile__title' and contains(text(), 'Distrito Federal')]")$clickElement()

# cidade
webElem = remDr$findElement(using = 'xpath', "//input[@placeholder='Digite sua cidade']")
webElem$sendKeysToElement(list('Brasília'))
webElem$sendKeysToElement(list(key = 'enter'))

# salvar alteracoes
webElem = remDr$findElement(using = 'xpath', "//button[@label='Salvar alterações']")$clickElement()

Tudo pronto para iniciar o trabalho. Clique o botão direito para ver a imagem do livro.

Repare que temos o padrão para coletar os dados:

https://files.passeidireto.com/c2ba1b4f-5bdd-4528-b30e-feeb666a9c97/bg1.png

Agora um loop simples resolve tudo que desejamos.


pgs = as.character(1:5) # indexador das paginas. vamos pegar apenas de 1 a 5.

# loop para efetuar o download das paginas
for(i in pgs) {
  endereco = paste0("https://files.passeidireto.com/c2ba1b4f-5bdd-4528-b30e-feeb666a9c97/bg", i, ".png")
  arq = paste0("/home/pcbrom/Downloads/", i, ".png")
  download.file(endereco, arq)
}

# fechar a marionete e parar o webdriver
remDr$close()
rD[["server"]]$stop()

Download efetuado. Próximo passo é juntar tudo em um pdf.


comando = "convert /home/pcbrom/Downloads/*.png /home/pcbrom/Downloads/bj.pdf"
system(comando)

E o resultado é esse:

Tudo isso é muito bom mas tem como melhorar. O arquivo gerado é um pouco grande 1.3MB. Vamos usar o comando ps2pdf do Linux e diminuir para apenas 191.1kB.


comando = "ps2pdf /home/pcbrom/Downloads/bj.pdf /home/pcbrom/Downloads/bjlite.pdf"
system(comando)
file.size("/home/pcbrom/Downloads/bj.pdf")

[1] 1318862

file.size("/home/pcbrom/Downloads/bjlite.pdf")

[1] 191108

Falta enviar por email. Essa parte não precisa de detalhamentos do script. Happy coding!


library(gmailr)

file_attachment = mime() %>%
  html_body("") %>% 
  to("seu@email.com.br") %>%
  from("seu@email.com.br") %>%
  subject(paste0("Livro consolidado: ", Sys.Date())) %>%
  attach_file("/home/pcbrom/Downloads/bjlite.pdf")

send_message(file_attachment)

Citation

For attribution, please cite this work as

Brom (2019, Jan. 29). blackbeltR Blog: Como baixar livros no Passei Direto usando R e Linux. Retrieved from https://blackbeltR.github.io/blog/posts/2019-01-29-bot-extrair-passei-direto/

BibTeX citation

@misc{brom2019como,
  author = {Brom, Pedro Carvalho},
  title = {blackbeltR Blog: Como baixar livros no Passei Direto usando R e Linux},
  url = {https://blackbeltR.github.io/blog/posts/2019-01-29-bot-extrair-passei-direto/},
  year = {2019}
}