Múltiplos downloads de fonte pública (web site), como contornar “clicar no botão OK” acionado pelo Javascript?

1

Estou tentando fazer o download de vários conjuntos de dados de uma fonte pública, o Registro de transações da União Europeia .

Estou usando a ferramenta de pesquisa "Alocação / conformidade" (no painel azul esquerdo).

De lá, devo selecionar um país e clicar em "pesquisar". Eu então tenho acesso a vários anos (2010, 2011, 2012, etc ...). Eu quero baixar os arquivos para todos os países (28) e todos os anos anteriores (de 2005 a 2013), ou seja, 252 solicitações pelo menos.

Eu tentei descobrir como usar diretamente o URL de download. O URL final (neste caso, para a Bulgária em 2010) é os seguintes .

A partir deste URL, posso:

  • tira o parâmetro "& installationAllowance = 35266538"
  • tira o parâmetro "& registryCodeLookup = Bulgaria"
  • altere o parâmetro "& periodYear = 2010" (para alterar a data de referência)
  • altere o parâmetro "& registryCode = BG" (para alterar o país).

Meu único problema até agora é que cada link requer uma validação da página de download (um clique em um botão "OK").

No código-fonte da página, vejo que a função acionada é a seguinte:

<form name="export" method="POST" action="http://ec.europa.eu/environment/ets/export.do">

O código do botão "OK" é o seguinte:

<input type="submit" name="OK" value="Ok" class="FormButton" id="btnOK">

Existe também um bloco de JavaScript na origem da página.

Como eu posso baixar esses arquivos em massa? (Eu estava pensando em criar um monte de links, substituindo os anos e países com um RegEx, e depois usando a extensão "DownThemAll" para o Firefox, com a opção "download do arquivo").

    
por Juscho 18.02.2015 / 11:14

1 resposta

1

Eu definitivamente consideraria usar o python com módulo chamado selenium .

Você pode automatizar facilmente qualquer ação do navegador (até mesmo com o PhantomJS ).

Exemplo mais simples:

driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()

O código acima abrirá a página web do python.org, encontrará o elemento q , digite "pycon", pressione enter e verifique se houve algum resultado retornado.

Você pode definir algumas cadeias de ações que deseja realizar:

actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()

Você pode encontrar o botão "OK" que precisa ser clicado:

button_ok = driver.find_element_by_id('button')

e clique nele:

button_ok.click()

Os Xpaths também podem ser usados para pesquisar por determinados elementos: /html/body/button .

Se você estiver interessado com esta solução, considere rever a documentação que está muito bem escrita e certamente permitirá que você crie a versão final. solução em pouco tempo.

    
por 18.02.2015 / 12:28