Página 1 de 1

Extrair Dados do Site de uma companhia aérea através do Selenium VBA

Enviado: Sex Set 23, 2016 1:29 pm
por EvertonJunio
Prezados, boa tarde.

Estou precisando criar uma macro para fazer a seguinte tarefa:
Entrar no site de uma companhia aérea (EX: Latam) e selecionar uma determinada rota (no caso CNF > CGH) informar a data do voo (ida e volta) e submeter a próxima página. Na próxima página, preciso extrair as informações da menor tarifa disponível, bem como informações de hora, numero do voo e etc. Além disso preciso salvar um print da tela para comprovar a menor tarifa.

Estou encontrando dificuldade em selecionar o destino e a origem, pois os sites das cia aéreas tem uma lista definida que deve ser selecionada, mesmo digitando o destino corretamente ele não aceita.
Além disso, não sei como extrair as informações do site, pois não está em formato de tabela.

Por favor, me ajudem.
Preciso muuito dessa macro funcionando.


Código VBA:

Código: Selecionar todos

Public Sub teste_TAM()
  Dim selenium As New SeleniumWrapper.WebDriver
  selenium.Start "chrome", "https://www.latam.com/"

  selenium.Open "/pt_br/"
  selenium.Click "//body[@id='cp-page']/header/div[2]/div[2]/div/div[2]/div/div[2]/button"

'<span class="highlight">Belo Horizonte (BHZ), Confins (CNF), Brasil</span>

  selenium.Click "id=compra-select-origin"
  selenium.Type "id=compra-select-origin", "Belo Horizonte (BHZ), Confins (CNF), Brasil"
  selenium.Click "css=span.highlight"
  selenium.Click "id=ui-id-15"
  selenium.submit "css=span.highlight"
  
  
  MsgBox ("id=compra-select-origin")
  selenium.Type "id=compra-select-destination", "São Paulo (SAO), Congonhas (CGH), Brasil"
  selenium.Click "id=compra-passenger-count-id"
  selenium.Click "id=compra-passenger-count-id"
  selenium.Click "id=compra-passenger-count-id"
  selenium.Click "css=span.input-group-btn.more > button.btn-more-less.NoFocusable"
  selenium.Click "css=button.btn-more-less.NoFocusable"
  
  selenium.Click "id=dp1474592878872"
  selenium.Click "link=28"
  
  selenium.Click "//button[@type='submit']"

MsgBox ("Teste")


' Tirar um PrintScreen da tela

' extrair os dados dos voôs disponíveis
'Preciso filtar apenas o voo de ida e volta mais baratos. Preciso somente da hora do voo, preço de ida e volta



 selenium.stop
End Sub

Re: Extrair Dados do Site de uma companhia aérea através do Selenium VBA

Enviado: Qua Set 28, 2016 3:19 pm
por TARSA
Olá Everton, tudo bem?

Dentro do que foi comentado por você " Entrar no site de uma companhia aérea (EX: Latam) e selecionar uma determinada rota", eu te faço
as seguintes perguntas:

1) Quantas companhias aéreas você gostaria de consultar?

2) Deseja no formato planilha ou algo mais profissional?

Abs;

Tarcísio

Re: Extrair Dados do Site de uma companhia aérea através do Selenium VBA

Enviado: Qua Set 28, 2016 3:24 pm
por EvertonJunio
Tarsa, boa tarde.

Respondendo suas perguntas, segue abaixo:

1) Quantas companhias aéreas você gostaria de consultar?

R: Desejo consultar 3 companhias aéreas: GOL, LATAM e AZUL

2) Deseja no formato planilha ou algo mais profissional?

R: Preciso no formato de planilha.

Att,
Everton Junio

Re: Extrair Dados do Site de uma companhia aérea através do Selenium VBA

Enviado: Qua Set 28, 2016 3:31 pm
por TARSA
Ok, Everton,

Até amanhã darei uma olhada nos sites dessas companhias aéreas e nos falamos. Blz?

Abs;

TARSA

Re: Extrair Dados do Site de uma companhia aérea através do Selenium VBA

Enviado: Qua Set 28, 2016 3:33 pm
por EvertonJunio
Ok!

Ficarei no aguardo...

Re: Extrair Dados do Site de uma companhia aérea através do Selenium VBA

Enviado: Qui Set 29, 2016 5:58 pm
por TARSA
Boa tarde Everton,

Hoje tive um pouco de tempo e resolvi comprar o seu desafio.

Muito bem, realmente o maior problema são as arquiteturas do software da empresa exemplificada por você, que a cada opção na origem e destino que você insere ele já cria opções pré-estabelecidas.
Ainda não desisti, mas já tentei algumas formas que até achei que fossem funcionar, mas nada.
Dando uma olhada em sites de vendas de passagens que não são as companhias aéreas, achei alguns que ficariam muito mais fácil de
realizar esse código. Todavia se a política da sua empresa for comprar direto das companhias, acho que está encrencado.
Bom Everton como gostei do desafio vou continuar tentando sempre que tiver um tempo, caso consiga antes que eu jogue o pano, mande uma mensagem para que eu possa entender como isso foi solucionado.

Abs;

TARSA

Re: Extrair Dados do Site de uma companhia aérea através do Selenium VBA

Enviado: Qui Set 29, 2016 7:18 pm
por EvertonJunio
Tarsa,

Realmente eu soube escolher muito bem um desafio. O código fonte dos sites da companhia aérea são bem complexos.
Até o momento, acho que o site da Latam o mais difícil! No site da Azul, consegui automatizar as entradas do destino, origem e tipo de viagem. Entretanto, a data de ida e volta do vôo é O problema. Ela está em dropdown e por causa disso não consegui selecionar a data livremente.
Já no site da Gol, consegui inserir todas as informações que preciso, porém o botao submeter que está fazendo gracinha.
Na Latam, não sai do lugar... simplesmente abri a página e não sei o que fazer... o HTML parece até aleatório pra mim as vezes. Hehe

Eu agradeço imensamente seu esforço e dedicação em encontrar a solução. Eu também não desisti ainda! Estou buscando novas alternativas a cada dia. Se vc quiser, posso mostra o que fiz até agora. Quem sabe vc não encontre a solução a partir do que ja fiz?!

Então fica aí o desafio!!! Será que há alguém vai conseguir resolve lo???

Re: Extrair Dados do Site de uma companhia aérea através do Selenium VBA

Enviado: Qui Set 29, 2016 7:47 pm
por TARSA
Boa noite Everton,

O site da que o botão submit está te causando problemas comigo funcionou numa boa, as tabelas que aparecem
com as opções de vôos é que são loucas.
Qual comando você usa para enviar as palavras para o textbox dos sites?
No caso desse site eu enviei pelo comando "Sendkeys", já usou?

Tarsa

Re: Extrair Dados do Site de uma companhia aérea através do Selenium VBA

Enviado: Qui Set 29, 2016 8:05 pm
por EvertonJunio
Caro Tarsa, boa noite!

Então, no início do sistema estava utilizando o "innertext", depois tentei o "sendkeys", mas não obtive resultado satisfatório.
A partir daí, tomei conhecimento do Selenium IDE (que é quase um assistente de gravar macro do excel, mas só que no firefox) e comecei a utilizar o VBA com extensão do Selenium. Nessa linguagem, utilizo o Selenium.Type. (no fundo faz a mesma coisa que o "sendkeys".

Veja o script da GOL abaixo. Ele foi o mais próximo de um resultado que cheguei! O problema que estou encontrando é para submeter a página para visualizar os vôos disponíveis.

Código: Selecionar todos

Public Sub Teste_Gol()
  Dim selenium As New SeleniumWrapper.WebDriver
  selenium.Start "chrome", "http://www.voegol.com.br/"

  selenium.Open "/pt-br/Paginas/default.aspx"
  selenium.Click "css=a.modal-btn-fechar"
  selenium.Click "id=ctl00_PlaceHolderMain_origem"
  selenium.Click "id=ctl00_PlaceHolderMain_origem"
  selenium.Click "id=ctl00_PlaceHolderMain_origem"
  selenium.Click "id=ctl00_PlaceHolderMain_origem"
  selenium.Click "id=ctl00_PlaceHolderMain_origem"
  selenium.Type "id=ctl00_PlaceHolderMain_origem", "Belo Horizonte - Confins (CNF)"
  selenium.Click "id=ctl00_PlaceHolderMain_para"
  selenium.Type "id=ctl00_PlaceHolderMain_para", "São Paulo - Congonhas (CGH)"
  selenium.Click "id=ida"
  selenium.Type "id=ida", "10/10/2016"
  selenium.Click "id=volta"
  selenium.Type "id=volta", "10/10/2016"
  selenium.Click "id=adultos"
  selenium.Click "id=bt-disparo"
  MsgBox ("Saco!")
  selenium.stop
End Sub

Já o código da Azul, estou com problemas na seleção da data de ida e volta, em função do dropdown.
Veja o código:

Código: Selecionar todos

Public Sub ExtracaoDados()
  Dim selenium As New SeleniumWrapper.WebDriver
  
'abrir o site https://viajemais.voeazul.com.br/Search2.aspx
  
  selenium.Start "chrome", "https://viajemais.voeazul.com.br"
  selenium.Open "/Search2.aspx"
  
'Selecionando o Tipo de Viagem: IDA e VOLTA
  
  selenium.Click "//div[@id='travelOptions']/span[1]/a"
  selenium.Click "css=a.jqTransformRadio"
  
'Inserindo Origem e Destino

  selenium.Type "id=ControlGroupSearchView2_AvailabilitySearchInputSearchView2_TextBoxMarketOrigin1", "Belo Horizonte - Confins (CNF)"
  selenium.Type "id=ControlGroupSearchView2_AvailabilitySearchInputSearchView2_TextBoxMarketDestination1", "São Paulo - Congonhas (CGH)"

'seleciona o dropdown da data de ida
selenium.Click "css=div.jqTransformSelectWrapper > div > span "


        'Funciona quando é visível o numero do dropdown
     
         selenium.Click "//div[@id='marketDate_1']/div[2]/div/ul/li[2]/a"
         selenium.Click "link=30"

    'Não funciona quando seleciono o dia 30 de primeira

    'selenium.Click "//div[@id='marketDate_1']/div[2]/div/ul/li[2]/a"
    'selenium.Click "link=30"
  
  
  'Outra forma de selecionar a data, mas também não funciona adequadamente.
  
  'selenium.Click "css=div.diaIda.hoverBlue > div.jqTransformSelectWrapper > div > a.jqTransformSelectOpen"
  'selenium.Click ("link=29")
  
  
  
  'Restante do código para selecionar o mês de ida, data de volta (dia/mês/ano), selecionar "data flexível" e 1 adulto
    
  selenium.Click "css=div.mesIda.hoverBlue > div.jqTransformSelectWrapper > div > a.jqTransformSelectOpen"
  selenium.Click "link=out 16"
  selenium.Click "css=#marketDate_2 > div.diaIda.hoverBlue > div.jqTransformSelectWrapper > div > a.jqTransformSelectOpen"
  selenium.Click "xpath=(//a[contains(text(),'30')])[2]"
  selenium.Click "css=#marketDate_2 > div.mesIda.hoverBlue > div.jqTransformSelectWrapper > div > a.jqTransformSelectOpen"
  selenium.Click "xpath=(//a[contains(text(),'out 16')])[2]"
  selenium.Click "css=div.searchButtonPrice > span.jqTransformCheckboxWrapper > a.jqTransformCheckbox"
  selenium.Click "id=priceSearchCheck"
  selenium.Click "css=div.item.hoverBlue > div.jqTransformSelectWrapper > div > span"
  selenium.Click "xpath=(//a[contains(text(),'1')])[53]"
  selenium.clickAndWait "id=ControlGroupSearchView2_LinkButtonSubmit"
  selenium.Click "id=ControlGroupScheduleSelectView_AvailabilityInputScheduleSelectView1_RadioButtonMkt1Fare5"
  selenium.Click "id=ControlGroupScheduleSelectView_AvailabilityInputScheduleSelectView1_RadioButtonMkt2Fare23"
  selenium.Click "css=div.radioArea > span.jqTransformRadioWrapper > a.jqTransformRadio"
  selenium.Click "id=ControlGroupScheduleSelectView_AvailabilityInputScheduleSelectView1_RadioButtonMkt1Fare4"
  selenium.Click "id=ControlGroupScheduleSelectView_AvailabilityInputScheduleSelectView1_RadioButtonMkt1Fare4"
  selenium.Click "css=#BackPrices > div.tab-content > table.info-table > tbody > tr.flightInfo > td.fareCol1.promo > div.radioArea > span.jqTransformRadioWrapper > a.jqTransformRadio"
  selenium.Click "id=ControlGroupScheduleSelectView_AvailabilityInputScheduleSelectView1_RadioButtonMkt2Fare22"
  selenium.Click "id=ControlGroupScheduleSelectView_AvailabilityInputScheduleSelectView1_RadioButtonMkt2Fare22"
  selenium.Click "css=#BackPrices > div.tab-content > table.info-table > tbody > tr.flightInfo > td.fareCol1.promo > div.radioArea > span.jqTransformRadioWrapper > a.jqTransformRadio.jqTransformChecked"
  selenium.Click "id=ControlGroupScheduleSelectView_AvailabilityInputScheduleSelectView1_RadioButtonMkt2Fare22"
  selenium.Click "id=ControlGroupScheduleSelectView_AvailabilityInputScheduleSelectView1_RadioButtonMkt2Fare22"

  selenium.stop
End Sub

Obs: Para usar a "extensão" Selenium, basta baixa da internet: Selenium Wrapper type library.

Abraços