整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          使用Python進行網(wǎng)頁抓取的介紹

          網(wǎng)頁抓取是一種重要的技術(shù),經(jīng)常在許多不同的環(huán)境中使用,尤其是數(shù)據(jù)科學(xué)和數(shù)據(jù)挖掘。 Python在很大程度上被認為是網(wǎng)絡(luò)抓取的首選語言,其原因在于Python的內(nèi)嵌電池特性。 使用Python,您可以在大約15分鐘內(nèi)使用不到100行代碼創(chuàng)建一個簡單的抓取腳本。 因此,無論何種用途,網(wǎng)頁抓取都是每個Python程序員必須具備的技能。

          在我們開始動手之前,我們需要退后一步,考慮什么是網(wǎng)頁抓取,什么時候應(yīng)該使用它,何時避免使用它。

          如您所知,網(wǎng)頁抓取是一種用于從網(wǎng)站自動提取數(shù)據(jù)的技術(shù)。 重要的是要理解,網(wǎng)頁抓取是一種從各種來源(通常是網(wǎng)頁)中提取數(shù)據(jù)的粗略技術(shù)。 如果網(wǎng)站的開發(fā)人員足夠慷慨地提供API來提取數(shù)據(jù),那么訪問數(shù)據(jù)將是一種更加穩(wěn)定和健壯的方式。 因此,根據(jù)經(jīng)驗,如果網(wǎng)站提供API以編程方式檢索其數(shù)據(jù),請使用它。 如果API不可用,則只能使用網(wǎng)絡(luò)抓取。

          請務(wù)必遵守有關(guān)您使用的每個網(wǎng)站的網(wǎng)頁抓取的任何規(guī)則或限制,因為有些網(wǎng)站不允許這樣做。 有了這個清楚的認識,讓我們直接進入教程。

          在本教程中,我們將抓取http://quotes.toscrape.com/,這是一個列出著名作家名言的網(wǎng)站。

          網(wǎng)頁抓取管道

          我們可以將web-scraping理解為包含3個組件的管道:

          下載:下載HTML網(wǎng)頁

          解析:解析HTML并檢索我們感興趣的數(shù)據(jù)

          存儲:以特定格式將檢索到的數(shù)據(jù)存儲在本地計算機中

          下載HTML

          從網(wǎng)頁中提取任何數(shù)據(jù),從邏輯上講,我們首先要下載它。 我們有兩種方法可以做到這一點:

          1.使用瀏覽器自動化庫

          您可以使用Selenium等瀏覽器自動化庫從網(wǎng)頁下載HTML。 Selenium允許您打開瀏覽器,比方說Chrome,并根據(jù)需要控制它。 您可以在瀏覽器中打開網(wǎng)頁,然后使用Selenium自動獲取該頁面的HTML代碼。

          但是,這種方法有一個很大的缺點 - 它明顯變慢。 原因是運行瀏覽器并在瀏覽器中呈現(xiàn)HTML的開銷。 此方法僅應(yīng)用于特殊情況 - 我們要抓取的內(nèi)容在瀏覽器中使用JavaScript代碼,或者要求我們單擊按鈕/鏈接以獲取數(shù)據(jù),Selenium可以為我們執(zhí)行此操作。

          2.使用HTTP庫

          與第一種方法不同,HTTP庫(例如Requests模塊或Urllib)允許您發(fā)送HTTP請求,完全不需要打開任何瀏覽器。 這種方法應(yīng)該始終是首選,因為它比Selenium快得多。

          現(xiàn)在讓我告訴您如何使用Selenium和Requests庫實現(xiàn)管道這個組件:

          使用Requests

          使用以下命令安裝Requests模塊:

          現(xiàn)在您可以在代碼中使用它,如下所示:

          這里,對URL進行HTTP GET請求,這幾乎與下載網(wǎng)頁同義。 然后,我們可以通過訪問requests.get方法返回的結(jié)果對象來獲取頁面的HTML源代碼。

          使用Selenium

          您可以通過pip安裝selenium模塊:

          在這里,我們首先創(chuàng)建一個表示瀏覽器的webdriver對象。 這樣做會在運行代碼的計算機上打開Chrome瀏覽器。 然后,通過調(diào)用webdriver對象的get方法,我們可以打開URL。 最后,我們通過訪問webdriver對象的page_source屬性來獲取源代碼。

          在這兩種情況下,URL的HTML源都作為字符串存儲在page變量中。

          解析HTML和提取數(shù)據(jù)

          不必深入計算機科學(xué)理論,我們可以將解析定義為分析字符串的過程,以便我們可以理解其內(nèi)容,從而輕松訪問其中的數(shù)據(jù)。

          在Python中,有兩個庫可以幫助我們解析HTML:BeautifulSoup和Lxml。 Lxml是一個比BeautifulSoup更低級的框架,我們可以在BeautifulSoup中使用Lxml作為后端,因此對于簡單的HTML解析,BeautifulSoup將是首選的庫。

          但在我們深入分析之前,我們必須分析網(wǎng)頁的HTML,看看我們想要抓取的數(shù)據(jù)是如何構(gòu)建和定位的。只有當我們掌握了這些信息時,我們才能從解析的HTML中獲取我們想要的信息。但幸運的是,我們不必在編輯器中打開源代碼,并手動理解每個HTML元素并將其與渲染頁面中的相應(yīng)數(shù)據(jù)相關(guān)聯(lián)。大多數(shù)瀏覽器都提供了一個檢查器,比如Chrome的開發(fā)人員工具,它使我們只需單擊它們即可快速查看任何元素的HTML代碼。

          要在Chrome中執(zhí)行此操作,請在Chrome中打開網(wǎng)頁,然后右鍵單擊要抓取的數(shù)據(jù),然后選擇“檢查”。在Firefox中,此選項稱為Inspect Element - 這是在做相同的事情,但只是名稱不同。

          您會注意到Chrome窗口底部打開了一個窗格,其中包含您單擊的元素的源代碼。 瀏覽一下源代碼,了解我們想要抓取的數(shù)據(jù)是如何在HTML代碼中構(gòu)建的。

          經(jīng)過一些檢查后你可以理解,http://quotes.toscrape.com/上的每個引用都包含在一個帶有class =“quote”屬性的div中。 在該div中,引用的文本在class =“text”的范圍內(nèi),作者的名稱在class =“author”的小標簽中。 當我們實際解析HTML并提取數(shù)據(jù)時,將需要此信息。

          現(xiàn)在,讓我們開始使用BeautifulSoup解析HTML頁面。 但首先,我們必須安裝它:

          安裝好之后,可以像下面這樣在代碼中調(diào)用:

          首先,我們通過將頁面?zhèn)鬟f給BeautifulSoup類構(gòu)造函數(shù)來創(chuàng)建頁面的解析版本。 如您所見,我們還將第二個參數(shù)html.parser傳遞給構(gòu)造函數(shù)。 這是Beautiful Soup將用于解析傳遞給它的字符串的解析器的名稱。 你可以使用我們之前談到過的解析器lxml,因為你已經(jīng)安裝了Lxml庫。

          然后,我們提取包含class =“quote”的頁面中的所有div標簽,因為我們知道這些是包含引用的div。 為此,Beautiful Soup 4提供了find_all功能。 我們將標記名稱和類名稱傳遞給find_all函數(shù),并返回滿足條件的所有標記,即包含引用的標記。

          這里需要注意的一件重要事情是,我們在這里使用樹結(jié)構(gòu)。 變量soup以及引用的每個元素都是樹。 在某種程度上,引用的元素是較大的soup樹的一部分。 無論如何,為避免進入不同的討論,讓我們繼續(xù)。

          我們知道引用的文本是帶有class =“text”的span標記,而作者是帶有class =“author”的小標記。 要從quote元素中提取它們,我們再次使用類似的函數(shù)find。 find函數(shù)使用與find_all函數(shù)相同的參數(shù)。 唯一的區(qū)別是它返回滿足條件的第一個標記,而find_all返回標記列表。 此外,我們希望訪問返回對象的text屬性,該對象包含該標記中包含的文本。

          因此,正如您在代碼中看到的那樣,我們遍歷列表引用的所有元素,并提取引用文本和作者名稱,將它們存儲在名稱為scraped的列表。 在控制臺上打印時,已抓取的列表如下所示:

          存儲檢索的數(shù)據(jù)

          一旦我們獲得了數(shù)據(jù),我們就可以以任何我們想要的格式存儲它,例如CSV文件,SQL數(shù)據(jù)庫或NoSQL數(shù)據(jù)庫。 嚴格來說,這一步不應(yīng)算作抓取過程的一部分,但為了完整起見,我將簡要介紹它。

          我想說最流行的存儲抓取數(shù)據(jù)的方法是將它們存儲為CSV電子表格,所以我將簡要介紹如何做到這一點。 我不會詳細介紹,因為您應(yīng)該參考官方的Python文檔。 所以,不用多說,讓我們看看代碼。

          我們可以看到,代碼非常明顯。 我們從打開的quotes.csv文件創(chuàng)建一個CSV編寫器對象,然后使用writerow函數(shù)逐個寫入引用。 很明顯,writerow函數(shù)接受一個列表作為輸入,然后將其作為一行寫入CSV。

          結(jié)論和后續(xù)步驟

          本教程應(yīng)該幫助您了解在學(xué)習(xí)自己實現(xiàn)簡單的scraper時基本上是什么。 這種抓取應(yīng)該足以實現(xiàn)簡單的自動化或小規(guī)模數(shù)據(jù)檢索。 但是如果你想有效地提取大量數(shù)據(jù),你應(yīng)該研究一下抓取框架,特別是Scrapy。 它可以幫助您使用幾行代碼編寫非常快速,高效的scraper。 無論你使用什么樣的框架,在那個閃亮的表面下面,框架也使用這些非常基本的抓取原則,所以理解本教程應(yīng)該可以幫助你為開始抓取的探險建立基礎(chǔ)知識。

          英文原文:https://stackabuse.com/introduction-to-web-scraping-with-python/
          譯者:javylee

          者:Kerry Parker

          翻譯:田曉寧

          校對:丁楠雅

          本文約2900字,建議閱讀10分鐘。

          本教程以在Fast Track上收集百強公司的數(shù)據(jù)為例,教你抓取網(wǎng)頁信息。



          作為一名數(shù)據(jù)科學(xué)家,我在工作中所做的第一件事就是網(wǎng)絡(luò)數(shù)據(jù)采集。使用代碼從網(wǎng)站收集數(shù)據(jù),當時對我來說是一個完全陌生的概念,但它是最合理、最容易獲取的數(shù)據(jù)來源之一。經(jīng)過幾次嘗試,網(wǎng)絡(luò)抓取已經(jīng)成為我的第二天性,也是我?guī)缀趺刻焓褂玫募寄苤弧?/p>

          在本教程中,我將介紹一個簡單的例子,說明如何抓取一個網(wǎng)站,我將從Fast Track上收集2018年百強公司的數(shù)據(jù):

          Fast Track:http://www.fasttrack.co.uk/

          使用網(wǎng)絡(luò)爬蟲將此過程自動化,避免了手工收集數(shù)據(jù),節(jié)省了時間,還可以讓所有數(shù)據(jù)都放在一個結(jié)構(gòu)化文件中。

          用Python實現(xiàn)一個簡單的網(wǎng)絡(luò)爬蟲的快速示例,您可以在GitHub上找到本教程中所介紹的完整代碼。

          GitHub鏈接:https://github.com/kaparker/tutorials/blob/master/pythonscraper/websitescrapefasttrack.py

          以下是本文使用Python進行網(wǎng)頁抓取的簡短教程概述:

          • 連接到網(wǎng)頁
          • 使用BeautifulSoup解析html
          • 循環(huán)通過soup對象找到元素
          • 執(zhí)行一些簡單的數(shù)據(jù)清理
          • 將數(shù)據(jù)寫入csv

          準備開始

          在開始使用任何Python應(yīng)用程序之前,要問的第一個問題是:我需要哪些庫?

          對于web抓取,有一些不同的庫需要考慮,包括:

          • Beautiful Soup
          • Requests
          • Scrapy
          • Selenium

          在本例中我們使用Beautiful Soup。你可以使用Python包管理器 pip 安裝Beautiful Soup:

          pip install BeautifulSoup4

          安裝好這些庫之后,讓我們開始吧!

          檢查網(wǎng)頁

          要知道在Python代碼中需要定位哪些元素,首先需要檢查網(wǎng)頁。

          要從Tech Track Top 100 companies收集數(shù)據(jù),可以通過右鍵單擊感興趣的元素來檢查頁面,然后選擇檢查。這將打開HTML代碼,我們可以在其中看到每個字段包含在其中的元素。

          Tech Track Top 100 companies鏈接:http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/




          右鍵單擊感興趣的元素并選擇“Inspect”,顯示html元素。

          由于數(shù)據(jù)存儲在一個表中,因此只需幾行代碼就可以直接獲取數(shù)據(jù)。如果您想練習(xí)抓取網(wǎng)站,這是一個很好的例子,也是一個好的開始,但請記住,它并不總是那么簡單!

          所有100個結(jié)果都包含在<tr> 元素的行中,并且這些在一頁上都可見。情況并非總是如此,當結(jié)果跨越多個頁面時,您可能需要更改網(wǎng)頁上顯示的結(jié)果數(shù)量,或者遍歷所有頁面以收集所有信息。

          League Table網(wǎng)頁上顯示了包含100個結(jié)果的表。檢查頁面時,很容易在html中看到一個模式。結(jié)果包含在表格中的行中:

          <table class="tableSorter">

          重復(fù)的行<tr> 將通過在Python中使用循環(huán)來查找數(shù)據(jù)并寫入文件來保持我們的代碼最小化!

          附注:可以做的另一項檢查是網(wǎng)站上是否發(fā)出了HTTP GET請求,該請求可能已經(jīng)將結(jié)果作為結(jié)構(gòu)化響應(yīng)(如JSON或XML格式)返回。您可以在檢查工具的網(wǎng)絡(luò)選項卡中進行檢查,通常在XHR選項卡中進行檢查。刷新頁面后,它將在加載時顯示請求,如果響應(yīng)包含格式化結(jié)構(gòu),則使用REST客戶端(如Insomnia)返回輸出通常更容易。



          刷新網(wǎng)頁后,頁面檢查工具的網(wǎng)絡(luò)選項卡

          使用Beautiful Soup解析網(wǎng)頁html

          現(xiàn)在您已經(jīng)查看了html的結(jié)構(gòu)并熟悉了將要抓取的內(nèi)容,是時候開始使用Python了!

          第一步是導(dǎo)入將用于網(wǎng)絡(luò)爬蟲的庫。我們已經(jīng)討論過上面的BeautifulSoup,它有助于我們處理html。我們導(dǎo)入的下一個庫是urllib,它連接到網(wǎng)頁。最后,我們將輸出寫入csv,因此我們還需要導(dǎo)入csv 庫。作為替代方案,可以在此處使用json庫。

          # import librariesfrom bs4 import BeautifulSoupimport urllib.requestimport csv

          下一步是定義您正在抓取的網(wǎng)址。如上一節(jié)所述,此網(wǎng)頁在一個頁面上顯示所有結(jié)果,因此此處給出了地址欄中的完整url:

          # specify the urlurlpage = 'http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/'

          然后我們建立與網(wǎng)頁的連接,我們可以使用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變量,它應(yīng)該返回我們請求網(wǎng)頁的完整解析的html。

          print(soup)

          如果存在錯誤或變量為空,則請求可能不成功。可以使用urllib.error模塊在此時實現(xiàn)錯誤處理。

          搜索html元素

          由于所有結(jié)果都包含在表中,我們可以使用find 方法搜索表的soup對象。然后我們可以使用find_all 方法查找表中的每一行。

          如果我們打印行數(shù),我們應(yīng)該得到101的結(jié)果,100行加上標題。

          # find results within tabletable = soup.find('table', attrs={'class': 'tableSorter'})results = table.find_all('tr')print('Number of results', len(results))

          因此,我們可以對結(jié)果進行循環(huán)以收集數(shù)據(jù)。

          打印soup對象的前兩行,我們可以看到每行的結(jié)構(gòu)是:

          <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,所有這些都是我們可以保存的感興趣的數(shù)據(jù)。

          網(wǎng)頁的所有行的結(jié)構(gòu)都是一致的(對于所有網(wǎng)站來說可能并非總是如此!)。因此,我們可以再次使用find_all 方法將每一列分配給一個變量,那么我們可以通過搜索<td> 元素來寫入csv或JSON。

          循環(huán)遍歷元素并保存變量

          在Python中,將結(jié)果附加到一個列表中是很有用的,然后將數(shù)據(jù)寫到一個文件中。我們應(yīng)該在循環(huán)之前聲明列表并設(shè)置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,那么第二行不僅僅包含公司名稱。我們可以使用一些進一步的提取來獲取這些額外信息。

          下一步是循環(huán)結(jié)果,處理數(shù)據(jù)并附加到可以寫入csv的rows。

          在循環(huán)中查找結(jié)果:

          # 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

          由于表中的第一行僅包含標題,因此我們可以跳過此結(jié)果,如上所示。它也不包含任何<td>元素,因此在搜索元素時,不會返回任何內(nèi)容。然后,我們可以通過要求數(shù)據(jù)的長度為非零來檢查是否只處理包含數(shù)據(jù)的結(jié)果。

          然后我們可以開始處理數(shù)據(jù)并保存到變量中。

          # 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()

          以上只是從每個列獲取文本并保存到變量。但是,其中一些數(shù)據(jù)需要進一步清理以刪除不需要的字符或提取更多信息。

          數(shù)據(jù)清理

          如果我們打印出變量company,該文本不僅包含公司名稱,還包含描述。我們?nèi)缓蟠蛴ales,它包含不需要的字符,如腳注符號,最好刪除。

          print('Company is', company) # Company is WonderblyPersonalised children's books print('Sales', sales) # Sales *25,860

          我們希望將company 分為公司名稱和描述,我們可以用幾行代碼實現(xiàn)。再看一下html,對于這個列,有一個 <span> 元素只包含公司名稱。此列中還有一個鏈接指向網(wǎng)站上的另一個頁面,其中包含有關(guān)該公司的更多詳細信息。我們將在稍后使用它!

          <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(',','')

          我們要保存的最后一個變量是公司網(wǎng)站。如上所述,第二列包含指向另一個頁面的鏈接,該頁面具有每個公司的概述。 每個公司頁面都有自己的表格,大部分時間都包含公司網(wǎng)站。



          檢查公司頁面上的url元素

          要從每個表中抓取url并將其保存為變量,我們需要使用與上面相同的步驟:

          • 在fast track網(wǎng)站上找到具有公司頁面網(wǎng)址的元素
          • 向每個公司頁面網(wǎng)址發(fā)出請求
          • 使用Beautifulsoup解析html
          • 找到感興趣的元素

          查看一些公司頁面,如上面的屏幕截圖所示,網(wǎng)址位于表格的最后一行,因此我們可以在最后一行內(nèi)搜索<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

          也有可能出現(xiàn)公司網(wǎng)站未顯示的情況,因此我們可以使用try except條件,以防萬一找不到網(wǎng)址。

          一旦我們將所有數(shù)據(jù)保存到變量中,我們可以在循環(huán)中將每個結(jié)果添加到列表rows。

          # write each result to rows rows.append([rank, company, webpage, description, location, yearend, salesrise, sales, staff, comments])print(rows)

          然后可以試著在循環(huán)外打印變量,在將其寫入文件之前檢查它是否符合您的預(yù)期!

          寫入輸出文件

          如果想保存此數(shù)據(jù)以進行分析,可以用Python從我們列表中非常簡單地實現(xiàn)。

          # 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行結(jié)果的輸出文件,您可以更詳細地查看這些結(jié)果!

          尾語

          這是我的第一個教程,如果您有任何問題或意見或者不清楚的地方,請告訴我!

          • Web Development
          • https://towardsdatascience.com/tagged/web-development?source=post
          • Python
          • https://towardsdatascience.com/tagged/python?source=post
          • Web Scraping
          • https://towardsdatascience.com/tagged/web-scraping?source=post
          • Data Science
          • https://towardsdatascience.com/tagged/data-science?source=post
          • Programming
          • https://towardsdatascience.com/tagged/programming?source=post

          原文標題:

          Data Science Skills: Web scraping using python

          原文鏈接:

          https://towardsdatascience.com/data-science-skills-web-scraping-using-python-d1a85ef607ed

          譯者簡介

          田曉寧,質(zhì)量管理專家,國際認證精益六西格瑪黑帶,19年從業(yè)經(jīng)驗;軟件工程專家,擁有CMMI ATM證書,曾主導(dǎo)公司通過CMMI 5級評估;精通ISO9000和ISO27000體系,長期擔(dān)任公司質(zhì)量和信息安全主任審核員,每年審核超過50個項目或部門;擁有PMP證書,擔(dān)任公司項目管理內(nèi)訓(xùn)師,具有項目管理和系統(tǒng)開發(fā)實戰(zhàn)經(jīng)驗。

          — 完 —

          關(guān)注清華-青島數(shù)據(jù)科學(xué)研究院官方微信公眾平臺“THU數(shù)據(jù)派”及姊妹號“數(shù)據(jù)派THU”獲取更多講座福利及優(yōu)質(zhì)內(nèi)容。

          者 | hoxis

          責(zé)編 | 郭芮

          是不是有的時候懶得自己看新聞?那么不妨試試用 Python 來朗讀給你聽吧。

          網(wǎng)頁轉(zhuǎn)換成語音,步驟無外乎:

          • 網(wǎng)頁正文識別,獲取到正文的文本內(nèi)容;
          • 文本轉(zhuǎn)語音,通過接口將文本轉(zhuǎn)換成語音文件;
          • 語音文件的發(fā)聲,即將語音文件讀出;

          網(wǎng)頁正文識別

          之所以用 Python,就是因為 Python 有著豐富的庫,網(wǎng)頁正文識別也不在話下。這里我嘗試了 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 提取到的正文內(nèi)容不是文本,里面仍包含 HTML 標簽。

          當然也可以結(jié)合其他組件再對 HTML 進行處理,如 html2text,我們這里就不再延伸,有興趣的可以自行嘗試。

          1.2 goose3

          Goose 本來是一個用 Java 編寫的文章提取器,后來就有了 Python 實現(xiàn)版: 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(圣彼得堡當?shù)貢r間18:00),2018年世界杯B組一場比賽在圣彼得堡球場展開角逐,伊朗1比0險勝摩洛哥,伊朗前鋒阿茲蒙半場結(jié)束前錯過單刀機會,鮑哈杜茲第95分鐘自擺烏
          龍。這是伊朗20年來首度在世界杯決賽圈取勝。
          本屆世界杯,既相繼出現(xiàn)替補便進球,貼補梅開二度以及東道主
          

          可以看出網(wǎng)頁正文提取效果還不錯,基本滿足我們的要求,可以使用!

          注意:goose 還有另外一個 Python2 的版本:Python-Goose,使用方法和 goose3 基本一樣。

          文本轉(zhuǎn)語音

          文本轉(zhuǎn)語音,百度、阿里、騰訊、訊飛等都有提供 REST API 接口,阿里和騰訊的申請相對時間較長,阿里的貌似還要收費,百度和訊飛的在線申請后即可使用。

          沒辦法,好的東西得來總是要曲折一些。其中百度的沒有調(diào)用量的限制(其實默認是 200000 次/天),訊飛有每天 500 次的限制。

          這里我們使用百度的 REST API 接口中的語言合成接口,一方面原因是百度的調(diào)用次數(shù)沒有限制,另一方面,我看了下訊飛的接口文檔,接口限制還是比較多的。還有就是百度提供了 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 
          均可在服務(wù)控制臺中的應(yīng)用列表中查看。
          """
          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)
          

          接口參數(shù):

          參數(shù)類型描述必傳texString合成的文本,使用UTF-8編碼,請注意文本長度必須小于1024字節(jié)是langString語言選擇,填寫zh是ctpString客戶端類型選擇,web端填寫1是cuidString用戶唯一標識,用來區(qū)分用戶,填寫機器 MAC 地址或 IMEI 碼,長度為60以內(nèi)否spdString語速,取值0-9,默認為5中語速否pitString音調(diào),取值0-9,默認為5中語調(diào)否volString音量,取值0-15,默認為5中音量否perString發(fā)音人選擇,0為女聲,1為男聲,3為情感合成-度逍遙,4為情感合成-度丫丫,默認為普通女否

          接口對單次傳入的文本進行了限制,合成文本長度必須小于 1024 字節(jié),如果文本長度過長,就需要進行切割處理,采用多次請求的方式,分別轉(zhuǎn)換成語音文件,最后再將多個語音文件合并成一個。

          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 環(huán)境需要安裝依賴的,使用 sudo apt-get install libav-tools 安裝即可.而在 Windows 環(huán)境需要到 https://ffmpeg.zeranoe.com/builds/ 下載 FFmpeg,并將其配置到環(huán)境變量中。

          若還有問題,可以參考官網(wǎng)配置: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)
           # 導(dǎo)出合并后的音頻文件,格式為MP3格式
           file_name = str(uuid.uuid1()) + ".mp3"
           song.export(file_name, format="mp3")
           return file_name
          

          通過百度的接口,我們可以將文字轉(zhuǎn)化成音頻文件,下面的問題就是如何播放音頻文件。

          音頻文件播放

          網(wǎng)上獲取到 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"
          

          運行后,代碼就會自動解析網(wǎng)頁并進行朗讀啦。

          總結(jié)

          至此,網(wǎng)頁到音頻的轉(zhuǎn)換就結(jié)束了。當然程序沒有這么完美,比如中英文混合的網(wǎng)頁解析和轉(zhuǎn)換的結(jié)果就不怎么理想,但是純中文的新聞頁面效果還是不錯的。源碼已上傳至 GitHub:

          https://github.com/hoxis/to_voice/blob/master/page2voice.py

          作者:不正經(jīng)程序員,現(xiàn)在是一名小小的開發(fā)工程師,工作主要用 Java、Python,平時除了喜歡鉆研專業(yè)技術(shù)外,業(yè)余也會鼓搗下程序員周邊,比如讀書、效率工具、理財?shù)鹊鹊鹊取?歡迎關(guān)注,共同進步!

          聲明:本文為作者投稿,版權(quán)歸對方所有。


          主站蜘蛛池模板: 日本一区二区三区高清| 无码视频一区二区三区在线观看 | 亚洲丰满熟女一区二区哦| 国精品无码一区二区三区在线| 亚洲第一区精品观看| 在线观看免费视频一区| 无码人妻精品一区二区三区66 | 国产成人精品a视频一区| 中文字幕一区在线观看| 麻豆天美国产一区在线播放| 成人一区专区在线观看| 亚洲一区二区三区丝袜| 国产亚洲福利一区二区免费看| 欧美激情一区二区三区成人| 亚洲制服丝袜一区二区三区| 久久久久久综合一区中文字幕| 国产免费一区二区三区不卡| 国产乱码精品一区二区三区香蕉| 精品欧洲av无码一区二区| 亚洲国产成人久久综合一区| 在线播放国产一区二区三区| 亚洲一区AV无码少妇电影| 精品国产天堂综合一区在线| 日本一区视频在线播放| 国产午夜精品免费一区二区三区| 人妻少妇精品视频一区二区三区 | 亚洲不卡av不卡一区二区| 久久亚洲中文字幕精品一区| 波多野结衣一区二区三区高清在线| 濑亚美莉在线视频一区| 国产人妖在线观看一区二区| 搜日本一区二区三区免费高清视频| 国产一区视频在线免费观看| 午夜福利一区二区三区高清视频 | 在线观看一区二区精品视频| 国产福利无码一区在线| 免费人妻精品一区二区三区| 无码精品人妻一区二区三区免费看| 少妇激情一区二区三区视频 | 红杏亚洲影院一区二区三区| 夜夜添无码试看一区二区三区|