Skip to content

Instantly share code, notes, and snippets.

@nenodias
Created November 27, 2015 16:09
Show Gist options
  • Save nenodias/03a78f0fe000b854ed03 to your computer and use it in GitHub Desktop.
Save nenodias/03a78f0fe000b854ed03 to your computer and use it in GitHub Desktop.
# *-* coding: utf-8 *-*
import os, sys, requests, lxml, getpass, pdb
from BeautifulSoup import BeautifulSoup
from lxml import html
class Baixador():
def __init__(self):
self.sessao = requests.session()
self.link = 'http://www.fgp.com.br/novoAluno2012/'
self.headers = {"Accept":"text/html", "Connection":"keep-alive", "Cache-Control":"max-age=0" }
self.headers['Content-Type'] = "application/x-www-form-urlencoded"
def login(self,login, senha):
self.rm = login
dados = {"rm":login,"senha":senha}
self.requisicao = requests.Request(method = "POST", url = self.link + "loginasp.asp", headers=self.headers, data=dados)
self.requisicao_preparada = self.sessao.prepare_request(self.requisicao)
retorno = self.sessao.send(self.requisicao_preparada)
return retorno
def requisicao_material(self):
dados = {"Pagina":"materialDidatico","l_str_rm":self.rm}
self.headers['Content-Type'] = "text/html"
self.requisicao = requests.Request(method = "GET", url = self.link + "default2.asp", headers=self.headers, params=dados)
self.requisicao_preparada = self.sessao.prepare_request(self.requisicao)
retorno = self.sessao.send(self.requisicao_preparada)
return retorno
def requisicao_notas(self):
dados = {"Pagina":"Notas/Frequencia","l_str_rm":self.rm}
self.headers['Content-Type'] = "text/html"
self.requisicao = requests.Request(method = "GET", url = self.link + "default2.asp", headers=self.headers, params=dados)
self.requisicao_preparada = self.sessao.prepare_request(self.requisicao)
retorno = self.sessao.send(self.requisicao_preparada)
return retorno
def requisicao_recursiva(self, url):
dados = {"l_str_rm":self.rm}
self.headers['Content-Type'] = "text/html"
self.requisicao = requests.Request(method = "GET", url = self.link + url, headers=self.headers)
self.requisicao_preparada = self.sessao.prepare_request(self.requisicao)
retorno = self.sessao.send(self.requisicao_preparada)
return retorno
def requisicao_arquivo(self, url):
local_filename = url.split('/')[-1]
url = url.replace('../','http://fgp.com.br/')
r = requests.get(url, stream=True)
with open(local_filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
f.flush()
return local_filename
class ConverterHtmlPastaRequisicao():
def __init__(self):
self.encode = 'iso-8859-1'
self.busca_pasta = "top.window.status='EXPLORAR ESTA PASTA'; return true"
self.busca_links = "top.window.status='FAZER DOWNLOAD DESTE ARQUIVO'; return true"
self.lista_pastas = []
self.lista_arquivos = []
def converter(self, retorno):
tree = html.fromstring(retorno.text)
tree = tree.xpath('//html')[0]
pastas = tree.xpath('//a[@onmouseover="%s"]' %(self.busca_pasta))
link_download = tree.xpath('//a[@onmouseover="%s"]' %(self.busca_links))
self.__set_lista__(self.lista_pastas, pastas)
self.__set_lista__(self.lista_arquivos, link_download)
def __set_lista__(self, lista, links):
for i in xrange(len(links)):
arquivo = links[i]
indice_href = arquivo.keys().index('href')
try:
descricao = arquivo.text_content()
except:
descricao = arquivo.text_content().encode(self.encode)
try:
url = arquivo.values()[indice_href]
except:
url = arquivo.values()[indice_href].encode(self.encode)
link = Link(url, descricao)
lista.append(link)
class Link():
def __init__(self, url, descricao):
self.url = url
self.descricao = descricao
self.pastas = []
self.arquivos = []
def __str__(self):
return "{descricao:"+self.descricao+",url:"+self.url+"}"
def __repr__(self):
return "{descricao:"+self.descricao+",url:"+self.url+"}"
def baixar_arquivos(raiz, baixador):
if(not os.path.isdir(raiz.descricao)):
os.mkdir(raiz.descricao)
os.chdir(raiz.descricao)
for link in raiz.arquivos:
print("Baixando o arquivo %s "%(link.descricao) )
baixador.requisicao_arquivo(link.url)
for link in raiz.pastas:
conversor = ConverterHtmlPastaRequisicao()
conversor.converter(baixador.requisicao_recursiva(link.url))
link.pastas = conversor.lista_pastas
link.arquivos = conversor.lista_arquivos
baixar_arquivos(link, baixador)
os.chdir('..')
def uescape(text):
print repr(text)
escaped_chars = []
for c in text:
if (ord(c) < 32) or (ord(c) > 126):
c = '&{};'.format(htmlentitydefs.codepoint2name[ord(c)])
escaped_chars.append(c)
return ''.join(escaped_chars)
if(__name__== '__main__'):
rm = raw_input('Digite seu RM:')
senha = getpass.getpass()
baixador = Baixador()
conversor = ConverterHtmlPastaRequisicao()
baixador.login(rm, senha)
print(" 1 - Baixar Material")
print(" 2 - Visualizar Notas")
opcoes = [1,2]
operacao = None
while not operacao or operacao not in opcoes:
operacao = int(raw_input('Qual operação irá fazer:'))
if operacao == 1:
conversor.converter(baixador.requisicao_material())
raiz = Link(None,'Material')
raiz.pastas = conversor.lista_pastas
raiz.arquivos = conversor.lista_arquivos
baixar_arquivos(raiz, baixador)
elif operacao == 2:
soap = BeautifulSoup(baixador.requisicao_notas().text)
soap.prettify()
for linha in soap("tr"):
for coluna in linha("td"):
for item in coluna("font"):
print(item)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment