Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
紹
網頁抓取是一種重要的技術,經常在許多不同的環境中使用,尤其是數據科學和數據挖掘。 Python在很大程度上被認為是網絡抓取的首選語言,其原因在于Python的內嵌電池特性。 使用Python,您可以在大約15分鐘內使用不到100行代碼創建一個簡單的抓取腳本。 因此,無論何種用途,網頁抓取都是每個Python程序員必須具備的技能。
在我們開始動手之前,我們需要退后一步,考慮什么是網頁抓取,什么時候應該使用它,何時避免使用它。
如您所知,網頁抓取是一種用于從網站自動提取數據的技術。 重要的是要理解,網頁抓取是一種從各種來源(通常是網頁)中提取數據的粗略技術。 如果網站的開發人員足夠慷慨地提供API來提取數據,那么訪問數據將是一種更加穩定和健壯的方式。 因此,根據經驗,如果網站提供API以編程方式檢索其數據,請使用它。 如果API不可用,則只能使用網絡抓取。
請務必遵守有關您使用的每個網站的網頁抓取的任何規則或限制,因為有些網站不允許這樣做。 有了這個清楚的認識,讓我們直接進入教程。
在本教程中,我們將抓取http://quotes.toscrape.com/,這是一個列出著名作家名言的網站。
網頁抓取管道
我們可以將web-scraping理解為包含3個組件的管道:
下載:下載HTML網頁
解析:解析HTML并檢索我們感興趣的數據
存儲:以特定格式將檢索到的數據存儲在本地計算機中
下載HTML
從網頁中提取任何數據,從邏輯上講,我們首先要下載它。 我們有兩種方法可以做到這一點:
1.使用瀏覽器自動化庫
您可以使用Selenium等瀏覽器自動化庫從網頁下載HTML。 Selenium允許您打開瀏覽器,比方說Chrome,并根據需要控制它。 您可以在瀏覽器中打開網頁,然后使用Selenium自動獲取該頁面的HTML代碼。
但是,這種方法有一個很大的缺點 - 它明顯變慢。 原因是運行瀏覽器并在瀏覽器中呈現HTML的開銷。 此方法僅應用于特殊情況 - 我們要抓取的內容在瀏覽器中使用JavaScript代碼,或者要求我們單擊按鈕/鏈接以獲取數據,Selenium可以為我們執行此操作。
2.使用HTTP庫
與第一種方法不同,HTTP庫(例如Requests模塊或Urllib)允許您發送HTTP請求,完全不需要打開任何瀏覽器。 這種方法應該始終是首選,因為它比Selenium快得多。
現在讓我告訴您如何使用Selenium和Requests庫實現管道這個組件:
使用Requests
使用以下命令安裝Requests模塊:
現在您可以在代碼中使用它,如下所示:
這里,對URL進行HTTP GET請求,這幾乎與下載網頁同義。 然后,我們可以通過訪問requests.get方法返回的結果對象來獲取頁面的HTML源代碼。
使用Selenium
您可以通過pip安裝selenium模塊:
在這里,我們首先創建一個表示瀏覽器的webdriver對象。 這樣做會在運行代碼的計算機上打開Chrome瀏覽器。 然后,通過調用webdriver對象的get方法,我們可以打開URL。 最后,我們通過訪問webdriver對象的page_source屬性來獲取源代碼。
在這兩種情況下,URL的HTML源都作為字符串存儲在page變量中。
解析HTML和提取數據
不必深入計算機科學理論,我們可以將解析定義為分析字符串的過程,以便我們可以理解其內容,從而輕松訪問其中的數據。
在Python中,有兩個庫可以幫助我們解析HTML:BeautifulSoup和Lxml。 Lxml是一個比BeautifulSoup更低級的框架,我們可以在BeautifulSoup中使用Lxml作為后端,因此對于簡單的HTML解析,BeautifulSoup將是首選的庫。
但在我們深入分析之前,我們必須分析網頁的HTML,看看我們想要抓取的數據是如何構建和定位的。只有當我們掌握了這些信息時,我們才能從解析的HTML中獲取我們想要的信息。但幸運的是,我們不必在編輯器中打開源代碼,并手動理解每個HTML元素并將其與渲染頁面中的相應數據相關聯。大多數瀏覽器都提供了一個檢查器,比如Chrome的開發人員工具,它使我們只需單擊它們即可快速查看任何元素的HTML代碼。
要在Chrome中執行此操作,請在Chrome中打開網頁,然后右鍵單擊要抓取的數據,然后選擇“檢查”。在Firefox中,此選項稱為Inspect Element - 這是在做相同的事情,但只是名稱不同。
您會注意到Chrome窗口底部打開了一個窗格,其中包含您單擊的元素的源代碼。 瀏覽一下源代碼,了解我們想要抓取的數據是如何在HTML代碼中構建的。
經過一些檢查后你可以理解,http://quotes.toscrape.com/上的每個引用都包含在一個帶有class =“quote”屬性的div中。 在該div中,引用的文本在class =“text”的范圍內,作者的名稱在class =“author”的小標簽中。 當我們實際解析HTML并提取數據時,將需要此信息。
現在,讓我們開始使用BeautifulSoup解析HTML頁面。 但首先,我們必須安裝它:
安裝好之后,可以像下面這樣在代碼中調用:
首先,我們通過將頁面傳遞給BeautifulSoup類構造函數來創建頁面的解析版本。 如您所見,我們還將第二個參數html.parser傳遞給構造函數。 這是Beautiful Soup將用于解析傳遞給它的字符串的解析器的名稱。 你可以使用我們之前談到過的解析器lxml,因為你已經安裝了Lxml庫。
然后,我們提取包含class =“quote”的頁面中的所有div標簽,因為我們知道這些是包含引用的div。 為此,Beautiful Soup 4提供了find_all功能。 我們將標記名稱和類名稱傳遞給find_all函數,并返回滿足條件的所有標記,即包含引用的標記。
這里需要注意的一件重要事情是,我們在這里使用樹結構。 變量soup以及引用的每個元素都是樹。 在某種程度上,引用的元素是較大的soup樹的一部分。 無論如何,為避免進入不同的討論,讓我們繼續。
我們知道引用的文本是帶有class =“text”的span標記,而作者是帶有class =“author”的小標記。 要從quote元素中提取它們,我們再次使用類似的函數find。 find函數使用與find_all函數相同的參數。 唯一的區別是它返回滿足條件的第一個標記,而find_all返回標記列表。 此外,我們希望訪問返回對象的text屬性,該對象包含該標記中包含的文本。
因此,正如您在代碼中看到的那樣,我們遍歷列表引用的所有元素,并提取引用文本和作者名稱,將它們存儲在名稱為scraped的列表。 在控制臺上打印時,已抓取的列表如下所示:
存儲檢索的數據
一旦我們獲得了數據,我們就可以以任何我們想要的格式存儲它,例如CSV文件,SQL數據庫或NoSQL數據庫。 嚴格來說,這一步不應算作抓取過程的一部分,但為了完整起見,我將簡要介紹它。
我想說最流行的存儲抓取數據的方法是將它們存儲為CSV電子表格,所以我將簡要介紹如何做到這一點。 我不會詳細介紹,因為您應該參考官方的Python文檔。 所以,不用多說,讓我們看看代碼。
我們可以看到,代碼非常明顯。 我們從打開的quotes.csv文件創建一個CSV編寫器對象,然后使用writerow函數逐個寫入引用。 很明顯,writerow函數接受一個列表作為輸入,然后將其作為一行寫入CSV。
結論和后續步驟
本教程應該幫助您了解在學習自己實現簡單的scraper時基本上是什么。 這種抓取應該足以實現簡單的自動化或小規模數據檢索。 但是如果你想有效地提取大量數據,你應該研究一下抓取框架,特別是Scrapy。 它可以幫助您使用幾行代碼編寫非??焖?,高效的scraper。 無論你使用什么樣的框架,在那個閃亮的表面下面,框架也使用這些非?;镜淖ト≡瓌t,所以理解本教程應該可以幫助你為開始抓取的探險建立基礎知識。
英文原文:https://stackabuse.com/introduction-to-web-scraping-with-python/
譯者:javylee
者:Kerry Parker
翻譯:田曉寧
校對:丁楠雅
本文約2900字,建議閱讀10分鐘。
本教程以在Fast Track上收集百強公司的數據為例,教你抓取網頁信息。
作為一名數據科學家,我在工作中所做的第一件事就是網絡數據采集。使用代碼從網站收集數據,當時對我來說是一個完全陌生的概念,但它是最合理、最容易獲取的數據來源之一。經過幾次嘗試,網絡抓取已經成為我的第二天性,也是我幾乎每天使用的技能之一。
在本教程中,我將介紹一個簡單的例子,說明如何抓取一個網站,我將從Fast Track上收集2018年百強公司的數據:
Fast Track:http://www.fasttrack.co.uk/
使用網絡爬蟲將此過程自動化,避免了手工收集數據,節省了時間,還可以讓所有數據都放在一個結構化文件中。
用Python實現一個簡單的網絡爬蟲的快速示例,您可以在GitHub上找到本教程中所介紹的完整代碼。
GitHub鏈接:https://github.com/kaparker/tutorials/blob/master/pythonscraper/websitescrapefasttrack.py
以下是本文使用Python進行網頁抓取的簡短教程概述:
準備開始
在開始使用任何Python應用程序之前,要問的第一個問題是:我需要哪些庫?
對于web抓取,有一些不同的庫需要考慮,包括:
在本例中我們使用Beautiful Soup。你可以使用Python包管理器 pip 安裝Beautiful Soup:
pip install BeautifulSoup4
安裝好這些庫之后,讓我們開始吧!
檢查網頁
要知道在Python代碼中需要定位哪些元素,首先需要檢查網頁。
要從Tech Track Top 100 companies收集數據,可以通過右鍵單擊感興趣的元素來檢查頁面,然后選擇檢查。這將打開HTML代碼,我們可以在其中看到每個字段包含在其中的元素。
Tech Track Top 100 companies鏈接:http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/
右鍵單擊感興趣的元素并選擇“Inspect”,顯示html元素。
由于數據存儲在一個表中,因此只需幾行代碼就可以直接獲取數據。如果您想練習抓取網站,這是一個很好的例子,也是一個好的開始,但請記住,它并不總是那么簡單!
所有100個結果都包含在<tr> 元素的行中,并且這些在一頁上都可見。情況并非總是如此,當結果跨越多個頁面時,您可能需要更改網頁上顯示的結果數量,或者遍歷所有頁面以收集所有信息。
League Table網頁上顯示了包含100個結果的表。檢查頁面時,很容易在html中看到一個模式。結果包含在表格中的行中:
<table class="tableSorter">
重復的行<tr> 將通過在Python中使用循環來查找數據并寫入文件來保持我們的代碼最小化!
附注:可以做的另一項檢查是網站上是否發出了HTTP GET請求,該請求可能已經將結果作為結構化響應(如JSON或XML格式)返回。您可以在檢查工具的網絡選項卡中進行檢查,通常在XHR選項卡中進行檢查。刷新頁面后,它將在加載時顯示請求,如果響應包含格式化結構,則使用REST客戶端(如Insomnia)返回輸出通常更容易。
刷新網頁后,頁面檢查工具的網絡選項卡
使用Beautiful Soup解析網頁html
現在您已經查看了html的結構并熟悉了將要抓取的內容,是時候開始使用Python了!
第一步是導入將用于網絡爬蟲的庫。我們已經討論過上面的BeautifulSoup,它有助于我們處理html。我們導入的下一個庫是urllib,它連接到網頁。最后,我們將輸出寫入csv,因此我們還需要導入csv 庫。作為替代方案,可以在此處使用json庫。
# import librariesfrom bs4 import BeautifulSoupimport urllib.requestimport csv
下一步是定義您正在抓取的網址。如上一節所述,此網頁在一個頁面上顯示所有結果,因此此處給出了地址欄中的完整url:
# specify the urlurlpage = 'http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/'
然后我們建立與網頁的連接,我們可以使用BeautifulSoup解析html,將對象存儲在變量'soup'中:
# query the website and return the html to the variable 'page'page = urllib.request.urlopen(urlpage)# parse the html using beautiful soup and store in variable 'soup'soup = BeautifulSoup(page, 'html.parser')
我們可以在這個階段打印soup變量,它應該返回我們請求網頁的完整解析的html。
print(soup)
如果存在錯誤或變量為空,則請求可能不成功。可以使用urllib.error模塊在此時實現錯誤處理。
搜索html元素
由于所有結果都包含在表中,我們可以使用find 方法搜索表的soup對象。然后我們可以使用find_all 方法查找表中的每一行。
如果我們打印行數,我們應該得到101的結果,100行加上標題。
# find results within tabletable = soup.find('table', attrs={'class': 'tableSorter'})results = table.find_all('tr')print('Number of results', len(results))
因此,我們可以對結果進行循環以收集數據。
打印soup對象的前兩行,我們可以看到每行的結構是:
<tr><th>Rank</th><th>Company</th><th class="">Location</th><th>Year end</th><th class="" style="text-align:right;">Annual sales rise over 3 years</th><th class="" style="text-align:right;">Latest sales £000s</th><th class="" style="text-align:right;">Staff</th><th class="">Comment</th><!-- <th>FYE</th>--></tr><tr><td>1</td><td><a ><span>Wonderbly</span></a>Personalised children's books</td><td>East London</td><td>Apr-17</td><td style="text-align:right;">294.27%</td><td style="text-align:right;">*25,860</td><td style="text-align:right;">80</td><td>Has sold nearly 3m customisable children’s books in 200 countries</td><!-- <td>Apr-17</td>--></tr>
表格中有8欄:Rank,Company,Location,Year End,Annual Sales Rise,Latest Sales, Staff and Comments,所有這些都是我們可以保存的感興趣的數據。
網頁的所有行的結構都是一致的(對于所有網站來說可能并非總是如此?。?。因此,我們可以再次使用find_all 方法將每一列分配給一個變量,那么我們可以通過搜索<td> 元素來寫入csv或JSON。
循環遍歷元素并保存變量
在Python中,將結果附加到一個列表中是很有用的,然后將數據寫到一個文件中。我們應該在循環之前聲明列表并設置csv的頭文件,如下所示:
# create and write headers to a list rows = []rows.append(['Rank', 'Company Name', 'Webpage', 'Description', 'Location', 'Year end', 'Annual sales rise over 3 years', 'Sales £000s', 'Staff', 'Comments'])print(rows)
這將打印出我們添加到包含標題的列表的第一行。
你可能會注意到表格中有一些額外的字段Webpage和Description不是列名,但是如果你仔細看看我們打印上面的soup變量時的html,那么第二行不僅僅包含公司名稱。我們可以使用一些進一步的提取來獲取這些額外信息。
下一步是循環結果,處理數據并附加到可以寫入csv的rows。
在循環中查找結果:
# loop over resultsfor result in results: # find all columns per result data = result.find_all('td') # check that columns have data if len(data) == 0: continue
由于表中的第一行僅包含標題,因此我們可以跳過此結果,如上所示。它也不包含任何<td>元素,因此在搜索元素時,不會返回任何內容。然后,我們可以通過要求數據的長度為非零來檢查是否只處理包含數據的結果。
然后我們可以開始處理數據并保存到變量中。
# write columns to variables rank = data[0].getText() company = data[1].getText() location = data[2].getText() yearend = data[3].getText() salesrise = data[4].getText() sales = data[5].getText() staff = data[6].getText() comments = data[7].getText()
以上只是從每個列獲取文本并保存到變量。但是,其中一些數據需要進一步清理以刪除不需要的字符或提取更多信息。
數據清理
如果我們打印出變量company,該文本不僅包含公司名稱,還包含描述。我們然后打印sales,它包含不需要的字符,如腳注符號,最好刪除。
print('Company is', company) # Company is WonderblyPersonalised children's books print('Sales', sales) # Sales *25,860
我們希望將company 分為公司名稱和描述,我們可以用幾行代碼實現。再看一下html,對于這個列,有一個 <span> 元素只包含公司名稱。此列中還有一個鏈接指向網站上的另一個頁面,其中包含有關該公司的更多詳細信息。我們將在稍后使用它!
<td><a ><span>Wonderbly</span></a>Personalised children's books</td>
要將company 分成兩個字段,我們可以使用find方法保存<span>元素,然后使用strip 或replace 從company 變量中刪除公司名稱,這樣它只留下描述。
要從sales中刪除不需要的字符,我們可以再次使用strip和replace 方法!
# extract description from the name companyname = data[1].find('span', attrs={'class':'company-name'}).getText() description = company.replace(companyname, '') # remove unwanted characters sales = sales.strip('*').strip('?').replace(',','')
我們要保存的最后一個變量是公司網站。如上所述,第二列包含指向另一個頁面的鏈接,該頁面具有每個公司的概述。 每個公司頁面都有自己的表格,大部分時間都包含公司網站。
檢查公司頁面上的url元素
要從每個表中抓取url并將其保存為變量,我們需要使用與上面相同的步驟:
查看一些公司頁面,如上面的屏幕截圖所示,網址位于表格的最后一行,因此我們可以在最后一行內搜索<a>元素。
# go to link and extract company website url = data[1].find('a').get('href') page = urllib.request.urlopen(url) # parse the html soup = BeautifulSoup(page, 'html.parser') # find the last result in the table and get the link try: tableRow = soup.find('table').find_all('tr')[-1] webpage = tableRow.find('a').get('href') except: webpage = None
也有可能出現公司網站未顯示的情況,因此我們可以使用try except條件,以防萬一找不到網址。
一旦我們將所有數據保存到變量中,我們可以在循環中將每個結果添加到列表rows。
# write each result to rows rows.append([rank, company, webpage, description, location, yearend, salesrise, sales, staff, comments])print(rows)
然后可以試著在循環外打印變量,在將其寫入文件之前檢查它是否符合您的預期!
寫入輸出文件
如果想保存此數據以進行分析,可以用Python從我們列表中非常簡單地實現。
# Create csv and write rows to output filewith open('techtrack100.csv','w', newline='') as f_output: csv_output = csv.writer(f_output) csv_output.writerows(rows)
運行Python腳本時,將生成包含100行結果的輸出文件,您可以更詳細地查看這些結果!
尾語
這是我的第一個教程,如果您有任何問題或意見或者不清楚的地方,請告訴我!
原文標題:
Data Science Skills: Web scraping using python
原文鏈接:
https://towardsdatascience.com/data-science-skills-web-scraping-using-python-d1a85ef607ed
譯者簡介
田曉寧,質量管理專家,國際認證精益六西格瑪黑帶,19年從業經驗;軟件工程專家,擁有CMMI ATM證書,曾主導公司通過CMMI 5級評估;精通ISO9000和ISO27000體系,長期擔任公司質量和信息安全主任審核員,每年審核超過50個項目或部門;擁有PMP證書,擔任公司項目管理內訓師,具有項目管理和系統開發實戰經驗。
— 完 —
關注清華-青島數據科學研究院官方微信公眾平臺“THU數據派”及姊妹號“數據派THU”獲取更多講座福利及優質內容。
者 | hoxis
責編 | 郭芮
是不是有的時候懶得自己看新聞?那么不妨試試用 Python 來朗讀給你聽吧。
網頁轉換成語音,步驟無外乎:
網頁正文識別
之所以用 Python,就是因為 Python 有著豐富的庫,網頁正文識別也不在話下。這里我嘗試了 readability、goose3。
1.1 readability
readability 支持 Python3,使用 pip install readability-lxml 安裝即可。
readability 使用起來也很方便:
import requests from readability import Document response = requests.get('http://news.china.com/socialgd/10000169/20180616/32537640_all.html') doc = Document(response.text) print(doc.title())
但是 readability 提取到的正文內容不是文本,里面仍包含 HTML 標簽。
當然也可以結合其他組件再對 HTML 進行處理,如 html2text,我們這里就不再延伸,有興趣的可以自行嘗試。
1.2 goose3
Goose 本來是一個用 Java 編寫的文章提取器,后來就有了 Python 實現版: goose3 。
使用起來也很方便,同時對中文支持也不錯。使用 pip install goose3 即可安裝。
>>> from goose3 import Goose >>> from goose3.text import StopWordsChinese >>> url = 'http://news.china.com/socialgd/10000169/20180616/32537640_all.html' >>> g = Goose({'stopwords_class': StopWordsChinese}) >>> article = g.extract(url=url) >>> print(article.cleaned_text[:150]) 北京時間6月15日23:00(圣彼得堡當地時間18:00),2018年世界杯B組一場比賽在圣彼得堡球場展開角逐,伊朗1比0險勝摩洛哥,伊朗前鋒阿茲蒙半場結束前錯過單刀機會,鮑哈杜茲第95分鐘自擺烏 龍。這是伊朗20年來首度在世界杯決賽圈取勝。 本屆世界杯,既相繼出現替補便進球,貼補梅開二度以及東道主
可以看出網頁正文提取效果還不錯,基本滿足我們的要求,可以使用!
注意:goose 還有另外一個 Python2 的版本:Python-Goose,使用方法和 goose3 基本一樣。
文本轉語音
文本轉語音,百度、阿里、騰訊、訊飛等都有提供 REST API 接口,阿里和騰訊的申請相對時間較長,阿里的貌似還要收費,百度和訊飛的在線申請后即可使用。
沒辦法,好的東西得來總是要曲折一些。其中百度的沒有調用量的限制(其實默認是 200000 次/天),訊飛有每天 500 次的限制。
這里我們使用百度的 REST API 接口中的語言合成接口,一方面原因是百度的調用次數沒有限制,另一方面,我看了下訊飛的接口文檔,接口限制還是比較多的。還有就是百度提供了 REST API 的 Python 封裝,使用也更方便。
2.1 baidu-aip 的使用
百度提供了 Python SDK,使用 pip install baidu-aip 可以直接安裝。接口的使用可以參考接口文檔:http://ai.baidu.com/docs#/TTS-Online-Python-SDK/top。
使用示例如下:
from aip import AipSpeech """ 你的 APPID AK SK 均可在服務控制臺中的應用列表中查看。 """ APP_ID = '你的 App ID' API_KEY = '你的 Api Key' SECRET_KEY = '你的 Secret Key' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) result = client.synthesis('你好,你在做什么', 'zh', 3, { 'vol': 5, }) # 識別正確返回語音二進制 錯誤則返回dict 參照下面錯誤碼 if not isinstance(result, dict): with open('auido.mp3', 'wb') as f: f.write(result)
接口參數:
參數類型描述必傳texString合成的文本,使用UTF-8編碼,請注意文本長度必須小于1024字節是langString語言選擇,填寫zh是ctpString客戶端類型選擇,web端填寫1是cuidString用戶唯一標識,用來區分用戶,填寫機器 MAC 地址或 IMEI 碼,長度為60以內否spdString語速,取值0-9,默認為5中語速否pitString音調,取值0-9,默認為5中語調否volString音量,取值0-15,默認為5中音量否perString發音人選擇,0為女聲,1為男聲,3為情感合成-度逍遙,4為情感合成-度丫丫,默認為普通女否
接口對單次傳入的文本進行了限制,合成文本長度必須小于 1024 字節,如果文本長度過長,就需要進行切割處理,采用多次請求的方式,分別轉換成語音文件,最后再將多個語音文件合并成一個。
2.2 文本切割
可以使用如下代碼將文本分割成多個長度為 500 的文本列表
# 將文本按 500 的長度分割成多個文本 text_list = [text[i:i+500] for i in range(0, len(text), 500)]
2.3 語言文件合并
我們使用 pydub 來處理生成的音頻文件。使用 pip install pydub 即可安裝。
另外還 Ubuntu 環境需要安裝依賴的,使用 sudo apt-get install libav-tools 安裝即可.而在 Windows 環境需要到 https://ffmpeg.zeranoe.com/builds/ 下載 FFmpeg,并將其配置到環境變量中。
若還有問題,可以參考官網配置:https://github.com/jiaaro/pydub。
# 合并音頻文件 def merge_voice(file_list): voice_dict = {} song = None for i,f in enumerate(file_list): if i == 0: song = AudioSegment.from_file(f,"mp3") else: # 拼接音頻文件 song += AudioSegment.from_file(f,"mp3") # 刪除臨時音頻 os.unlink(f) # 導出合并后的音頻文件,格式為MP3格式 file_name = str(uuid.uuid1()) + ".mp3" song.export(file_name, format="mp3") return file_name
通過百度的接口,我們可以將文字轉化成音頻文件,下面的問題就是如何播放音頻文件。
音頻文件播放
網上獲取到 Python 播放 wav 文件的方式由好幾種,包括 pyaudio、pygame、winsound、playsound。不過測試下來,只有 playsound 成功。其他方式有興趣的可以試下,有問題可以留言交流。
使用 pip install playsound 安裝后即可使用。
使用也很簡單:
>>> from playsound import playsound >>> playsound('/path/to/a/sound/file/you/want/to/play.mp3')
說明:音頻的播放需要在圖形化頁面下運行,因為命令行模式下,沒有播放聲音的出口。
python page2voice.py -u "https://so.gushiwen.org/shiwenv_c244fc77f6fb.aspx"
運行后,代碼就會自動解析網頁并進行朗讀啦。
總結
至此,網頁到音頻的轉換就結束了。當然程序沒有這么完美,比如中英文混合的網頁解析和轉換的結果就不怎么理想,但是純中文的新聞頁面效果還是不錯的。源碼已上傳至 GitHub:
https://github.com/hoxis/to_voice/blob/master/page2voice.py
作者:不正經程序員,現在是一名小小的開發工程師,工作主要用 Java、Python,平時除了喜歡鉆研專業技術外,業余也會鼓搗下程序員周邊,比如讀書、效率工具、理財等等等等。 歡迎關注,共同進步!
聲明:本文為作者投稿,版權歸對方所有。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。