App下載

Python爬蟲入門案例----語音播報天氣預報

猿友 2020-12-28 15:14:06 瀏覽數(shù) (4285)
反饋

Hello,大家好呀,我是你們親愛的 w3cschool 小編,今天給大家分享一份 Python 爬蟲入門小案例----語音播報天氣預報。

此案例實現(xiàn)的功能為:利用爬蟲,爬取某一地區(qū)的天氣信息,并打印出進行語音播報。

一、前期準備

此案例中要用到的庫有:requests、lxml、pyttsx3,可通過 cmd 命令進去命令提示符界面,通過如下命令安裝:

pip install requests

pip install lxml

pip install pyttsx3

requests 比 urllib 更加方便,可以節(jié)約我們大量的工作。(用了 requests 之后,你基本都不愿意用 urllib 了)一句話,requests 是 Python 實現(xiàn)的最簡單易用的 HTTP 庫,建議爬蟲使用 requests 庫。

lxml 是 Python 的一個解析庫,支持 HTML 和 XML 的解析,支持 XPath 解析方式,而且解析效率非常高。

pyttsx3 是一個款將文本轉(zhuǎn)為語音的 Python 包,不同于其他 Python 包,pyttsx3 真的可以文本轉(zhuǎn)語音?;居梅ㄈ缦拢?/p>

import pyttsx3

test = pyttsx3.init()

test.say('hello w3cschool!')

# 關(guān)鍵一句,若無,語音不會播放

test.runAndWait()

如果你是 linux 系統(tǒng),pyttsx3 文本轉(zhuǎn)語音不奏效。那么你可能還需要安裝 espeak、ffmpeg 和 libespeak1。安裝命令如下:

sudo apt update && sudo apt install espeak ffmpeg libespeak1

爬蟲是爬取網(wǎng)頁的相關(guān)內(nèi)容,了解 HTML 能夠幫助你更好的理解網(wǎng)頁的結(jié)構(gòu)、內(nèi)容等。

TCP / IP 協(xié)議,HTTP 協(xié)議這些知識最好要了解一下,懂得基本含義,這樣能夠讓你了解在網(wǎng)絡(luò)請求和網(wǎng)絡(luò)傳輸上的基本原理。

二、詳細步驟

1、get 請求目標網(wǎng)址

我們首先導入 requests 庫,然后就用它來獲取目標的網(wǎng)頁,我們請求的是天氣網(wǎng)站中的廈門天氣。

import requests

# 向目標url地址發(fā)送請求,返回一個response對象

resp = requests.get('https://www.tianqi.com/xaimen/')

# .text是response對象的網(wǎng)頁html

print(resp.text)

當然僅憑這三行代碼,很大的可能是爬取不到網(wǎng)頁的,顯示 403,這是什么意思呢?

微信圖片_20201228140751

403 錯誤是一種常見的網(wǎng)絡(luò)錯誤類型,表示資源不可用,服務(wù)器知道客戶的請求,但拒絕處理它。

這是因為我們寫的爬蟲如果不添加請求頭進行訪問的話,腳本會自行發(fā)送一個 Python 爬取的請求,而大部分的網(wǎng)站都會設(shè)施反爬蟲機制,不允許網(wǎng)站內(nèi)容被爬蟲爬取。

那么,這就無解了嗎?那肯定是不可能的,俗話說得好,上有政策,下有對策,我們想讓目標服務(wù)器相應(yīng),那么我們就對我們得爬蟲進行一下偽裝即可。在我們這次的小案例中我們添加常用的 User-Agent 字段進行偽裝即可。 

所以,改一下我們之前得代碼,將爬蟲偽裝成瀏覽器請求,如下:

import requests

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}

# 向目標url地址發(fā)送請求,返回一個response對象

resp = requests.get('https://www.tianqi.com/xaimen/',headers=headers)

# .text是response對象的網(wǎng)頁html

print(resp.text)     

有小伙伴就要問了:User-Agent 字段怎么來的呢?在這里我們以 Chrome 瀏覽器為例子,先隨便打開一個網(wǎng)頁,按鍵盤的 F12 或在空白處點擊鼠標右鍵選擇“檢查”;然后刷新網(wǎng)頁,點擊“Network”再點擊“Doc”,點擊 Headers,在信息欄查看Request Headers 的 User-Agent 字段,直接復制,黏貼到編譯器就可以用啦,注意要以字典形式添加呀。   

微信圖片_20201228145712

2、lxml.etree 解析網(wǎng)頁  

我們從網(wǎng)頁爬取到得數(shù)據(jù)雜亂,其中也只有一部分是我們真正想要得到得數(shù)據(jù),例如在本案例中我們只需網(wǎng)頁中廈門市的天氣詳細信息,如圖所示:

微信圖片_20201228140738

那么我們?nèi)缛绾翁崛∧??這時候就要用到 lxml.etree 啦。  

觀察網(wǎng)頁結(jié)構(gòu)可以發(fā)現(xiàn)我們所需要的天氣信息都在“dl class='weather_info'”這一自定義列表下,于是乎我們只需在之前的代碼后添加如下代碼便能解析出該信息了:

html = etree.HTML(html)

html_data = html.xpath("http://d1[@class='weather_info']//text()")  

我們嘗試一下打印其中信息,得到信息如圖所示:

微信圖片_20201228141428

不難發(fā)現(xiàn),得到的信息和我們想要的信息不是很一致,網(wǎng)頁中的空格及換行符也一并讓我們提取了出來,生成的對象也是列表類型。

所以呢,我們接下來還需做如下處理:

txt = "歡迎使用天氣播報助手"

for data in html_data:

txt += data

再次打印不難發(fā)現(xiàn)我們所需要的信息都已經(jīng)有了,看上去也是很 nice,不過美中不足的是 [切換城市] 還在,我們呢也不想要它。

微信圖片_20201228144504

那么怎么辦呢,咱用字符串方法替換掉它即可。

txt = txt.replace('[切換城市]','')

三、pyttsx3 播報天氣信息

到這一步,我們想要的數(shù)據(jù)都已被我們爬取下來并處理好保存在 txt 變量里啦,現(xiàn)在就讓他讀出來,到了 pyttsx3 這個庫上場的時候了,代碼如下:

test = pyttsx3.init()

test.say(txt)

test.runAndWait()

至此,我們的小案例就做完啦,推薦好課:Python 靜態(tài)爬蟲、Python Scrapy網(wǎng)絡(luò)爬蟲

一步步的摸索,到功能的實現(xiàn),在其中得到的樂趣及成就感,相信小伙伴們是很開心的。

最后:完整源碼奉上:

import requests

import pyttsx3

from lxml import etree

url = 'https://www.tianqi.com/xiamen/'

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}

resp = requests.get(url=url, headers=headers)  # 向目標url地址發(fā)送請求,返回一個response對象

html = resp.text  # .text是response對象的網(wǎng)頁html

html = etree.HTML(html)

html_data = html.xpath("http://dl[@class='weather_info']//text()")

txt = "歡迎使用天氣播報助手"

for data in html_data:

    txt += data

print(txt)

txt = txt.replace('[切換城市]','')

txt += '\n播報完畢!謝謝!'

print(txt)

test = pyttsx3.init()

test.say(txt)

test.runAndWait()


0 人點贊