• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

rolando2424

Ver qual o estado do tempo

12 mensagens neste tópico

Este pequeno script que fiz agora serve para ir ao site do instituto de meteorologia (http://www.meteo.pt/) e ir ver qual é o estado do tempo e a temperatura máxima e mínina no Porto (porque é onde moro e não tive pachorra para fazer para as outras cidades, depois eu trato disso) EDIT: Já está a dar para várias cidades, só têm que ir à variável patt e no temp["Porto"] colocar lá o nome da cidade que querem saber a informação (consultem a variável temp). Depois faço uma interface para isto.

#!usr/bin/env python
# -*- coding: iso-8859-15 -*-

import urllib
import re
import pdb

## TODO: Search cities with only one word (for example, "Viana" should find "Viana do Castelo")
##       Create an update_cache method (maybe call it once every hour and then delete the file
##       when with the __del__ method?)

class Client:
    """Connects to the Portuguese weather institute to see the weather
    conditions and the temperature of several Portuguese cities.


    Check what cities you can search in the following web page:
        http://www.meteo.pt/pt/html.jsp
    """

    def __init__(self):
        ## TODO: Check if the computer is connected to the internet
        try:
            self.page = urllib.urlopen("http://www.meteo.pt/pt/html.jsp")
        except IOError:
            print "There isn't a connection to the internet" # No connection to teh tubes

        # Format the content of the web page
        tmp_content = self.page.readlines()
        self.content = []
        saving = 0 # The page is divided into 2 tables, so we only start
                   # saving things when this reaches 2
        for line in tmp_content:
            line = line.replace("\n", "").replace("\r", "")
            if saving == 2:
                self.content.append(line)
            if "tablelist_wid" in line:
                saving += 1
            else:
                pass

        self.content = "\n".join(self.content)

        # Cities not working: braganca, evora
        # Cities removed from the web page: angra do heroismo, santarem, guarda
        #      braga,
        # New cities: Evora, Flores, Ponta Delgada, Porto Santo,
        #             Viana do Castelo, Vila Real, Viseu
        self.known_cities= (
                "beja", "braganca", "cabo carvoeiro", "castelo branco",
                "coimbra", "evora", "faro", "flores", "funchal", "horta",
                "lisboa", "ponta delgada", "penhas douradas", "portalegre", "porto",
                "porto santo", "sagres", "sines", "viana do castelo", "viana castelo",
                "vila real", "viseu"
                # "bragança", "évora"
                )

        # This will be used in the future, ignore it for now (it does nothing)
        self.city_convertion = {
                "braganca":"bragança",
                "evora":"évora",
                ## TODO: Finish this thing
                }

        self.pattern = re.compile(r"""
            # The .*? at the end of the lines is so remove the \t
            # characters that appear in the page source

            <tr\ class="tablelist_bg[01]">.*?    # Start of a city's information
            <td> (.*?) </td>.*?                  # Name of the city
            <td\ align="center"> (.*?) </td>.*?  # Weather Status
            <td\ align="center"> (.*?) </td>.*?  # Temperature
            <td\ align="center"> (.*?) </td>.*?  # Velocity of the wind
            <td\ align="center"> (.*?) </td>.*?  # Direction of the wind
            <td\ align="center"> (.*?) </td>.*?  # Humidity (percentage)
            <td\ align="center"> (.*?) </td>.*?  # Precipitation (mm)
            <td\ align="center"> (.*?) </td>.*?  # Pressure (hPa)
            <td\ align="center"> (.*?) </td>.*?  # Mist (percentage)
            <td\ align="center"> (.*?) </td>     # Snow (cm)
            """, re.DOTALL | re.VERBOSE)


    def search_city(self, city_name):
        """Search the web page source code and retrieve the information that
        exists for the city "city_name"

        Returns a tuple with the information in the following order:
            (
                Name of the city,
                Weather,
                Temperature (ºC),
                Speed of the wind (km/h),
                Direction of the wind (cardinal points),
                Humidity in the air (%),
                Precipitation (mm),
                Pressure (hPa),
                Mist in the air (%),
                Snow on the ground (cm)
            )

        If the web page doesn't have some the information for the city, that
        stat will get the value of "---"

        """
        city_name = city_name.capitalize()

        if city_name == "Viana do castelo": # Workaround (city is called Viana
                                            # Castelo in the web page)
            city_name = "Viana"

        results = re.findall(self.pattern, self.content)

        for line in results:

            line = list(line) # re.findall return a list of tuples, so we
                              # need to convert the tuple to a list so we can
                              # make some changes into it

            line[0] = line[0].split("(")[0].strip() # Remove adicional stuff from the name
            line[0] = line[0].capitalize() # So it stays the same as the city_name

            # These two cities have a similar name, so we need to workaround them
            if city_name == "Porto" and city_name == line[0]:
                return line
            elif city_name == "Porto santo" and city_name in line[0]:
                return line

            elif city_name in line[0]:
                return line


    def get_information(self, city):
        """Get information for the city from the web page's source.

        Returns a tuple with the information about the city in the
        following format:
            (
                Name of the city,
                Weather,
                Temperature (ºC),
                Speed of the wind (km/h),
                Direction of the wind (cardinal points),
                Humidity in the air (%),
                Precipitation (mm),
                Pressure (hPa),
                Mist in the air (%),
                Snow on the ground (cm)
            )

        If the web page doesn't have some the information for the city, that
        stat will get the value of "Informacao nao disponivel"

        Returns 1 if the city doesn't exist in the web page.
        """
        if city.lower() not in self.known_cities:
            return 1
        else:
            #pdb.set_trace()
            tmp_result = self.search_city(city)
            result = []
            for info in tmp_result:
                if info == "---":
                    result.append("Informacao nao disponivel")
                else:
                    result.append(info)
            return tuple(result)



if __name__ == "__main__":
    c = Client()
    (place, weather, temp, vel_wind, dir_wind, humidity, rain, pressure,
            mist, snow) = c.get_information("Porto")
    print "Estado do tempo:", weather
    print "Temperatura:", temp

Exemplo de uso:

rolando@main-computer:~/Desktop$ python meteo.py

Porto: Aguaceiros

Temperatura minima: 19

Temperatura maxima: 12

rolando@main-computer:~/Desktop$

EDIT @ Skin : Geshied correctly

EDIT2: Actualizei o código, mas para obterem as novas versões do código, se calhar é melhor irem ao site onde está o bot de IRC do Tharis, pois este código passou a fazer parte desse projecto.

Link (syntax highlight): http://code.google.com/p/ircbot-in-python/source/browse/trunk/meteo.py

Link (plain text): http://ircbot-in-python.googlecode.com/svn/trunk/meteo.py

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu já pensei eu fazer algo parecido alias ainda comecei mas depois parei por falta de tempo, no meu caso seria um site internacional de meteorologia que é muito usado a nível de agricultora a muito certo e depois de processados os dados era enviada uma sms para determinados números de telemóveis coma a previsão do tempo. Era algo para trabalhar como servidor e enviaria previsão tipo 3 vezes ao dia.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu já pensei eu fazer algo parecido alias ainda comecei mas depois parei por falta de tempo, no meu caso seria um site internacional de meteorologia que é muito usado a nível de agricultora a muito certo e depois de processados os dados era enviada uma sms para determinados números de telemóveis coma a previsão do tempo. Era algo para trabalhar como servidor e enviaria previsão tipo 3 vezes ao dia.

Eu por acaso também tenho um pequeno alias (e um pequeno script) de bash que utiliza um programa chamado "metar" que se liga a uma base de temperaturas internacionais para ir buscar as temperaturas no Porto.

alias metar_portugal="metar -d lppr" # Porto, Pedras Rubras

function temp()
{
    metar -d lppr | echo -ne "A temperatura actual e: ${LIGHTRED}$(awk '/Temperature/ {print $3}') ${NC}graus.\n"
}

(O ${LIGHTRED} e o ${NC} são umas variáveis para ser mais fácil mudar a cor)

Para usar é só:

rolando@main-computer:~$ metar_portugal

LPPR 121830Z 23007KT 190V270 9999 BKN012 15/13 Q1015

Station       : LPPR

Day           : 12

Time          : 18:30 UTC

Wind direction: 230 (SW)

Wind speed    : 7 KT

Wind gust     : 7 KT

Visibility    : 9999 M

Temperature   : 15 C

Dewpoint      : 13 C

Pressure      : 1015 hPa

Clouds        : BKN at 12900 ft

Phenomena     :

rolando@main-computer:~$ temp

A temperatura actual é: 15 graus.

Eu só fiz o script em Python porque já era algo que vinha com intenções de fazer desde à já algum tempo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

rolando2424, no primeiro scipt (usando o python), na ultima parte onde dizes as temperaturas não terás trocado as frases, ou as temperaturas?

Tu tens isto:

print
print result[0]
print "Temperatura minima:", result[1]
print "Temperatura maxima:", result[2]
print

Eu alterei o "Porto" para "Beja", e ao executar aparece:

Beja: Céu pouco nublado

Temperatura minima: 32

Temperatura maxima: 18

A temp. Máxima não terá trocada com a Mínima?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, está trocado. Na versão nova que tenho aqui feita já está direito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, é melhor actualizar isto com a dita "versão nova".

Acontece que o fnds teve a grande ideia de incorporar este sistema no bot de IRC que o Tharis está a fazer, por isso seria melhor passarem a ir buscar o código novo ao site do bot:

Com syntax highlight:

http://code.google.com/p/ircbot-in-python/source/browse/trunk/meteo.py

Plain text:

http://ircbot-in-python.googlecode.com/svn/trunk/meteo.py

E é melhor actualizarem para esta versão, porque o site do instituto de meteorologia mudou o design, e o script inicial já não funciona.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, é melhor actualizar isto com a dita "versão nova".

Acontece que o fnds teve a grande ideia de incorporar este sistema no bot de IRC que o Tharis está a fazer, por isso seria melhor passarem a ir buscar o código novo ao site do bot:

Com syntax highlight:

http://code.google.com/p/ircbot-in-python/source/browse/trunk/meteo.py

Plain text:

http://ircbot-in-python.googlecode.com/svn/trunk/meteo.py

E é melhor actualizarem para esta versão, porque o site do instituto de meteorologia mudou o design, e o script inicial já não funciona.

E mudou para um design mais fixe :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E mudou para um design mais fixe :D

Eu até me assustei quando vi a página inicial em Flash :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vinha aqui a passear....vi o código....pera lá...eu tb já andei nas meteorologias....e fui ao sotão... :ipool:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib

city = (raw_input("Cidade: "))

code = urllib.urlopen("http://www.meteo.pt/pt/html.jsp").readlines()

op = ["\nLocal:","Estado:","Temp. (ºC):","Vento (vel.):","Vento (dir.):","Humid. (%):",
			"Prec. (mm):","Press (hPa):","Neb. (%):", "Neve (cm):"]

for i in range(300,len(code)):
if city.lower() in code[i].lower():
	for j in range(0,10):
		print op[j],code[i+j][code[i+j].find(">")+1:code[i+j].find("</")]

É um codigo muito simples....como podem ver n tem quaisquer proteccoes, nem "power search"...mas faz o serviço.... :P

É o meu primeiro post aqui no PAP....e espero que não seja o ultimo.... :P

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora