Raspberry Pi 小手の練習プロジェクト --- Raspberry Pi をベースに天気検索システムを構築し、Web ページの自動検索機能を実現する


著者:qyan.li

日付:2022.6.19

トピック: 2 つの簡単なプロジェクト (Raspberry Pi の基本操作チュートリアルとピット回避) の助けを借りて、Raspberry Pi の基本的な使用法に慣れてください。

1. 前に書く

         ~~~~~~~~        このブログ投稿は、実際にはRaspberry Pi に基づくジェスチャー制御の車の前で、手を練習するための小さなプロジェクトとして、Raspberry Pi の基本的な操作に精通している必要があります。このブログ投稿では主に、Raspberry Pi を使用して天気のクエリと Web コンテンツの自動取得を実現する方法について説明します。また、プロジェクト プロセス中に Raspberry Pi の Bluetooth や自動化などに関するピット回避ガイドがあることにも言及します。ちなみに、ジェスチャー制御のスマートカーは更新されています: (メッセージ数 7) Raspberry Pi で遊ぶ - Raspberry Pi のシステムプログラミングの詳細、基本的な使い方を説明し、Raspberry Pi に基づいてジェスチャー制御の自動車を作ります (詳細なコードとデモ Effect)_隣の Li Xuechang のブログ - CSDN ブログ、興味のある学生は自分で参照できます。

2. Raspberry Pi に基づく天気クエリ システムの構築

         ~~~~~~~~        Raspberry Pi をベースに天気クエリ システムを構築する場合、コア コードはもちろん天気システムの構築ですが、基本的な考え方は、クローラーを使用して天気 Web サイトの天気情報を取得し、それを返すことです。特定のチュートリアルとコードについては、私の他のブログ投稿を参照してください: (7 メッセージ) Python を使用したインテリジェント ロボットの構築に関する一連のブログ投稿 - ウェブ クローラー技術を利用した自動天気クエリ システムPC 上の上記のコードは、Raspberry Pi に直接移動して正しく実行できます。

         ~~~~~~~~        この部分の核心部分は、上記のシステムの構築ではなく、ユーザーが Raspberry Pi をどのように操作するか、ユーザーの希望をどのように Raspberry Pi に渡し、Raspberry Pi から返された結果をどのようにシステムにフィードバックするかです。ユーザー。テキスト インタラクションと音声インタラクションの 2 つ以上の方法はありません。

         ~~~~~~~~        テキスト対話の利点は利便性ですが、組み込みシステムまたは Raspberry Pi として、実際のアプリケーションにはキーボードと画面がなく、明らかに実際のアプリケーションの要件を満たしていません。それが音声インタラクションですが、Raspberry Pi 自体にはマイクと音声出力デバイスがないため、別の方法で行う必要があります。


         ~~~~~~~~        OK、ここに境界線があります。上記は主な考え方であり、以下は具体的な実装です。Raspberry Pi の入力については、プロジェクトでは引き続きキーボード入力が考慮されますが、主にオーディオ出力用です。

1. 中国語の設定:

         ~~~~~~~~        Raspberry Pi のデフォルトの言語、入力方法などはすべて英語であるため、中国語のフォント ライブラリと中国語の入力方法を手動でインストールする必要があります (注: 中国語のフォント ライブラリと中国語の入力方法は同じものを使用しません)。もの)。

参考文献: (メッセージ数 7) Raspberry Pi が中国語入力方式をインストール_peace_dove さんのブログ - CSDN ブログ_Raspberry Pi 中国語入力方式

小さなヒント:

scim 入力方式のインストールに失敗し、使用できません。fctix 入力方式に切り替えてください (推奨):

参考文献: (メッセージ数 13) Raspberry Pi の血と涙の歴史 中国語入力方式 scim インストール_Wei Quandui のブログ-CSDN ブログ_Raspberry Pi 中国語入力方式

私が遭遇したそれほど小さくない問題に言及するには:

         ~~~~~~~~        中国語の入力方法をインストールすると、ターミナルなどの他の部分でしか入力できなくなり、Raspberry Pi に付属の Python エディターでは使用できなくなります。

解決:

  • ターミナル入力、エディタへのコピー&ペースト(ちょっとバカバカしいですが、動作します)

2. pyttsx3 モジュールのインストール:

  • pyttsx3 モジュールのインストールは、Windows システムのインストールと同じです: pip install pyttsx3

  • コードを実行すると No such Files type のエラーが表示され、espeak モジュールがありません

  • pip install espeak エラー

  • espeak モジュールは sudo apt-get 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()

上記のコードとウィンドウの唯一の違いは次のとおりです。

engine.setProperty('voice','zh') を使用して中国語のフォント ライブラリを設定し、pyttsx3 モジュールが中国語を正常に読み取れるようにします。そうしないと、中国語を読み取るときに文字化けが発生します。

基本的な準備は完了です. 以下はオーディオ出力です. ここでは2つの方法があります.

  • 3.8mmヘッドホンジャック(シンプル)

    Raspberry Pi には 3.8 mm ヘッドフォン ジャックが付属しており、有線ヘッドフォンを接続することでオーディオ出力を完了できます。

  • Bluetooth オーディオ (推奨)

             ~~~~~~~~        上記の有線ヘッドセットを使用する方法は比較的便利ですが、プレゼンテーションを行う必要がある場合は、明らかに使用できません。そのため、個人的にはBluetoothスピーカーをおすすめします(もちろんBluetoothスピーカーは必須です)BluetoothスピーカーはRaspberry PiのBluetooth機能と接続する必要がありますが、Raspberry PiのデフォルトのBluetoothは使えません(7 メッセージ) [Raspberry Pi] Bluetooth 接続時に Raspberry Pi の音が聞こえない問題を解決_Donric-Yee's Blog-CSDN Blog_Raspberry Pi に接続Bluetooth スピーカーで音が出ない

    上記の操作が完了した後、Raspberry Pi の右上隅に比較的丸くて完全な bluetooth アイコンが表示されたら、bluetooth は正常に接続できます。

    小さなヒント:
    Bluetooth スピーカーを使用している場合、オーディオの再生時に文字が失われることがありますが、これはまだ解決されていません。


         ~~~~~~~~        以上ですべての準備作業が完了しました。参照用に完全なコードを以下に示します。

## 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'<dd class="week">(.*?)</dd>')
        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)

3. Raspberry Pi に基づく Web コンテンツの自動取得

         ~~~~~~~~        この部分は、主に Webdriver のセットである Windows システム上の自動取得機能に基づいていますが、コード移行の過程で、Windows システム上のコードを直接 Raspberry Pi に移行できないことがわかりました。 (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()

コードのこの部分に関する小さなメモ:

4. Raspberry Pi に関するその他の注意事項とヒント

         ~~~~~~~~        上記の 2 つの小さなプロジェクトは、Raspberry Pi の基本的な操作に精通しているすべての人を支援するために、Raspberry Pi の助けを借りて完了しました。その後、Raspberry Pi に基づいて、ジェスチャー制御のスマートカーを構築するためのより高度な開発が行われます。ようこそ、リンクを参照してください : (6 メッセージ) Raspberry Pi で遊ぶ — Raspberry Pi のシステム プログラミングの詳細な説明、基本的な使用方法、および Raspberry Pi に基づくジェスチャー制御の自動車の作成 (詳細なコードとデモ効果付き)_隣人の Li Xuechang のブログ - CSDN ブログ

         ~~~~~~~~        Raspberry Pi の使用中に発生した問題と、参照用の解決策を次に示します。

  1. Raspberry Pi と PC の間でファイルを転送する

    VNC ビューアーの双方向矢印を使用してコンピューター ファイルを Raspberry Pi に転送する

    VNC ビューアーのファイル転送を利用して、Raspberry Pi ファイルをコンピューターに転送します。

  2. Raspberry Pi がワイヤレスで起動し、インターフェイスに繰り返しログインしますが、入ることができません

    システムを再プログラムする、システムを再プログラムする

    参考文献: (メッセージ数 13) Raspberry Pi で booting 後に無限にパスワードを入力したら入れない問題がある_destruggler さんのブログ - CSDN ブログ_Raspberry Pi のパスワードが正しくて入れない

  3. ラズベリーパイのタスクバーが消える、復旧方法

    (プライベートメッセージ 88 件 / メッセージ 29 件) Raspberry Pi のタスクバーを誤って削除してしまいました。どうすれば復元できますか? - Zhihu (zhihu.com)

  4. Raspberry Pi ターミナルでショートカット キーを有効にします。

    ctrl+alt+t

おすすめ

転載: blog.csdn.net/DALEONE/article/details/125356612