每日最新頭條.有趣資訊

如何使用 Python和BeautifulSoup 爬取網站

作者丨Justin Yek

譯者丨平川

互聯網上的信息如此之多,任何人窮其一生也無法全部消化吸收。你需要的不是訪問這些信息,而是一種可伸縮的方式,可以用來收集、組織和分析這些信息。你需要的是 Web 爬取。Web 爬取可以自動提取數據,並以一種讓你可以輕鬆理解的格式顯示出來。Web 爬取可以用於許多場景,但本教程將重點介紹它在金融市場中的應用。

互聯網上的信息如此之多,任何人窮其一生也無法全部消化吸收。你需要的不是訪問這些信息,而是一種可伸縮的方式,可以用來收集、組織和分析這些信息。

你需要的是 Web 爬取。

Web 爬取可以自動提取數據,並以一種讓你可以輕鬆理解的格式顯示出來。Web 爬取可以用於許多場景,但本教程將重點介紹它在金融市場中的應用。

如果你是一名狂熱的投資者,每天獲取收盤價可能是一件比較痛苦的事情,尤其是當你需要的信息需要查看多個網頁才能找到的時候。我們將通過構建一個網絡爬取器,從互聯網上自動檢索股票指數,簡化數據提取。

準 備

我們將使用 Python 作為爬取語言,並使用一個簡單而強大的庫 BeautifulSoup。

對於 Mac 用戶而言,OS X 預裝了 Python。打開終端,輸入 python --version。你應該可以看到 Python 的版本是 2.7.x。

對於 Windows 用戶,請通過官方網站安裝 Python。

接下來,我們需要使用 pip(一個 Python 包管理工具)獲取 BeautifulSoup 庫。

在終端輸入:

注意:如果你運行上述命令失敗,試下在每一行前面加上 sudo。

基本概念

在一頭扎進代碼之前,讓我們先了解下 HTML 的基本概念和一些爬取規則。

HTML 標簽

如果你已經了解了 HTML 標簽,大可以跳過這部分。

這是 HTML 頁面的基本語法。每個服務於網頁裡的一個塊:

:HTML 文檔必須以類型聲明開始。

HTML 文檔包含在和之間。

HTML 文檔的 meta 和 script 聲明位於和之間。

HTML 的可視部分位於和標簽之間。

標題的定義通過標簽 到 。

段落使用

標簽定義。

其他有用的標簽還有超鏈接標簽、表格標簽、表格行標簽、表格列標簽。

此外,HTML 標簽有時帶有 id 或 class 屬性。id 屬性為 HTML 標簽指定一個惟一的 id,並且該值在 HTML 文檔中必須是惟一的。class 屬性用於為具有相同 class 的 HTML 標簽定義相同的樣式。我們可以使用這些 id 和 class 幫助定位我們想要的數據。

要了解關於 HTML 標簽、 id 和 class 的信息,請查閱 W3Schools 教程。

爬取規則

你應該在爬取之前檢查網站的條款和限制。請仔細閱讀關於合法使用數據的聲明。通常,你收集的數據不應用於商業目的。

用你的程序從網站請求數據時不要過激(也稱為濫發),因為這可能會對網站造成破壞。確保你的程序以一種合理的方式運行(即表現得像個人)。每秒請求一個頁面是很好的做法。

網站的布局可能會不時發生變化,所以一定要重新訪問網站,並根據需要重寫代碼。

查看頁面

作為例子,讓我們看一個來自 Bloomberg Quote 網站的頁面。

作為關注股票市場的人,我們希望從這個頁面上獲取指數名稱(標準普爾 500)及其價格。首先,右鍵單擊並打開瀏覽器檢查器來查看網頁。

嘗試把滑鼠懸停在價格上,你應該可以看到一個藍框。單擊它,就可以在瀏覽器控制台中選擇相關的 HTML。

從中我們可以看到,價格位於多層 HTML 標簽之中,即

類似地,如果你將滑鼠懸停並單擊名稱“S&P 500 Index”,就會看到它位於

和中。

現在,我們已經借助 class 標簽知道了數據的唯一位置。

進入代碼

現在,我們已經知道我們想要的數據在哪,我們可以開始編寫 Web 爬取器了。現在,打開編輯器。

首先,我們需要導入我們將要用到的庫。

接下來,聲明一個保存頁面 URL 的變量。

然後,使用 Python urllib2 獲取上述 URL 指向的 HTML 頁面。

最後,將頁面解析成 BeautifulSoup 的格式,這樣我們就可以使用 BeautifulSoup 處理它了。

現在,我們有一個包含頁面 HTML 的變量 soup。從這裡開始我們可以編寫提取數據的代碼了。

還記得我們需要的數據所獨有的標簽層次嗎?BeautifulSoup 可以幫助我們進入這些層,並使用 find() 提取內容。在本例中,由於 HTML class 屬性的名稱在這個頁面上是惟一的,所以我們可以簡單地查詢

在找到標簽之後,我們就可以通過獲取其 text 屬性來獲取數據。

類似地,我們也可以獲取指數價格。

運行程序,你應該可以看到它給出了標準普爾 500 指數的價格。

導出到 Excel CSV

現在我們要保存獲取到的數據了。Excel 逗號分隔格式是一個不錯的選擇。它可以在 Excel 中打開,這樣你就可以看到數據並輕鬆地處理它。

但是首先,我們必須導入 Python csv 模塊和 datetime 模塊來獲取記錄日期。將以下代碼插入導入部分。

在代碼底部添加將數據寫入 CSV 文件的代碼。

現在運行程序,你應該就可以導出到 index.csv 文件,然後你就可以用 Excel 打開,其中應該包含如下這行數據。

這樣,你每天運行下這個程序就可以輕鬆獲得標準普爾 500 指數的價格了,就不用在網站上翻來翻去了。

進一步探究(高級用法)

多指數

對你而言,爬取一個指數並不夠用,對嗎?我們可以嘗試下同時提取多個指數。

首先,將 quote_page 改成 URL 陣列。

然後,將數據提取代碼放入一個 for 循環,它會逐個處理陣列中的 URL 並將所有數據以元組的形式保存到變量 data 中。

修改數據保存部分,逐行保存數據,

運行這個程序,應該就可以同時提取兩個指數了。

高級爬取技術

BeautifulSoup 非常簡單,適合於小規模 Web 爬取。但是,如果你對更大規模的數據爬取感興趣,就應該考慮下下面這些選項:

Scrapy 是一個非常強大的 Python 爬取框架。

嘗試在你的代碼中集成一些公共 API。數據檢索的效率會遠遠高於爬取網頁。例如,看看 Facebook Graph API ,它可以幫助你獲得 Facebook 網頁上沒有顯示的隱藏數據。

當數據變大時,考慮使用類似 MySQL 這樣的數據庫後端來存儲數據。

採用 DRY 方法

DRY 的意思是“不要重複你自己”,試著像這個人一樣自動化你的日常任務。還可以考慮其他一些有趣的項目,比如跟蹤 Facebook 上朋友的活動時間(當然要征得他們的同意),或者在論壇上列出一些話題,並嘗試自然語言處理(這是目前人工智能的熱門話題)!如果有任何問題,請在下面留言。

https://medium.com/free-code-camp/how-to-scrape-websites-with-python-and-beautifulsoup-5946935d93fe

今日薦文

從木工活兒到戶外大冒險,程序員有多斜杠?你根本想象不到丨二叉樹視頻

點個在看少個 bug

獲得更多的PTT最新消息
按讚加入粉絲團