學習使用 Python 抓取財務數據

已發表: 2019-04-26
目錄顯示
為什麼要從雅虎財經抓取數據?
如何使用 Python 抓取財務數據?
1.從Python爬取代碼開始
2.爬蟲代碼解釋
3. 我們捕獲的一些重要數據點
您可以從雅虎財經抓取哪些數據?
您可以抓取哪些其他財務數據?
雅虎財經數據使用案例
在提取網絡數據方面需要幫助?

股票市場是一個巨大的數據庫,每秒鐘都會更新數百萬個條目。 雖然有許多公司確實提供公司的財務數據,但通常是通過 API(應用程序編程接口)。 正如您可能已經猜到的那樣,這些 API 從來都不是免費的。 雅虎財經是值得信賴的股市數據來源,並擁有付費 API。 我們將逐步指導您如何使用 Python 抓取 Yahoo Finance 數據。

為什麼要從雅虎財經抓取數據?

如果您需要來自可靠來源的免費、乾淨的財務數據,雅虎財經是您的最佳選擇。 公司簡介網頁以統一的結構構建,使網頁抓取 python 變得容易。 如果你編寫一個腳本從微軟的財務頁面爬取數據,同樣的腳本也可以用於從蘋果的財務頁面爬取數據。

如何使用 Python 抓取財務數據?

對於安裝和入門,您可以參考這篇關於數據抓取 python 的文章中的基本步驟,其中我們討論瞭如何從領先​​的酒店預訂門戶網站抓取數據。 一旦您安裝了所有依賴項以及代碼編輯器 Atom,讓我們開始使用 Python 抓取 Yahoo Finance。

1.從Python爬取代碼開始

安裝和設置階段完成後,我們可以直接進入代碼並啟動 Yahoo Finance Scraping。 代碼在下面進一步給出,可以僅使用 Python 命令運行。

如何抓取雅虎財務數據

您可以按照上面顯示的方式運行代碼。 出現提示時,只需輸入您要查看其財務摘要的公司的 URL。 我們使用了 Microsoft 的鏈接。

[代碼語言=“python”]
#!/usr/bin/python
# -*- 編碼:utf-8 -*-
導入 urllib.request
導入 urllib.parse
導入 urllib.error
從 bs4 導入 BeautifulSoup
導入 ssl
導入json
導入 ast
導入操作系統
from urllib.request 導入請求,urlopen

# 用於忽略 SSL 證書錯誤
ctx = ssl.create_default_context()
ctx.check_hostname = 假
ctx.verify_mode = ssl.CERT_NONE

# 用戶輸入
url = input('輸入雅虎金融公司網址-')
# 讓網站相信您正在使用 Mozilla 瀏覽器訪問它
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
網頁 = urlopen(req).read()
# 創建 HTML 頁面的 BeautifulSoup 對象,以便於提取數據。

湯= BeautifulSoup(網頁,'html.parser')
html = soup.prettify('utf-8')
company_json = {}
其他詳細信息 = {}
對於湯中的跨度.findAll('span',
attrs={'class': 'Trsdu(0.3s) Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(b)'
}):
company_json['PRESENT_VALUE'] = span.text.strip()
對於soup.findAll('div',attrs = {'class':'D(ib)Va(t)'})中的div:
對於 div.findAll('span', recursive=False) 中的跨度:
company_json['PRESENT_GROWTH'] = span.text.strip()
對於湯中的 td.findAll('td', attrs={'data-test': 'PREV_CLOSE-value'}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['PREV_CLOSE'] = span.text.strip()
對於湯中的 td.findAll('td', attrs={'data-test': 'OPEN-value'}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['OPEN'] = span.text.strip()
對於湯中的 td.findAll('td', attrs={'data-test': 'BID-value'}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['BID'] = span.text.strip()
對於湯中的 td.findAll('td', attrs={'data-test': 'ASK-value'}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['ASK'] = span.text.strip()
對於湯中的 td.findAll('td', attrs={'data-test': 'DAYS_RANGE-value'}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['DAYS_RANGE'] = span.text.strip()
對於湯中的 td.findAll('td',
attrs={'data-test': 'FIFTY_TWO_WK_RANGE-value'}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['FIFTY_TWO_WK_RANGE'] = span.text.strip()
對於湯中的 td.findAll('td', attrs={'data-test': 'TD_VOLUME-value'}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['TD_VOLUME'] = span.text.strip()
對於湯中的 td.findAll('td',
attrs={'data-test': 'AVERAGE_VOLUME_3MONTH-value'
}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['AVERAGE_VOLUME_3MONTH'] = span.text.strip()
對於湯中的 td.findAll('td', attrs={'data-test': 'MARKET_CAP-value'}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['MARKET_CAP'] = span.text.strip()
對於湯中的 td.findAll('td', attrs={'data-test': 'BETA_3Y-value'}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['BETA_3Y'] = span.text.strip()
對於湯中的 td.findAll('td', attrs={'data-test': 'PE_RATIO-value'}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['PE_RATIO'] = span.text.strip()
對於 soup.findAll('td', attrs={'data-test': 'EPS_RATIO-value'}) 中的 td:
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['EPS_RATIO'] = span.text.strip()
for td in soup.findAll('td', attrs={'data-test': 'EARNINGS_DATE-value'
}):
other_details['EARNINGS_DATE'] = []
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['EARNINGS_DATE'].append(span.text.strip())
對於湯中的 td.findAll('td',
attrs={'data-test': 'DIVIDEND_AND_YIELD-value'}):
other_details['DIVIDEND_AND_YIELD'] = td.text.strip()
對於湯中的 td.findAll('td',
attrs={'data-test': 'EX_DIVIDEND_DATE-value'}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['EX_DIVIDEND_DATE'] = span.text.strip()
對於湯中的 td.findAll('td',
attrs={'data-test': 'ONE_YEAR_TARGET_PRICE-value'
}):
對於 td.findAll('span', recursive=False) 中的跨度:
other_details['ONE_YEAR_TARGET_PRICE'] = span.text.strip()
company_json['OTHER_DETAILS'] = other_details
使用 open('data.json', 'w') 作為輸出文件:
json.dump(company_json, outfile, indent=4)
打印公司_json
使用 open('output_file.html', 'wb') 作為文件:
文件.write(html)
print '-----數據提取完成。 檢查json文件。——-'

[/代碼]

運行代碼並輸入公司 URL 後,您將在終端上看到打印的 json。 此 json 也將保存到文件夾中名為“data.json”的文件中。 對於 Microsoft,我們獲得了以下 JSON。

[代碼語言=“python”]
{
“PRESENT_GROWTH”:“+1.31 (+0.67%)”,
“PRESENT_VALUE”:“197.00”,
“PREV_CLOSE”:“195.69”,
“打開”:“196.45”,
“出價”:“196.89 x 900”,
“問”:“197.00 x 1400”,
“TD_VOLUME”:“18,526,644”,
“AVERAGE_VOLUME_3MONTH”:“29,962,082”,
“MARKET_CAP”:“928.91B”,
“BETA_3Y”:“0.91”,
“PE_RATIO”:“16.25”,
“EPS_RATIO”:“12.12”,
“EARNINGS_DATE”:[
“2019 年 4 月 30 日”
],
“DIVIDEND_AND_YIELD”:“2.92 (1.50%)”,
“EX_DIVIDEND_DATE”:“2019-02-08”,
“ONE_YEAR_TARGET_PRICE”:“190.94”
}
[/代碼]

對於最近多次虧損的蘋果來說,JSON 看起來是這樣的。

[代碼語言=“python”]

{
“PRESENT_VALUE”:“198.87”,
“PRESENT_GROWTH”:“-0.08 (-0.04%)”,
“其他詳情”: {
“PREV_CLOSE”:“198.95”,
“打開”:“199.20”,
“出價”:“198.91 x 800”,
“問”:“198.99 x 1000”,
“TD_VOLUME”:“27,760,668”,
“AVERAGE_VOLUME_3MONTH”:“28,641,896”,
“MARKET_CAP”:“937.728B”,
“BETA_3Y”:“0.91”,
“PE_RATIO”:“16.41”,
“EPS_RATIO”:“12.12”,
“EARNINGS_DATE”:[
“2019 年 4 月 30 日”
],
“DIVIDEND_AND_YIELD”:“2.92 (1.50%)”,
“EX_DIVIDEND_DATE”:“2019-02-08”,
“ONE_YEAR_TARGET_PRICE”:“193.12”
}
}

[/代碼]

您可以對任意數量的公司執行相同的操作,並且盡可能頻繁地保持更新。

2.爬蟲代碼解釋

和之前的網頁抓取代碼一樣,在這一次中,我們首先獲取了整個 HTML 文件。 由此,我們確定了具有我們需要的數據的特定標籤(具有特定類)。 此步驟是針對單個公司詳細信息頁面手動完成的。 一旦確定了特定的標籤及其各自的類,我們就使用我們的代碼使用漂亮的湯來取出這些標籤。

然後從這些標籤中的每一個,我們將必要的數據複製到一個名為 company_json 的變量中。 這是我們最終寫入名為 data.json 的 JSON 類型文件中的 json。 您可以看到我們還將抓取的 HTML 保存到本地內存中名為 output_file.html 的文件中。 這樣做是為了讓您可以自己分析 HTML 頁面並提出其他數據抓取 python 技術來抓取更多數據。

3. 我們捕獲的一些重要數據點

  • PREV_CLOSE:指股票上一交易日的收盤價。 股票的前一日價值僅指股票市場開市(非節假日)當天的最後收盤價。
  • OPEN:開盤價也簡稱Open,是股票在一個交易日的起始價。 例如,紐約證券交易所 (NYSE) 任何股票市場的開盤價都是東部時間上午 9:30 的價格。
  • BID & ASK:這兩個價格都是單一股票的報價。 出價是指買家願意支付的價格,而要價是賣家願意出售的價格。 乘數是指以各自價格掛牌交易的股票數量。
  • TD_VOLUME:這只是一天中易手的股票數量。
  • PE_RATIO:可能是投資者關注的最重要的單一因素,它是通過將公司股票的當前市場價格除以公司每股收益來計算的。 簡而言之,它是一個人準備為公司收益的每一盧比價值支付的金額。

我們解釋一些重要數據點的原因是,我們希望您知道您可以深入了解一家公司的財務狀況,只需從其雅虎財務頁面上抓取數據即可。

您可以從雅虎財經抓取哪些數據?

您將能夠使用此 Python 抓取工具抓取不同的數據點。 現值和目前的增長或下降百分比是最重要的。 其他數據點一起查看時,可以呈現更好的畫面,並幫助人們決定投資一家公司的股票是否是一個好主意。 不過,查看數據快照可能不會太有效。 從長遠來看,定期抓取數據並使用大數據集來預測股票的未來價格可能會更有用。

您可以抓取哪些其他財務數據?

我們抓取的財務數據來自雅虎財經中一家公司的摘要頁面。 每家公司還有一個圖表頁面,您可以在其中查看長達五年的股票數據。 雖然數據不是很結構化,但能夠抓取它可能會讓您很好地了解公司股票的歷史表現。

統計頁面為您提供了 30 多個不同的數據點,超過了我們捕獲的數據點。 這些是結構化格式,可以使用類似於我們提供的代碼進行抓取。

歷史數據包含來自圖表頁面的數據,但格式類似於 CSV——您可以輕鬆提取數據並將其存儲在 CSV 中。 其他頁面,如簡介、財務、分析、期權、持有人和可持續性,可能會讓您很好地估計公司股票與競爭對手相比的表現。

雅虎財經數據使用案例

您可以使用歷史數據來預測股票價格,或者您可以創建一個應用程序,使用來自您的抓取引擎的定期更新數據為用戶提供更新。 您可以推薦什麼時候應該賣出他們的股票,或者什麼時候應該買入更多——可能性是無窮無盡的!

如果您有一個小團隊並且無法決定如何開始進行網絡抓取,您可以尋求像 PromptCloud 這樣有責任心且經驗豐富的網絡抓取團隊的幫助。 我們的網絡抓取需求收集儀表板使提交需求、獲取報價以及最終以即插即用格式獲取數據成為一個簡單而直接的過程。


在提取網絡數據方面需要幫助?

通過我們的網絡抓取服務,從用於業務應用程序的網站獲取乾淨且隨時可用的數據。

哎呀! 我們找不到您的表格。

免責聲明:本教程中提供的代碼僅用於學習目的。 我們不對它的使用方式負責,也不對源代碼的任何有害使用承擔任何責任。