import wx
import wx.grid
import sqlite3
import requests
from bs4 import BeautifulSoup
class MyGrid(wx.grid.Grid):
def __init__(self,parent):
wx.grid.Grid.__init__(self,parent,pos=(20,40),size=(583,180))
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,'天气预报',size=(640,350))
panel = wx.Panel(self)
self.grid = MyGrid(panel)
self.grid.CreateGrid(7, 5)
self.name = '高淳'
self.number = self.Get_number(self.name)
data = self.Get_data(self.number)
colLabels = ['天气情况', '最高温', '最低温', '风向', '风速']
for i in range(5):
self.grid.SetColLabelValue(i,colLabels[i])
for i in range(7):
self.grid.SetRowLabelValue(i,data[i][0])
self.grid.SetLabelBackgroundColour('yellow')
self.label=wx.StaticText(panel,-1,'未来一周内'
+ self.name +
'天气(数据来源:中国天气网)',(200,10))
self.bt = wx.Button(panel, -1, '更改地点', (130, 250))
self.bt2 = wx.Button(panel, -1, '刷新', (360, 250))
self.bt.Bind(wx.EVT_BUTTON, self.Event_change)
self.bt2.Bind(wx.EVT_BUTTON, self.Event_refresh)
self.Show_data(data)
def Show_data(self,data):
for i in range(7):
for j in range(1,6):
self.grid.SetCellValue(i,j-1,data[i][j])
self.grid.SetColSize(0,150)
self.grid.SetColSize(1,40)
self.grid.SetColSize(2, 40)
self.grid.SetColSize(3, 150)
self.grid.SetColSize(4, 120)
def Event_change(self,e):
dlg = wx.TextEntryDialog(self,'输入地点:','更改地点')
if dlg.ShowModal() == wx.ID_OK:
name = dlg.GetValue()
result = self.Get_number(name)
if result:
self.name = name
self.number = result
data = self.Get_data(result)
self.label.SetLabel('未来一周内'
+ self.name +
'天气(数据来源:中国天气网)')
self.Show_data(data)
def Event_refresh(self,e):
data = self.Get_data(self.number)
self.Show_data(data)
def Get_number(self,name):
conn = sqlite3.connect('citynum.db')
cursor = conn.cursor()
cursor.execute('select * from user where name=?', (name,))
try:
number = cursor.fetchone()
except ValueError:
return None
cursor.close()
conn.close()
return number[0]
def Get_data(self,number):
url = 'http://www.weather.com.cn/weather/' + number + '.shtml'
response = requests.get(url) # 获取请求数据
response.encoding = "utf-8" # 编码为utf-8,解决中文乱码的问题
string = response.text # 转换为html文本格式
soup = BeautifulSoup(string, features="lxml") # beautisoup处理html格式
wea_list = soup.select('li[class^="sky skyid"]')
data = []
for i in wea_list:
date = i.select('h1')[0].text
wea = i.select('p.wea')[0].get('title')
htem = i.select('p.tem > span')
if len(htem) == 0:
htem = 'None'
else:
htem = htem[0].text
ltem = i.select('p.tem > i')[0].text
wd_list = i.select('p.win > em > span')
if len(wd_list) == 2:
wd1 = wd_list[0].get('title')
wd2 = wd_list[1].get('title')
if wd1 == wd2:
wd = wd1
else:
wd = wd1+'转'+wd2
else:
wd = wd_list[0].get('title')
ws = i.select('p.win > i')[0].text
temp = (date,wea, htem, ltem, wd, ws)
data.append(temp)
return data
app = wx.App()
frame = MyFrame()
frame.Show()
app.MainLoop()
中国天气网爬虫
最新推荐文章于 2024-06-27 17:20:29 发布