python爬虫系列:一个获取城市天气情况的小工具

作品名称:一个获取城市天气情况的小工具(可视化)
开发环境:PyCharm 2023.3.4 + python3.7
用到的库:sys、pypinyin(文字转换为拼音)、urllib.request、bs4、re
作品简介:运行例子后,先输入城市名称,然后点击按钮“获取天气情况”,最后把该城市的当天和七天天气情况回显到界面,可输入不同的城市名称获取天气情况;如果输入的城市名称错误,则没有数据回显。
实现过程
一、阅读器UI设计

1、安装模块和配置工具,参考《python例子:翻译器(简单》

2、运行工具QtDesigner,利用QtDesigner工具箱设计出界面效果(所需要的控件可查看右边区域),保存效果为文件wi.ui;

3、对文件wi.ui执行pyUIC(ui转化为py代码),执行完生成文件wi.py。

二、代码设计

1、新建文件weather.py,该文件为项目主文件,初始化页面并显示;

2、添加内置模块(下面代码使用)和主方法(用于运行后弹出界面);
"""爬虫系列-获取城市天气情况"""from PyQt5.QtWidgets import *# 引入自定义模块import wi# 引入库import sysfrom pypinyin import pinyin, Style# 导入urllib库的urlopen函数from urllib.request import urlopen, Request# 导入BeautifulSoupfrom bs4 import BeautifulSoup as bfimport re
class parentWindow(QWidget, wi.Ui_Form):    # 初始化方法    def __init__(self):        # 找到父类 首页面        super(parentWindow, self).__init__()        # 初始化页面方法        self.setupUi(self)        # 公共网址        self.url = 'https://www.tianqi.com/'        # 点击获取天气情况        self.getButton.clicked.connect(self.get_data)
if __name__ == '__main__':    # 每一个PyQt5应用都必须创建一个应用对象    app = QApplication(sys.argv)    # 初始化页面    window = parentWindow()    # 显示首页    window.show()    sys.exit(app.exec_())
3、增加函数conversion,用来把文字转换为拼音(获取天气的网址是拼音);
# 文字转拼音def conversion(self, text):    # 使用不带声调的拼音    pinyin_text = pinyin(text, style=Style.NORMAL)    # 将列表中的拼音合并为字符串    no_tone_pinyin = ''.join(''.join(toneless) for toneless in pinyin_text)    return no_tone_pinyin
4、增加公共函数get_weather,用来请求网址,获取天气数据;
def get_weather(self, url, class_name, assembly):    try:        headers = {            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'}        req = Request(url, headers=headers)        # 获取的html内容是字节,将其转化为字符串        html = urlopen(req)        html_text = bytes.decode(html.read())        # 获取页面全部信息        obj = bf(html_text, 'html.parser')        # 获取天气部分的信息        elements = obj.find(class_=class_name).text.strip()        # 使用正则表达式替换多个连续空白行        single_elements = re.sub(r'\n\s*\n', '\n\n', elements)        # 天气信息回显到界面        assembly.setText(single_elements)    except Exception as e:        print(f'错误信息:{e}')        QMessageBox.information(self, '错误信息', '输入的城市名称有错误,请检查一下')
5、增加函数get_data,用来调用其他函数;
def get_data(self):    city = self.cityEdit.text()    if not city:        QMessageBox.information(self, '提示信息', '请先输入城市名称')        return    code = self.conversion(city)    self.get_weather(f'{self.url}{code}', 'weather_info', self.situationEdit)    self.get_weather(f'{self.url}{code}/7/', 'weaul', self.situationEdit_2)
6、全部代码如下。
"""爬虫系列-获取城市天气情况"""from PyQt5.QtWidgets import *# 引入自定义模块import wi# 引入库import sysfrom pypinyin import pinyin, Style# 导入urllib库的urlopen函数from urllib.request import urlopen, Request# 导入BeautifulSoupfrom bs4 import BeautifulSoup as bfimport re

class parentWindow(QWidget, wi.Ui_Form):    # 初始化方法    def __init__(self):        # 找到父类 首页面        super(parentWindow, self).__init__()        # 初始化页面方法        self.setupUi(self)        # 公共网址        self.url = 'https://www.tianqi.com/'        # 点击获取天气情况        self.getButton.clicked.connect(self.get_data)
    # 获取天气函数    def get_data(self):        city = self.cityEdit.text()        if not city:            QMessageBox.information(self, '提示信息', '请先输入城市名称')            return        code = self.conversion(city)        self.get_weather(f'{self.url}{code}', 'weather_info', self.situationEdit)        self.get_weather(f'{self.url}{code}/7/', 'weaul', self.situationEdit_2)
    # 文字转拼音    def conversion(self, text):        # 使用不带声调的拼音        pinyin_text = pinyin(text, style=Style.NORMAL)        # 将列表中的拼音合并为字符串        no_tone_pinyin = ''.join(''.join(toneless) for toneless in pinyin_text)        return no_tone_pinyin
    """    # 获取城市天气数据    url:请求的网址    class_name:获取数据的class名    assembly:回显的组件名    """    def get_weather(self, url, class_name, assembly):        try:            headers = {                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'}            req = Request(url, headers=headers)            # 获取的html内容是字节,将其转化为字符串            html = urlopen(req)            html_text = bytes.decode(html.read())            # 获取页面全部信息            obj = bf(html_text, 'html.parser')            # 获取天气部分的信息            elements = obj.find(class_=class_name).text.strip()            # 使用正则表达式替换多个连续空白行            single_elements = re.sub(r'\n\s*\n', '\n\n', elements)            # 天气信息回显到界面            assembly.setText(single_elements)        except Exception as e:            print(f'错误信息:{e}')            QMessageBox.information(self, '错误信息', '输入的城市名称有错误,请检查一下')

if __name__ == '__main__':    # 每一个PyQt5应用都必须创建一个应用对象    app = QApplication(sys.argv)    # 初始化页面    window = parentWindow()    # 显示首页    window.show()    sys.exit(app.exec_())

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/78980.html

(0)
guozi的头像guozi
上一篇 2024年5月30日
下一篇 2024年5月30日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注