树莓派练手小项目---基于树莓派构建天气查询系统,实现内容的网页自动化检索功能

目录

        • 一、写在前面
        • 二、基于树莓派构建天气查询系统
        • 三、基于树莓派实现网页内容的自动化检索
        • 四、有关于树莓派的其他小提醒,小技巧


Author:qyan.li

Date:2022.6.19

Topic:借助于两个简单的项目熟悉树莓派的基础使用,树莓派基础操作教程及避坑南

一、写在前面

         ~~~~~~~~         本篇博文其实应该写在基于树莓派构建手势控制的小车前面,作为练手的小项目,熟悉树莓派的基础操作。本篇博文主要涉及如何借助于树莓派实现天气的查询和网页内容的自动化检索。其中也会提及自己在项目过程中有关于树莓派蓝牙,自动化等等的避坑指南。顺便提一句,手势控制的智能小车已经更新:(7条消息) 玩转树莓派—详解树莓派的系统烧录,基础使用及基于树莓派制作手势控制的小车(附详细代码及演示效果)_隔壁李学长的博客-CSDN博客,有兴趣的同学可以自行参考。

二、基于树莓派构建天气查询系统

         ~~~~~~~~         基于树莓派构建天气查询系统,核心代码当然是天气系统的构建,基本思想是借助于爬虫获取天气是网站的天气信息,然后进行返回即可。具体的教程及代码可以参考我另外一篇博文:(7条消息) python构建智能机器人系列博文—借助于网络爬虫技术实现天气的自动查询系统_隔壁李学长的博客-CSDN博客_机器人查询天气,博主亲测,上述PC机上代码直接搬到树莓派上即可正确运行。

         ~~~~~~~~         本部分最核心的部分不在上面系统的构建,而是用户如何与树莓派进行交互,及如何将用户意愿传递给树莓派,以及如何将树莓派返回的结果反馈给用户。无非就两种方式:文字交互和语音交互

         ~~~~~~~~         文字交互的优点是方便,但是作为嵌入式系统或者树莓派而言,实际应用中是不会带有键盘和屏幕的,这显然不太符合实际应用的要求。那就是语音交互,但由于树莓派本身并不存在麦克风和音频输出设备,所以必须借助于其他的方式进行。


         ~~~~~~~~         OK,这里作为一条分界线,上面主要思考思路,下面来进行具体的实现。针对于树莓派的输入,项目中还是考虑键盘输入,主要对音频的输出做工作。

1. 中文的设置:

         ~~~~~~~~         由于树莓派默认语言,输入法等等均是英文,中文字库和中文的输入法需要额外手动进行安装(注意:中文字库和中文输入法不是用同一个东西)。

参考文献:(7条消息) 树莓派安装中文输入法_peace_dove的博客-CSDN博客_树莓派中文输入法

小Tips:

scim输入法安装不成功,无法使用,请转战fctix输入法(推荐):

参考文献:(13条消息) 树莓派中文输入法scim安装的血泪史_魏全对的博客-CSDN博客_树莓派中文输入法

提一个自己遇到的不算小的问题:

         ~~~~~~~~         中文输入法安装后,仅能在终端等其他部分输入,树莓派自带的python编辑器中无法使用

解决办法:

  • 终端输入,复制粘贴至编辑器中(虽然有点蠢,但是能用)

2. pyttsx3模块安装:

  • pyttsx3模块的安装与windows系统相同:pip install pyttsx3

  • 运行代码显示No such Files类的错误,缺少espeak模块

  • pip install espeak报错

  • 借助于sudo apt-get espeak成功安装espeak模块

3. pyttsx3字符串朗读:

         ~~~~~~~~         我们既然希望使用音频的方式实现交互,字符的朗读是必不可少,我们依旧采取winows系统中使用的pyttsx3模块,代码如下:

## 字符串朗读函数
def readContent(content = ''):
    '''
    :param content: 待朗读的文本
    :return: None
    '''
    engine = pyttsx3.init()
    ## 设置中文字库,pyttsx3可朗读中文
    engine.setProperty('voice','zh')
    engine.say(content)
    engine.runAndWait()

上述代码与windows下唯一的区别在于:

engine.setProperty(‘voice’,‘zh’)用于设置中文字库,使pyttsx3模块可以正常朗读中文,否则朗读中文时,出现乱码的音符

基础的准备工作完成,下面时音频的输出,这里提两种方式:

  • 3.8mm耳机孔(简单)

    树莓派自带有3.8mm耳机孔,插上有线耳机即可完成音频的输出

  • 蓝牙音响(推荐)

             ~~~~~~~~         上述使用有线耳机的方式较为简便,但如果需要进行演示,显然就没有办法使用。所以个人比较推荐蓝牙音响(当然前提是你必须要有蓝牙音响),蓝牙音响需要借助于树莓派的蓝牙功能进行连接,但自己的树莓派默认的蓝牙无法正常使用,需要进行组件的更新,参考连接:(7条消息) 【树莓派】解决树莓派连接蓝牙不能听见声音_Donric-Yee的博客-CSDN博客_树莓派连接蓝牙音箱没声音

    完成上述操作后,树莓派右上角出现较为圆润饱满的蓝牙图标时,蓝牙即可以进行正常的连接

    小Tips:
    使用蓝牙音响,播放音频时,可能会存在字符丢失的现象,目前尚未解决


         ~~~~~~~~         OK,上面已经将所有的准备工作全部完成,下面提供完整的代码,方便大家参考借鉴:

## Author:qyan.li
## Date:2022.5.27
## Topic:借助于python语言在树莓派上实现天气查询系统

import requests
import pyttsx3
import time
import urllib.request,urllib.error
from bs4 import BeautifulSoup
import re

class WeatherInfo():
    def __init__(self,cityName):
        self.city = cityName
        self.url = r'https://www.tianqi.com/' + str(cityName) + r'/'
        self.findTime = re.compile(r'
(.*?)
'
) self.html = None self.WeatherInformation = '' def askURL(self): # 模拟浏览器头部信息(浏览器伪装,不会被设别为爬虫程序) # 用户代理,可以接受什么类型的返回文件 head = {'User-Agent': # 中间不能存在任何空格,包括大小写的相关问题 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0' } request = urllib.request.Request(self.url, headers=head) # 携带头部信息访问url html = '' try: responseInfo = urllib.request.urlopen(request) # responseInfo包含网页的基本信息 html = responseInfo.read().decode('utf-8') # 防止格式错误 # print(html) except urllib.error.URLError as e: if hasattr(e, 'code'): print(e.code) if hasattr(e, 'reason'): print(e.reason) self.html = html def getData(self): soup = BeautifulSoup(self.html, 'lxml') item = soup.find('div', class_="left") # 分别获得'湿度','天气','空气'信息 ShiDuItem = item.find('dd', class_='shidu') WeatherItem = item.find('dd', class_='weather') AirItem = item.find('dd', class_='kongqi') item = str(item) # 获得时间信息 Time = str(re.findall(self.findTime, item)[0]).split('\u3000')[0] # print(Time) # 获得湿度信息 ShiduInfo = '' for item in ShiDuItem.find_all('b'): ShiduInfo = ShiduInfo + str(item.string) ShiduInfo = ShiduInfo + ' ' # 获得天气信息 temperature = WeatherItem.find('p', class_='now').find('b').string + '摄氏度' condition = WeatherItem.find('span').find('b').string TempCondition = temperature + condition # 获得空气信息 AirCondition = AirItem.find('h5').string PM = AirItem.find('h6').string AirPM = AirCondition + PM self.WeatherInformation = Time + ' ' + ShiduInfo + '温度' +TempCondition + AirPM def startWeather(self): self.askURL() self.getData() ## 字符串朗读函数 def readContent(content = ''): ''' :param content: 待朗读的文本 :return: None ''' engine = pyttsx3.init() ## 设置中文字库,pyttsx3可朗读中文 engine.setProperty('voice','zh') engine.say(content) engine.runAndWait() ## 机器人网络资源调用 def robot(text = " "): ''' :param text: 问询的文本 :return: 机器人返回的内容 ''' url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg='+str(text) response = requests.get(url) responseText = response.text.split('"')[-2] return responseText if __name__ == '__main__': ## 机器人网络资源调用 response = robot(text = '我今天心情不太好') print(response) readContent(response) time.sleep(5) ## 天气查询功能调用 WeatherItem = WeatherInfo('beijing') WeatherItem.startWeather() print(WeatherItem.WeatherInformation) readContent(WeatherItem.WeatherInformation)

三、基于树莓派实现网页内容的自动化检索

         ~~~~~~~~         这部分主要是仿照在windows系统上实现自动化检索的功能,就是Webdriver那一套的东西,只不过在代码迁移的过程中发现,windows系统上的代码直接迁移至树莓派(linux系统)上无法正常运行,所以查阅相关资料,费尽千辛万苦终于把代码跑通,故在此处记录一下。老样子,上代码,方便大家参考借鉴:

## Author:qyan.li
## Date:2022.5.27
## Topic:借助于python语言在树莓派上实现网页内容自动检索


## 相关模块引入
import time
from selenium import webdriver

## linux系统浏览器自动化设置
def getDriver():
    options = webdriver.ChromeOptions()
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-gpu")
    options.add_argument("--no-sandbox") # linux only
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option("useAutomationExtension", False)
    driver = webdriver.Chrome(options=options)
    driver.execute_cdp_cmd("Network.enable", {})
    driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": {"User-Agent": "browserClientA"}})
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
            })
        """
    })
    return driver

## 浏览器打开特定网址:https://www.baidu.com
driver = getDriver()
driver.get('https://www.baidu.com')
## 输入框定位和内容输入
shuru = driver.find_element_by_id('kw')
shuru.send_keys('uestc')
time.sleep(2)

## 搜索按键点击,内容检索
sousuo = driver.find_element_by_id('su')
sousuo.click()

关于此部分代码的小小说明:

  • 首先系统配置时,必须类似于windows系统,安装对应的webdriver驱动

    参考连接:树莓派安装chromium-chromedriver_风家一良的博客-CSDN博客_chromium driver

  • 后续代码参考于知乎大神,连接:(84 封私信 / 32 条消息) 请问Selenium webdriver无法打开子网页,怎么解决? - 知乎 (zhihu.com)

  • 代码中有关于find_element_by_id部分的说明请移步我的另外一篇博文:(6条消息) python构建智能机器人系列博文—借助于浏览器自动化技术实现网页内容的自动检索_隔壁李学长的博客-CSDN博客

四、有关于树莓派的其他小提醒,小技巧

         ~~~~~~~~         OK,上面借助于树莓派完成两个小项目,以帮助大家熟悉树莓派的基本操作,后续进行更高阶的开发,基于树莓派构建手势控制的智能小车,欢迎大家阅读,参考连接:(6条消息) 玩转树莓派—详解树莓派的系统烧录,基础使用及基于树莓派制作手势控制的小车(附详细代码及演示效果)_隔壁李学长的博客-CSDN博客

         ~~~~~~~~         下面放出一些自己树莓派使用过程中遇到的一些问题及参考的解决方案:

  1. 树莓派,PC机互传文件

    借助于VNC Viewer双向箭头实现电脑文件传给树莓派

    借助于VNC Viewer的File transfer实现树莓派文件传向电脑

  2. 树莓派开机无线重复登陆界面,无法进入

    重新烧录系统,重新烧录系统

    参考文献:(13条消息) 树莓派出现开机输入密码之后无限重复进不去的问题_destruggler的博客-CSDN博客_树莓派密码正确进不去

  3. 树莓派任务栏消失,恢复方法

    (88 封私信 / 29 条消息) 我一不小心把树莓派的任务栏删了,请问应如何恢复呢? - 知乎 (zhihu.com)

  4. 树莓派终端启用快捷键:

    ctrl+alt+t

你可能感兴趣的:(自动化,python,运维)