2016-02-27 126 views
1

我想從下面的晨星網站抽取數據:Webscraping財務數據來自晨星

http://financials.morningstar.com/ratios/r.html?t=IBM&region=USA&culture=en_US

我目前要做的只是IBM,但希望最終能在別人的代碼輸入公司,並對此做同樣的事情。到目前爲止我的代碼低於:

import requests, os, bs4, string 



url = 'http://financials.morningstar.com/ratios/r.html?t=IBM&region=USA&culture=en_US'; 
fin_tbl =() 


page = requests.get(url) 

c = page.content 

soup = bs4.BeautifulSoup(c, "html.parser") 


summary = soup.find("div", {"class":"r_bodywrap"}) 

tables = summary.find_all('table') 

print(tables[0]) 

的問題,我目前正在經歷一個不同的網頁更簡單我已經颳了程序似乎無法找到任何表,即使我能看到他們在爲HTML這一頁。

在研究這個問題最近計算器的問題是下面:

Python webscraping - NoneObeject Failure - broken HTML?

在一個他們解釋說,晨星公司的表是動態加載和使用的一些JSON代碼,我不熟悉,不知何故產生一個不同的網絡鏈接哪些設法颳了數據,但我不明白它來自哪裏?

感謝

回答

2

這是刮一些現代的網頁,特別是對單頁面應用程序(其中內容是由AJAX調用和DOM修改保持生成的頁面,而不是交付的現成去HTML的一個現實問題在單個服務器響應中)。

我發現訪問此類內容的最佳方式是使用Selenium Web測試環境讓瀏覽器在我的程序控制下加載頁面,然後從Selenium中提取頁面內容進行刮擦。還有其他的環境會執行腳本並適當地修改DOM,但我沒有使用它們中的任何一個。

它並不像聽起來那麼難,但它會帶你一點點跳槽到達那裏。

+0

嘿holdenweb,謝謝你們,我在過去曾經和Selenium一起玩過,並且可能會仔細研究一下。當我開始考慮這個問題時,我曾考慮過這個問題,但我的主要預測是,據我所知,Selenium不能在後臺運行。但是根據你和其他人對現代網頁所說的直接HTML和HTML的不斷變化,可能值得看看它。謝謝! – user5841014

1

當網站提供API時,網站抓取可以大大簡化,無論是官方支持還是非官方攻擊。即使是黑客比試圖擺弄每天都會改變的HTML都要好。

因此,尋找morningstar api可能是富有成效的。而且,事實上,一些友善的戈爾斯特has already worked this out for you

如果搜索沒有結果,通常富有成效的方法是調查ajax調用頁面正在執行的操作來檢索數據,然後直接發佈它們。這可以通過瀏覽器調試器,選項卡「網絡」來實現,或者可以在非常友好的用戶界面中詳細調查每個請求。

+0

嘿flaschbier,感謝您發現API,我將不得不仔細看看它們。這將解決我眼前的問題,但我也希望將此作爲一個機會,通過將其用作項目來了解更多關於網絡瀏覽的信息。我查看了你所建議的API,但找不到任何解釋背景中發生的事情。 – user5841014

+0

鑑於你的最後一段,我從來沒有看過頁面如何檢索數據,也不知道從哪裏開始。我使用Chrome有沒有任何材料或教程可以推薦作爲對此的介紹?謝謝 – user5841014

+0

不是。有[文檔](https://developer.chrome.com/devtools),但我從來沒有讀過它。也許我應該有,但只要按下'F12',切換到'網絡'選項卡,重新加載頁面,看看已經發生了什麼。 (點擊您查看請求詳細信息的網址;) – flaschbier

0

我發現通過JavaScript比使用Python + Selenium動態網站更容易。有一個偉大的模塊nodejs/phantomjsScraperJS。它使用起來非常簡單:它將jQuery注入到抓取的頁面中,並且可以使用jQuery選擇器提取數據。

+0

謝謝亞歷山大我從來沒有使用過java,但必須檢查它是否值得您學習 – user5841014