Python爬虫-------天气预报

Python爬虫-------天气预报

首先看一下基本的界面
Python爬虫-------天气预报_第1张图片
这里我们使用的python+pyqt5作为基础界面的配置,按键作查询功能,输入框,输入城市的名称,在一个QListWidget里面展示查询到的天气情况,这里我们只爬取7天的数据,结果的图:
Python爬虫-------天气预报_第2张图片

功能实现

首先我们爬取的是中国天气网的数据,url对应的是北京的天气连接
这样我们就可以获取到网页的信息,在进行爬取之前,我们需要获取城市id与城市名称的对应关系,这样我们才可以,按照id获取对应的城市的天气情况
Python爬虫-------天气预报_第3张图片
对应上面的下载链接
天气的id与city的Excel文档

# 此处我们使用的MySQL的数据库,作为数据的来源,也就是id与city的对应关系
 try:
 	self.conn = mc.connect(host='127.0.0.1', user='root', password='', db='')
 	self.data = self.read_weather()
except mc.errors.ProgrammingError:
    QMessageBox.warning(self, 'Warning', "Can't connect the mysql database")
    sys.exit(-1)
	.......
	# 使用mysql语句进行数据的获取
    def read_weather(self) -> list:
        """
        读取数据库的信息
        :return:
        """
        sql_command = "select * from weather"
        cur = self.conn.cursor()
        cur.execute(sql_command)
        result = []
        for row in cur.fetchall():
            result.append(row)
        return result

上面的代码我们使用mysql进行数据的获取,进行id与city的对应关系,由这样的一层对应关系,我们就可以在输入框的数据进行判断,这样来获取id,在进行数据的爬虫

# 进行id与city的分割,并且对输入框的内容进行判断
 if self.lineEdit.text() == '':
     QMessageBox.warning(self, 'Tip', 'Please input Province(China)')
     return
 city_id = [i for i, province in self.data]
 city_name = [province for i, province in self.data]
 if self.lineEdit.text() in city_name:
     self.get_weather_data(city_id[city_name.index(self.lineEdit.text())])

接下来就是爬虫阶段
分析,我们要获取的数据time,temperature,weather(这里我只获取这三个数据,其中temperature包含temperature_min,temperature_max)
这里我们以北京为例子
Python爬虫-------天气预报_第4张图片
分析之后我们可以获取到数据

    def get_weather_data(self, city_id):
        """
        获取网页的数据,然后进行天气的获取
        :param city_id:
        :return:
        """
        url = self.url % city_id
        response = requests.get(url)
        html = etree.HTML(response.text.encode(response.encoding).decode('utf-8'))
        time = html.xpath('//div[@id="7d"]/ul/li/h1/text()')
        weather = html.xpath('//div[@id="7d"]/ul/li/p/@title')
        temperature_min = html.xpath('//p[@class="tem"]/i/text()')
        temperature_max = html.xpath('//p[@class="tem"]/span/text()')
        temperature_max.insert(0, temperature_min[0])	# 获取的时候temperature_max少了一个数据,所以添加一个本身数据

随后就是将我们爬取到的内容显示到我们的QListWidget里面

weather_data = []
self.list.clear()
for t, w, tm, tx in zip(time, weather, temperature_min, temperature_max):
    line = t + "\t" + w + "\t" + tm + "/" + tx
    weather_data.append(line)
self.list.addItems(weather_data)

这只是一个python爬虫的小实例,

你可能感兴趣的:(学习,mysql,python)