App下載

Python爬蟲入門案例----語音播報(bào)天氣預(yù)報(bào)

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

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

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

一、前期準(zhǔn)備

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

pip install requests

pip install lxml

pip install pyttsx3

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

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

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

import pyttsx3

test = pyttsx3.init()

test.say('hello w3cschool!')

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

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é)議這些知識(shí)最好要了解一下,懂得基本含義,這樣能夠讓你了解在網(wǎng)絡(luò)請(qǐng)求和網(wǎng)絡(luò)傳輸上的基本原理。

二、詳細(xì)步驟

1、get 請(qǐng)求目標(biāo)網(wǎng)址

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

import requests

# 向目標(biāo)url地址發(fā)送請(qǐng)求,返回一個(gè)response對(duì)象

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

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

print(resp.text)

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

微信圖片_20201228140751

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

這是因?yàn)槲覀儗懙呐老x如果不添加請(qǐng)求頭進(jìn)行訪問的話,腳本會(huì)自行發(fā)送一個(gè) Python 爬取的請(qǐng)求,而大部分的網(wǎng)站都會(huì)設(shè)施反爬蟲機(jī)制,不允許網(wǎng)站內(nèi)容被爬蟲爬取。

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

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

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ā)送請(qǐng)求,返回一個(gè)response對(duì)象

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

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

print(resp.text)     

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

微信圖片_20201228145712

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

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

微信圖片_20201228140738

那么我們?nèi)缛绾翁崛∧??這時(shí)候就要用到 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)頁中的空格及換行符也一并讓我們提取了出來,生成的對(duì)象也是列表類型。

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

txt = "歡迎使用天氣播報(bào)助手"

for data in html_data:

txt += data

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

微信圖片_20201228144504

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

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

三、pyttsx3 播報(bào)天氣信息

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

test = pyttsx3.init()

test.say(txt)

test.runAndWait()

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

一步步的摸索,到功能的實(shí)現(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ā)送請(qǐng)求,返回一個(gè)response對(duì)象

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

html = etree.HTML(html)

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

txt = "歡迎使用天氣播報(bào)助手"

for data in html_data:

    txt += data

print(txt)

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

txt += '\n播報(bào)完畢!謝謝!'

print(txt)

test = pyttsx3.init()

test.say(txt)

test.runAndWait()


0 人點(diǎn)贊