中国天气网爬虫

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()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值