背景
某天下班淋雨成了落湯雞,發了個朋友圈感慨一下啊,然后......
夜深人靜之時,突然收到了來自學妹的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'學長所在城市:\n要寫中文呦')
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("\n", " ")
# 把城市資訊傳到爬蟲函式中
result = self.weather.crawl(content)
# 將結果顯示在視窗中的文本框中
for k, v in result.items():
self.result_text.insert(END, k + ':' + v)
self.result_text.insert(END, '\n')
self.result_text.insert(END, '\n')
# 清空文本域中的內容
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'學長所在城市:\n要寫中文呦')
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("\n", " ")
# 把城市資訊傳到爬蟲函式中
result = self.weather.crawl(content)
# 將結果顯示在視窗中的文本框中
for k, v in result.items():
self.result_text.insert(END, k + ':' + v)
self.result_text.insert(END, '\n')
self.result_text.insert(END, '\n')
# 清空文本域中的內容
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()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/286318.html
標籤:python
