Guest User

Untitled

a guest
Feb 16th, 2018
331
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.48 KB | None | 0 0
  1. install.packages("httr")
  2. install.packages("XML")
  3.  
  4. library(httr)
  5. library(XML)
  6.  
  7. baseurl <-c("http://hidroweb.ana.gov.br/Estacao.asp?Codigo=", "&CriaArq=true&TipoArq=1")
  8.  
  9. estacoes <- c(2851050, 2751025, 2849035, 2750004, 2650032, 2850015, 123)
  10.  
  11. for (est in estacoes){
  12. r <- POST(url = paste0(baseurl[1], est, baseurl[2]), body = list(cboTipoReg = "10"), encode = "form")
  13. if (r$status_code == 200) {
  14. cont <- content(r, as = "text")
  15. arquivo <- unlist(regmatches(cont, gregexpr("ARQ.+/CHUVAS.ZIP", cont)))
  16. arq.url <- paste0("http://hidroweb.ana.gov.br/", arquivo)
  17. download.file(arq.url, paste0(est, ".zip"), mode = "wb")
  18. cat("Arquivo", est, "salvo com sucesso.n")
  19. } else {
  20. cat("Erro no arquivo", est, "n")
  21. }
  22. }
  23.  
  24. # trying URL 'http://hidroweb.ana.gov.br/ARQ/A20150910-005606-786/CHUVAS.ZIP'
  25. # Content type 'application/x-zip-compressed' length 6532 bytes
  26. # downloaded 6532 bytes
  27. #
  28. # Arquivo 2851050 salvo com sucesso.
  29. # trying URL 'http://hidroweb.ana.gov.br/ARQ/A20150910-005607-172/CHUVAS.ZIP'
  30. # Content type 'application/x-zip-compressed' length 6734 bytes
  31. # downloaded 6734 bytes
  32. #
  33. # Arquivo 2751025 salvo com sucesso.
  34. # trying URL 'http://hidroweb.ana.gov.br/ARQ/A20150910-005608-703/CHUVAS.ZIP'
  35. # Content type 'application/x-zip-compressed' length 6737 bytes
  36. # downloaded 6737 bytes
  37. #
  38. # Arquivo 2849035 salvo com sucesso.
  39. # trying URL 'http://hidroweb.ana.gov.br/ARQ/A20150910-005609-783/CHUVAS.ZIP'
  40. # Content type 'application/x-zip-compressed' length 3995 bytes
  41. # downloaded 3995 bytes
  42. #
  43. # Arquivo 2750004 salvo com sucesso.
  44. # trying URL 'http://hidroweb.ana.gov.br/ARQ/A20150910-005610-492/CHUVAS.ZIP'
  45. # Content type 'application/x-zip-compressed' length 10751 bytes (10 KB)
  46. # downloaded 10 KB
  47. #
  48. # Arquivo 2650032 salvo com sucesso.
  49. # trying URL 'http://hidroweb.ana.gov.br/ARQ/A20150910-005613-538/CHUVAS.ZIP'
  50. # Content type 'application/x-zip-compressed' length 4625 bytes
  51. # downloaded 4625 bytes
  52.  
  53. # hidroweb.py
  54. # -*- coding: utf-8 -*-
  55.  
  56. # pip install beautifulsoup4
  57. # pip install requests
  58.  
  59. import requests
  60. import re
  61. import shutil
  62. from bs4 import BeautifulSoup
  63.  
  64.  
  65. class Hidroweb(object):
  66.  
  67. url_estacao = 'http://hidroweb.ana.gov.br/Estacao.asp?Codigo={0}&CriaArq=true&TipoArq={1}'
  68. url_arquivo = 'http://hidroweb.ana.gov.br/{0}'
  69.  
  70. def __init__(self, estacoes):
  71. self.estacoes = estacoes
  72.  
  73. def montar_url_estacao(self, estacao, tipo=1):
  74. return self.url_estacao.format(estacao, tipo)
  75.  
  76. def montar_url_arquivo(self, caminho):
  77. return self.url_arquivo.format(caminho)
  78.  
  79. def montar_nome_arquivo(self, estacao):
  80. return u'{0}.zip'.format(estacao)
  81.  
  82. def salvar_arquivo_texto(self, estacao, link):
  83. r = requests.get(self.montar_url_arquivo(link), stream=True)
  84. if r.status_code == 200:
  85. with open(self.montar_nome_arquivo(estacao), 'wb') as f:
  86. r.raw.decode_content = True
  87. shutil.copyfileobj(r.raw, f)
  88. print '** %s ** (baixado)' % (estacao, )
  89. else:
  90. print '** %s ** (problema)' % (estacao, )
  91.  
  92. def obter_link_arquivo(self, response):
  93. soup = BeautifulSoup(response.content)
  94. return soup.find('a', href=re.compile('^ARQ/'))['href']
  95.  
  96. def executar(self):
  97. post_data = {'cboTipoReg': '10'}
  98.  
  99. for est in self.estacoes:
  100. print '** %s **' % (est, )
  101. r = requests.post(self.montar_url_estacao(est), data=post_data)
  102. link = self.obter_link_arquivo(r)
  103. self.salvar_arquivo_texto(est, link)
  104. print '** %s ** (concluído)' % (est, )
  105.  
  106. if __name__ == '__main__':
  107. estacoes = ['2851050', '2751025', '2849035', '2750004', '2650032',
  108. '2850015', ]
  109. hid = Hidroweb(estacoes)
  110. hid.executar()
  111.  
  112. # saída
  113. # ** 2851050 **
  114. # ** 2851050 ** (baixado)
  115. # ** 2851050 ** (concluído)
  116. # ** 2751025 **
  117. # ** 2751025 ** (baixado)
  118. # ** 2751025 ** (concluído)
  119. # ** 2849035 **
  120. # ** 2849035 ** (baixado)
  121. # ** 2849035 ** (concluído)
  122. # ** 2750004 **
  123. # ** 2750004 ** (baixado)
  124. # ** 2750004 ** (concluído)
  125. # ** 2650032 **
  126. # ** 2650032 ** (baixado)
  127. # ** 2650032 ** (concluído)
  128. # ** 2850015 **
  129. # ** 2850015 ** (baixado)
  130. # ** 2850015 ** (concluído)
  131.  
  132. ___________________________-> Python - Hidroweb <-______________________________
  133.  
  134. Autor: Arthur Alvin 25/04/2015
  135. afmalvim@gmail.com
  136.  
  137. Modificação: Jean Favaretto 16/07/2015
  138. jeanfavaretto@gmail.com
  139.  
  140. Modificação:Vitor Gustavo Geller 16/07/2015
  141. vitorgg_hz@hotmail.com
  142.  
  143. ______________________________-> Comentários <-_________________________________
  144.  
  145. O script Python HidroWeb foi criado para automatizar o procedimento de aquisição
  146. de dados das estações do portal: http://hidroweb.ana.gov.br/
  147.  
  148. Para utilizar o script deverao ser instaladas as bibliotecas:
  149. -> requests
  150. -> beautifulsoup4 (ou superior)
  151.  
  152. UTILIZACAO:
  153.  
  154. Apos a instalacao das bibliotecas cria-se um Arquivo de Entrada, com o numero
  155. das estacoes. A proxima etapa será inicilizar o script, entao ele abrir uma
  156. janela para selecionar o Arquivo de Entrada. Como saída o HidroWeb - Python,
  157. retorna duas informacoes. A primeira em tela, contendo a situacao do download.
  158. Por fim, gera-se no mesmo diretorio do Arquivo de Entrada, os arquivos de cada
  159. estacao que foi possivel realizar a transferencia (baixada).
  160.  
  161.  
  162. ARQUIVO DE ENTRADA:
  163.  
  164. A entrada deve ser um arquivo *.txt contendo o número das estação a serem
  165. baixadas, com a seguinte estrutura:
  166. -> O número das estacoes defem ser digitadas linhas apos linhas,
  167. sem cabecalhos, sem espacos, nem separadores (, . ;).
  168. -> Simplismente um Enter após cada numero de estacao.
  169.  
  170. 02751025
  171. 02849035
  172. 02750004
  173. 02650032
  174. 02850015
  175.  
  176.  
  177. SAIDAS:
  178.  
  179. Situação das transferencias em Tela:
  180. ** 02851050 **
  181. ** 02851050 ** (baixado)
  182. ** 02851050 ** (concluído)
  183.  
  184. No diretorio do Arquivo de Entrada serao criados os arquivos de saida contendo
  185. a informacao disponivel de cada estacao baixada.
  186.  
  187. OBS: Tenha certeza que todos numeros das estacao existam, caso contrario da
  188. "BuuuG".
  189. Palavras chave: HidroWeb, ANA, Estacoes, Pluviometricas, Fluviometricas,
  190. Precipitacao, Vazao, Cotas, baixar, download.
  191. """
  192.  
  193. # ******** DECLARACOES INICIAIS
  194. import os
  195. import Tkinter, tkFileDialog
  196. import sys
  197. import requests
  198. import re
  199. import shutil
  200. from bs4 import BeautifulSoup
  201.  
  202. # By Vitor
  203.  
  204. # ABRE ARQUIVO DE ENTRADA
  205. root = Tkinter.Tk()
  206. entrada = tkFileDialog.askopenfile(mode='r')
  207. root.destroy()
  208.  
  209. #****************---------------correcao de bug--------------********************
  210. if (entrada == None):
  211. sair = raw_input('tArquivo de entrada nao selecionado. nttPressione enter para sair.n')
  212. sys.exit()
  213. #****************---------------fim da correcao--------------********************
  214.  
  215. pathname = os.path.dirname(entrada.name) #define o path de trabalho igual ao do arquivo de entrada
  216. os.chdir(pathname) #muda caminho de trabalho.
  217.  
  218. VALORES = []
  219.  
  220. # By Jean
  221.  
  222. while True:
  223.  
  224. conteudo_linha = entrada.read().split("n")
  225. VALORES.append(conteudo_linha)
  226.  
  227. if (len(conteudo_linha) <= 1):
  228. break
  229.  
  230. print VALORES, "n"
  231.  
  232.  
  233. #### By Arthur
  234.  
  235. class Hidroweb(object):
  236.  
  237. url_estacao = 'http://hidroweb.ana.gov.br/Estacao.asp?Codigo={0}&CriaArq=true&TipoArq={1}'
  238. url_arquivo = 'http://hidroweb.ana.gov.br/{0}'
  239.  
  240. def __init__(self, estacoes):
  241. self.estacoes = estacoes
  242.  
  243. def montar_url_estacao(self, estacao, tipo=1):
  244. return self.url_estacao.format(estacao, tipo)
  245.  
  246. def montar_url_arquivo(self, caminho):
  247. return self.url_arquivo.format(caminho)
  248.  
  249. def montar_nome_arquivo(self, estacao):
  250. return u'{0}.zip'.format(estacao)
  251.  
  252. def salvar_arquivo_texto(self, estacao, link):
  253. r = requests.get(self.montar_url_arquivo(link), stream=True)
  254. if r.status_code == 200:
  255. with open(self.montar_nome_arquivo(estacao), 'wb') as f:
  256. r.raw.decode_content = True
  257. shutil.copyfileobj(r.raw, f)
  258. print '** %s ** (baixado)' % (estacao, )
  259. else:
  260. print '** %s ** (problema)' % (estacao, )
  261.  
  262. def obter_link_arquivo(self, response):
  263. soup = BeautifulSoup(response.content)
  264. return soup.find('a', href=re.compile('^ARQ/'))['href']
  265.  
  266. def executar(self):
  267. post_data = {'cboTipoReg': '10'}
  268.  
  269. for est in self.estacoes:
  270. print '** %s **' % (est, )
  271. r = requests.post(self.montar_url_estacao(est), data=post_data)
  272. link = self.obter_link_arquivo(r)
  273. self.salvar_arquivo_texto(est, link)
  274. print '** %s ** (concluído)' % (est, )
  275.  
  276. if __name__ == '__main__':
  277. estacoes = VALORES[::1][0]
  278. hid = Hidroweb(estacoes)
  279. hid.executar() `
  280.  
  281. list(cboTipoReg = "10")
  282.  
  283. post_data = {'cboTipoReg': '10'}
Add Comment
Please, Sign In to add comment