Hello,大家好呀,我是你們親愛的 w3cschool 小編,今天給大家分享一份 Python 爬蟲入門小案例----語音播報天氣預(yù)報。
此案例實現(xiàn)的功能為:利用爬蟲,爬取某一地區(qū)的天氣信息,并打印出進行語音播報。
一、前期準(zhǔn)備
此案例中要用到的庫有: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ò)傳輸上的基本原理。
二、詳細(xì)步驟
1、get 請求目標(biāo)網(wǎng)址
我們首先導(dǎo)入 requests 庫,然后就用它來獲取目標(biāo)的網(wǎng)頁,我們請求的是天氣網(wǎng)站中的廈門天氣。
import requests
# 向目標(biāo)url地址發(fā)送請求,返回一個response對象
resp = requests.get('https://www.tianqi.com/xaimen/')
# .text是response對象的網(wǎng)頁html
print(resp.text)
當(dāng)然僅憑這三行代碼,很大的可能是爬取不到網(wǎng)頁的,顯示 403,這是什么意思呢?
403 錯誤是一種常見的網(wǎng)絡(luò)錯誤類型,表示資源不可用,服務(wù)器知道客戶的請求,但拒絕處理它。
這是因為我們寫的爬蟲如果不添加請求頭進行訪問的話,腳本會自行發(fā)送一個 Python 爬取的請求,而大部分的網(wǎng)站都會設(shè)施反爬蟲機制,不允許網(wǎng)站內(nèi)容被爬蟲爬取。
那么,這就無解了嗎?那肯定是不可能的,俗話說得好,上有政策,下有對策,我們想讓目標(biāo)服務(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'}
# 向目標(biāo)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 或在空白處點擊鼠標(biāo)右鍵選擇“檢查”;然后刷新網(wǎng)頁,點擊“Network”再點擊“Doc”,點擊 Headers,在信息欄查看Request Headers 的 User-Agent 字段,直接復(fù)制,黏貼到編譯器就可以用啦,注意要以字典形式添加呀。
2、lxml.etree 解析網(wǎng)頁
我們從網(wǎng)頁爬取到得數(shù)據(jù)雜亂,其中也只有一部分是我們真正想要得到得數(shù)據(jù),例如在本案例中我們只需網(wǎng)頁中廈門市的天氣詳細(xì)信息,如圖所示:
那么我們?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()")
我們嘗試一下打印其中信息,得到信息如圖所示:
不難發(fā)現(xiàn),得到的信息和我們想要的信息不是很一致,網(wǎng)頁中的空格及換行符也一并讓我們提取了出來,生成的對象也是列表類型。
所以呢,我們接下來還需做如下處理:
txt = "歡迎使用天氣播報助手"
for data in html_data:
txt += data
再次打印不難發(fā)現(xiàn)我們所需要的信息都已經(jīng)有了,看上去也是很 nice,不過美中不足的是 [切換城市] 還在,我們呢也不想要它。
那么怎么辦呢,咱用字符串方法替換掉它即可。
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) # 向目標(biāo)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()