2012-08-03 84 views
4

我已經到了使用Javascript和Python3進入網頁抓取網頁的混戰時刻。我很清楚,我的靴子可能會與一匹死馬接觸,但我仍然想要畫出我的六射手。這是西方的意大利麪條;成爲我的灰色帽子?Python 3,網絡抓取和Javascript [Oh My]

::背景故事::

我使用Python 3.2.3。

我有興趣爲YTD,1年,3年,5年10年和/或用戶定義股票的類似時間範圍收集歷史股票// etf // mutual_fund價格數據,ETF或共同基金。我在Morningstar.com上設置了我的網站,因爲他們傾向於提供儘可能多的數據,而不一定要求登錄;其他人如finance.google.com & c往往在他們提供的有關股票vs ETF vs共同基金的數據方面不一致。

使用晨星作爲這一歷史數據的權衡,或稱之爲「追蹤總收益」,就是爲了生成這些數據,他們使用Javascript。

以下是晨星一些示例鏈接:

A Mutual Fund;

An ETF;

A Stock.

我感興趣 「後返回」 部分,上排左右的號碼中Javascript製作的圖表。

::試圖到目前爲止::

我已經證實了wget不使用Javascript玩;即使下載所有相關文件[css,.js,& c]也不允許我在瀏覽器或腳本中本地呈現javascript。在這裏研究StackOverflow證實了這一點。我願意在這裏糾正。

我的研究告訴我機械化不存在Python3。無論如何,我試了一下,然後變成了Javert警察喊出「我知道!」在錯誤消息「模塊不存在」。

::我聽說過... ::

- >硒。然而,我的理解是,這需要Thy Favorite Browser實際打開一個網頁,四處瀏覽,然後不關閉,因爲Selenium沒有「關閉此選項卡//窗口」命令//選項。如果我// my_user想要​​獲取許多ETF,股票和/或共同基金的歷史數據,該怎麼辦?這是很多標籤//窗口在瀏覽器中打開,不一定需要打開。

- > httplib2。我認爲這很好,但我懷疑它是否會使用Javascript。是否,例如使用.cache和get選項?

import httplib2 
conn = httplib2.Http(".cache") 
page = conn.request(u"http://the_url","GET") 

- >風車。參見'Selenium'。然而,我卻不夠關鍵唱「拉曼恰之人」。

- > Google的webscraping代碼。試圖下載一個Javascript載入的頁面會導致...積極的結果嗎?

我讀過關於必須「不使用瀏覽器模擬瀏覽器」的喋喋不休的問題。聽起來像機械化,但不是我目前所瞭解的Python3。

::我的問題::

任何建議,指針,解決方案,或者 「看過來」 的方向?

非常感謝,

Miles,Dusty Desert Villager。

+0

通過使用沒有任何會話cookie檢查的Ajax請求,至少過濾來自其他域的請求,他們使用JavaScript做基本上使你的工作真的很容易。 – 2012-08-03 23:52:49

回答

11

當頁面通過JavaScript加載數據時,它必須通過XMLHttpRequest函數(XHR)向服務器發送請求以獲取該數據。你可以看到他們正在製作什麼請求,然後使用wget自己製作它們!

要了解他們正在製作哪些請求,請使用Web Inspector(Chrome和Safari)或Firebug(Firefox)。以下是Chrome中的操作方法:

扳手/工具/開發人員工具/網絡(工具頂部的選項卡)/底部的XHR過濾器。

Here's an example request they make in javascript

如果在XHR請求URL仔細觀察,您會發現所有尾隨回報具有相同的格式:

http://performance.morningstar.com/Performance/cef/trailing-total-returns.action?t=

你只需要指定t。例如:

http://performance.morningstar.com/Performance/cef/trailing-total-returns.action?t=VAW http://performance.morningstar.com/Performance/cef/trailing-total-returns.action?t=INTC http://performance.morningstar.com/Performance/cef/trailing-total-returns.action?t=VHCOX

現在你可以wget這些URI並直接解析出數據。

+3

我需要停止點嫖娼。這對於原來的答案的評論基本上是正確的:「Chrome使得查看XHR請求非常容易。」開發人員工具(扳手或右鍵單擊/檢查元素)/網絡(選項卡在工具)/底部的XHR過濾器。「 – 2012-08-03 23:42:02

+1

通過XHR,他意味着來自JS的http請求。或者Ajax,如果你必須。 (我寧願我們沒有)。所有你必須刮的是桌子和JSON。不錯。 – 2012-08-03 23:47:44

+1

謝謝Erik! :)我會修改我的答案,以便更清楚。以前在Chrome中沒有使用過開發工具的人不太容易理解。 – 2012-08-03 23:49:42