class Voo: def __init__(self): self.bd = BancoDados() self.cod = 0 #No banco de dados os voos serao identificados por um cod para nao ter voos repitidos self.origem = "SSA" self.destino = "REC" self.dia = datetime(1,1,1) self.numErro = 0 try: query = "SELECT Cod, Origem, Destino, Dia, NumErro from Voo where (pesquisando = 0 or (pesquisando = 1 and UltimaPesquisa < subtime(now(),'12:00'))) and UltimaPesquisa < subtime(now(),'6:00') and Dia > adddate(now(),3) and Ocorrencia > 0 and NumErro < 5 order by prioridade desc limit 1;"#TODO: Ver o tempo exato ---A cada 6h,no maximo 5 erros voo = self.bd.executar(query) if (voo != None): for v in voo: self.cod = v[0] self.origem = v[1] self.destino = v[2] self.dia = v[3] self.numErro = v[4] except: print("Erro para ler os dados \n") raise finally: self.bd.desconectar() '''Essa parte vai ser preenchida pelo crawler, por isso é private''' self.__preco = 0.01 self.__cia = "Gol" self.__horaSaidaIda = "9:23" self.__horaChegadaIda = "10:10" self.__ultimaPesquisa = datetime(1,1,1) self.__status = 0 def __getUrl(self): """Retorna a url para fazer a pesquisa dessa passagem""" retorno = "http://www.decolar.com/search/flights/" strMeio = self.origem + '/' + self.destino + '/' + self.dia.isoformat() strFim = "1/0/0" # O Preco pesquisado é de um adulto retorno += "oneWay/" + strMeio + '/' + strFim return retorno def __crawler(self,url): """Funcao que retorna o html como uma string""" try: print("Fazendo o craw url") print(url) browser = spynner.Browser() browser.load(url) try: browser.wait_page_load() except: pass retorno = browser.html.encode("utf8","ignore") browser.close() return retorno except: raise def __preencherDados(self): """Preenche os dados da cia aerea do preco e da data da ultima pesquisa""" #ToDo: Deve ser bem testado para que seja analisado todos os cenarios de erros #Por enquanto a abordagem eh pegar apenas o primeiro resultado da decolar. Futuramente podemos refinar isso #Por enquanto apenas o preco em real eh analizar try: s = self.__crawler(self.__getUrl()) file = open("t2.txt","w") file.write(s) file.close() soup = BeautifulSoup(s) Itinerary0 = soup.find('div',{'id':'Itinerary_0'} ) self.__cia = Itinerary0.find('div',{'id':'CompressItinAirlineName'}).find('strong').contents[0].strip() #a cia de ida e volta sao iguais self.__horaSaidaIda = Itinerary0.find('div',{'class':'salida'}).find('strong').contents[0].strip() self.__horaChegadaIda = Itinerary0.find('div',{'class':'llegada'}).find('strong').contents[0].strip() precoLocal0 = Itinerary0.find('div',{'id':'CompressItinPriceLocalAmount'}).find('strong').contents[0].strip() #Preco na moeda local, geralmente real total self.__preco = precoLocal0.split(' ')[1] self.__ultimaPesquisa = datetime.now() return 1 except: self.__ultimaPesquisa = datetime.now() return 0 def pesquisar(self): """Realiza a pesquisa do voo""" if self.cod == 0: print("Nao ha mais voo/n") return 0 else: #Informa que o voo esta sendo pesquisado try: query = "UPDATE Voo SET Pesquisando = 1, UltimaPesquisa = Now() where cod = %d;" % (self.cod) self.bd.executar(query) #self.bd.executar("commit;"); except: print("Erro para persistir os dados ") return 0 finally: self.bd.desconectar() if self.__preencherDados() == 1: try: query = "UPDATE Voo SET Preco = '%s',Cia = '%s',HoraSaidaIda = '%s',HoraChegadaIda = '%s', UltimaPesquisa = '%s', Pesquisando = 0 where cod = %d;" % (self.__preco, self.__cia, self.__horaSaidaIda, self.__horaChegadaIda,self.__ultimaPesquisa, self.cod) #print(query) self.bd.executar(query) except: print("Erro para persistir os dados ") finally: self.bd.desconectar() else: print("\nOcorreu um erro no crawl") try: query = "UPDATE Voo SET NumErro = %d, UltimaPesquisa = '%s', Pesquisando = 0 where cod = %d;" % (self.numErro + 1, self.__ultimaPesquisa, self.cod) #print(query) self.bd.executar(query) except: print("Erro para persistir os dados ") finally: self.bd.desconectar() return 1
class Voo: def __init__(self): self.bd = BancoDados() self.cod = 0 # No banco de dados os voos serao identificados por um cod para nao ter voos repitidos self.origem = "SSA" self.destino = "REC" self.ida = datetime(1, 1, 1) self.volta = datetime(1, 1, 1) self.numErro = 0 try: # query = "SELECT Cod, Origem, Destino, DiaIda, DiaVolta, NumErro from Voo where (pesquisando = 0 or (pesquisando = 1 and UltimaPesquisa < subtime(now(),'12:00'))) and UltimaPesquisa < subtime(now(),'6:00') and DiaIda > adddate(now(),3) and DiaVolta > adddate(now(),3) and Ocorrencia > 0 and NumErro < 5 order by prioridade desc limit 1;"#TODO: Ver o tempo exato ---A cada 6h,no maximo 5 erros query = "Select PegarVooAtomicamente();" voo = self.bd.executar(query) voo = voo[0][0].split("$") if voo != None: self.cod = int(voo[0]) self.origem = voo[1] self.destino = voo[2] self.ida = date(int(voo[3].split("-")[0]), int(voo[3].split("-")[1]), int(voo[3].split("-")[2])) try: self.volta = date(int(voo[4].split("-")[0]), int(voo[4].split("-")[1]), int(voo[4].split("-")[2])) except: self.volta = None self.numErro = int(voo[5]) except: print("Erro para ler os dados \n") # raise finally: self.bd.desconectar() """Essa parte vai ser preenchida pelo crawler, por isso é private""" self.__preco = 0.01 self.__cia = "Gol" self.__horaSaidaIda = "9:23" self.__horaChegadaIda = "10:10" self.__horaSaidaVolta = "9:23" self.__horaChegadaVolta = "10:10" self.__ultimaPesquisa = datetime(1, 1, 1) self.__status = 0 def __getUrl(self): """Retorna a url para fazer a pesquisa dessa passagem""" retorno = "http://www.decolar.com/search/flights/" strMeio = self.origem + "/" + self.destino + "/" + self.ida.isoformat() strFim = "1/0/0" # O Preco pesquisado é de um adulto if self.volta == None: retorno += "oneWay/" + strMeio + "/" + strFim else: retorno += "RoundTrip/" + strMeio + "/" + self.volta.isoformat() + "/" + strFim return retorno def __crawler(self, url): """Funcao que retorna o html como uma string""" try: print("Fazendo o craw url") print(url) browser = spynner.Browser() browser.load(url) try: browser.wait_page_load() except: pass retorno = browser.html.encode("utf8", "ignore") browser.close() return retorno except: raise def __preencherDados(self): """Preenche os dados da cia aerea do preco e da data da ultima pesquisa""" # ToDo: Deve ser bem testado para que seja analisado todos os cenarios de erros # Por enquanto a abordagem eh pegar apenas o primeiro resultado da decolar. Futuramente podemos refinar isso # Por enquanto apenas o preco em real eh analizar try: s = self.__crawler(self.__getUrl()) # file = open("t2.txt","r") # s = file.read() # file.close() soup = BeautifulSoup(s) if self.volta == None: # Itinerary0 = soup.find('div',{'id':'Itinerary_0'} ) self.__cia = soup.find("div", {"class": "airline-name"}).find("span").contents[0].strip() self.__horaSaidaIda = soup.find("li", {"class": "leave"}).find("strong").contents[0].strip() self.__horaChegadaIda = soup.find("li", {"class": "arrive"}).find("strong").contents[0].strip() self.__preco = soup.find("span", {"class": "price-amount"}).contents[0].strip() try: self.__preco = self.__preco.replace(".", "") self.__preco = self.__preco.split(" ")[1] except: pass else: # Itinerary0 = soup.find('div',{'id':'ItinBox_0'} ) self.__cia = ( soup.find("div", {"class": "airline-name"}).find("span").contents[0].strip() ) # a cia de ida e volta sao iguais self.__horaSaidaIda = soup.find("li", {"class": "leave"}).find("strong").contents[0].strip() self.__horaChegadaIda = soup.find("li", {"class": "arrive"}).find("strong").contents[0].strip() self.__horaSaidaVolta = ( soup.find("div", {"class": "sub-cluster inbound"}) .find("li", {"class": "leave"}) .find("strong") .contents[0] .strip() ) self.__horaChegadaVolta = ( soup.find("div", {"class": "sub-cluster inbound"}) .find("li", {"class": "arrive"}) .find("strong") .contents[0] .strip() ) self.__preco = soup.find("span", {"class": "price-amount"}).contents[0].strip() try: self.__preco = self.__preco.replace(".", "") self.__preco = self.__preco.split(" ")[1] except: pass self.__ultimaPesquisa = datetime.now() return 1 except: self.__ultimaPesquisa = datetime.now() return 0 def pesquisar(self): """Realiza a pesquisa do voo""" if self.cod == 0: print("Nao ha mais voo/n") return 0 else: if self.__preencherDados() == 1: try: if self.volta == None: query = ( "UPDATE Voo SET Preco = %.2f,Cia = '%s',HoraSaidaIda = '%s',HoraChegadaIda = '%s', UltimaPesquisa = '%s', Pesquisando = 0 where cod = %d;" % ( float(self.__preco), self.__cia, self.__horaSaidaIda, self.__horaChegadaIda, self.__ultimaPesquisa, self.cod, ) ) else: query = ( "UPDATE Voo SET Preco = %.2f,Cia = '%s',HoraSaidaIda = '%s',HoraChegadaIda = '%s', HoraSaidaVolta = '%s',HoraChegadaVolta = '%s',UltimaPesquisa = '%s', Pesquisando = 0 where cod = %d;" % ( float(self.__preco), self.__cia, self.__horaSaidaIda, self.__horaChegadaIda, self.__horaSaidaVolta, self.__horaChegadaVolta, self.__ultimaPesquisa, self.cod, ) ) # print(query) self.bd.executar(query) except: raise print("Erro para persistir os dados ") finally: self.bd.desconectar() else: print("\nOcorreu um erro no crawl") try: query = "UPDATE Voo SET NumErro = %d, UltimaPesquisa = '%s', Pesquisando = 0 where cod = %d;" % ( self.numErro + 1, self.__ultimaPesquisa, self.cod, ) # print(query) self.bd.executar(query) except: raise print("Erro para persistir os dados ") finally: self.bd.desconectar() return 1
while r == r2: r2 = random.randint(0,len(aeroportos) -1) destino = aeroportos[r2] precoE = 130.50 dias = [] for j in range(10): d = date.today()+timedelta(days=(random.randint(5,15))) dias += [d.isoformat()] dias2 = [] for j in range(10): d = date.today()+timedelta(days=(random.randint(16,30))) dias2 += [d.isoformat()] for d in dias: for d2 in dias2: s = "Insert Into Voo (Origem,Destino,DiaIda,DiaVolta,Ocorrencia) Values ('%s','%s','%s','%s',1);\n" % (origem,destino,d,d2) file.write(s) file.close() elif (menu ==6): email = raw_input("Digite o email: ") query = "Select Cod from Pesquisa where Status = 0 and Email_Cliente = '%s';" % (email) rs = b.executar(query) for cod in rs: c = int(cod[0]) if (ativarPesquisa(b,c)): print("Pesquisa %d foi ativada" % c)