Pythonは天気検索ソフトを実現します。


一、背景
ある日のクラスは雨にぬれてぬれねずみになりました。友達の輪を作って感慨を覚えました。
夜が更けて人が寝静まると、後輩からPyファイルが突然届きました。運行後、簡単ではないことが分かりました。

これは私を暗示しています。今度出かける時に彼女に傘を持ってきます。とにかく、プログラム猿として、プログラムがあったら分解してください。
二、工具
爬虫類:requests
解析:re
UI:tkinter
三、コード解読
天気予報を得るための手続きをしたいです。まず、天気予報の登用ができます。ここでは都市名に百度の天気に合ったURLを使ってよじ登り、正規の方法で解析し、結果を辞書で返します。

class Weather(object):
    def __init__(self):
        pass
 
    def crawl(self, key):
 
        url = 'http://weathernew.pae.baidu.com/weathernew/pc?query=' + key + '  &srcid=4982&city_name=' + key + '&province_name=' + key
 
        #      
        headers = {
            'user-agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
            'Referer': 'https://googleads.g.doubleclick.net/'
        }
        #   HTML
        res = requests.get(url, headers=headers).text
        #   
        time = re.search(r'\{\"update_time\":\"(.+?)\"', res).group(1)
        #   
        weather = re.search(r'\"weather\"\:\"(.+?)\"', res).group(1)
        weather = weather.encode('utf-8').decode("unicode-escape")
        #   
        weather_l = re.search(r'temperature_night\"\:\"(.+?)\"', res).group(1)
        weather_h = re.search(r'temperature_day\"\:\"(.+?)\"', res).group(1)
        #   
        wind_now = re.search(r'\"wind_power_day\"\:\"(.+?)\"', res).group(1)
        wind_now = wind_now.encode('utf-8').decode("unicode-escape")
        wind_name = re.search(r'\"wind_direction_day\"\:\"(.+?)\"',
                              res).group(1)
        wind_name = wind_name.encode('utf-8').decode("unicode-escape")
        wind = wind_name + wind_now
        #   
        desc = re.search(r'\"desc\"\:\"(.+?)\"', res).group(1)
        desc = desc.encode('utf-8').decode("unicode-escape")
 
        #    
        dic = {
            '  ': key,
            '    ': time,
            '  ': weather,
            '  ': weather_l + '-' + weather_h + '   ',
            '  ': wind,
            '  ': desc,
        }
        return dic
天気予報のコードを書いたら、UIを書いて入力/よじ登る内容とインタラクティブにすることができます。UIの書き方は大同小異です。コードは以下の通りです。

class Weather_UI(object):
    def __init__(self):
        self.window = Tk()
        self.weather = Weather()
 
        self.window.title(u'    ')
        #          
        self.window.geometry('310x370')
        #        
        self.result_text0 = Label(self.window, text=u'      :
') self.result_text0.place(x=10, y=5, height=130) self.result_text0.bind(' ') self.result_text1 = Text(self.window, background='#ccc') self.result_text1.place(x=140, y=10, width=155, height=155) self.result_text1.bind("<Key-Return>", self.submit) # # self.submit_btn = Button(self.window, text=u' ', command=self.submit) self.submit_btn.place(x=170, y=165, width=70, height=25) self.submit_btn2 = Button(self.window, text=u' ', command=self.clean) self.submit_btn2.place(x=250, y=165, width=35, height=25) # self.title_label = Label(self.window, text=u' :') self.title_label.place(x=10, y=165) # self.result_text = Text(self.window, background='#ccc') self.result_text.place(x=10, y=190, width=285, height=165) def submit(self): # content = self.result_text1.get(0.0, END).strip().replace("
", " ") # result = self.weather.crawl(content) # for k, v in result.items(): self.result_text.insert(END, k + ':' + v) self.result_text.insert(END, '
') self.result_text.insert(END, '
') # def clean(self): self.result_text1.delete(0.0, END) self.result_text.delete(0.0, END) def run(self): self.window.mainloop()
運転結果は以下の通りです。

四、完全コード

import json
import requests
import re
import tkinter as Tk
from tkinter import Tk, Button, Entry, Label, Text, END
 
 
class Weather(object):
    def __init__(self):
        pass
 
    def crawl(self, key):
 
        url = 'http://weathernew.pae.baidu.com/weathernew/pc?query=' + key + '  &srcid=4982&city_name=' + key + '&province_name=' + key
 
        #      
        headers = {
            'user-agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
            'Referer': 'https://googleads.g.doubleclick.net/'
        }
        #   HTML
        res = requests.get(url, headers=headers).text
        #   
        time = re.search(r'\{\"update_time\":\"(.+?)\"', res).group(1)
        #   
        weather = re.search(r'\"weather\"\:\"(.+?)\"', res).group(1)
        weather = weather.encode('utf-8').decode("unicode-escape")
        #   
        weather_l = re.search(r'temperature_night\"\:\"(.+?)\"', res).group(1)
        weather_h = re.search(r'temperature_day\"\:\"(.+?)\"', res).group(1)
        #   
        wind_now = re.search(r'\"wind_power_day\"\:\"(.+?)\"', res).group(1)
        wind_now = wind_now.encode('utf-8').decode("unicode-escape")
        wind_name = re.search(r'\"wind_direction_day\"\:\"(.+?)\"',
                              res).group(1)
        wind_name = wind_name.encode('utf-8').decode("unicode-escape")
        wind = wind_name + wind_now
        #   
        desc = re.search(r'\"desc\"\:\"(.+?)\"', res).group(1)
        desc = desc.encode('utf-8').decode("unicode-escape")
 
        #    
        dic = {
            '  ': key,
            '    ': time,
            '  ': weather,
            '  ': weather_l + '-' + weather_h + '   ',
            '  ': wind,
            '  ': desc,
        }
        return dic
 
 
class Weather_UI(object):
    def __init__(self):
        self.window = Tk()
        self.weather = Weather()
 
        self.window.title(u'    ')
        #          
        self.window.geometry('310x370')
        #        
        self.result_text0 = Label(self.window, text=u'      :
') self.result_text0.place(x=10, y=5, height=130) self.result_text0.bind(' ') self.result_text1 = Text(self.window, background='#ccc') self.result_text1.place(x=140, y=10, width=155, height=155) self.result_text1.bind("<Key-Return>", self.submit) # # self.submit_btn = Button(self.window, text=u' ', command=self.submit) self.submit_btn.place(x=170, y=165, width=70, height=25) self.submit_btn2 = Button(self.window, text=u' ', command=self.clean) self.submit_btn2.place(x=250, y=165, width=35, height=25) # self.title_label = Label(self.window, text=u' :') self.title_label.place(x=10, y=165) # self.result_text = Text(self.window, background='#ccc') self.result_text.place(x=10, y=190, width=285, height=165) def submit(self): # content = self.result_text1.get(0.0, END).strip().replace("
", " ") # result = self.weather.crawl(content) # for k, v in result.items(): self.result_text.insert(END, k + ':' + v) self.result_text.insert(END, '
') self.result_text.insert(END, '
') # def clean(self): self.result_text1.delete(0.0, END) self.result_text.delete(0.0, END) def run(self): self.window.mainloop() A = Weather_UI() A.run()
ここでPython天気検索システムの実現についての記事を紹介します。Python天気に関するお問い合わせの内容は以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。