簡體   English   中英

如何使用由 Javascript 函數生成的 Ruby 抓取數據?

[英]How to scrape data using Ruby which is generated by a Javascript function?

我想刮從最新的日期,這是該表的第一行,從數據的URL鏈接頁面。 表格的內容似乎是由 JavaScript 函數生成的。

我嘗試使用 Nokogiri 來獲取它,但 Nokogiri 無法抓取 JavaScript。 然后,我嘗試僅使用 Nokogiri 獲取腳本部分:

url = "http://www.sgx.com/wps/portal/sgxweb/home/marketinfo/historical_data/derivatives/daily_data"
doc = Nokogiri::HTML(open(url))
js = doc.css("script").text
puts js

在輸出中,我找到了我想要的類名sgxTableGrid的表。 但是,問題是 JavaScript 函數中沒有關於數據 URL 鏈接的線索,並且一切都是動態生成的。

有人知道解決這個問題的更好方法嗎?

查看該頁面的 HTML,該表是由作為 JavaScript 請求結果接收到的 JSON 生成的。

您可以通過向后追溯頁面的源代碼來弄清楚發生了什么。 如果您想在 JavaScript 之外檢索 JSON,則需要以下一些內容,但仍然需要做一些工作來實際使用它:

  1. 從這段代碼開始:

     require 'open-uri' require 'nokogiri' doc = Nokogiri::HTML(open('http://www.sgx.com/wps/portal/sgxweb/home/marketinfo/historical_data/derivatives/daily_data')) scripts = doc.css('script').map(&:text) puts scripts.select{ |s| s['sgxTableGrid'] }

    在編輯器中查看文本輸出。 搜索sgxTableGrid 你會看到這樣一行:

     var tableHeader = "<table width='100%' class='sgxTableGrid'>"

    再往下看一點,你會看到:

     var totalRows = data.items.length - 1;

    data來自被調用函數的參數,這就是我們開始的地方。

  2. 獲取包含函數名稱loadGridns_的唯一部分並搜索它。 每次找到它,查找參數data ,然后查看data定義的位置。 如果它被傳遞到該方法中,那么搜索以查看調用它的內容。 重復這個過程,直到你發現變量沒有被傳遞到函數中,那時你就會知道你在創建它的方法上。

  3. 我發現自己在一個以loadGridDatans開頭的函數中,它是執行xhrPost調用以檢索 URL 的塊的一部分。 該 URL 是您要查找的目標,因此獲取包含函數的名稱,並循環傳遞傳入 URL 的調用,就像您在上述步驟中所做的那樣。

  4. 該搜索最終出現在如下所示的行上:

     var url = viewByDailyns_7_2AA4H0C090FIE0I1OH2JFH20K1_...
  5. 此時,您可以開始重建所需的 URL。 打開一個 JavaScript 調試器,比如 Firebug,並在該行上放置一個斷點。 重新加載頁面,JavaScript 應該會在該行停止執行。 單步執行,或設置斷點,並觀察創建的url變量,直到它處於最終形式。 那時,您可以在OpenURI使用一些東西,它應該檢索您想要的 JSON。

注意,它們的函數名可能是動態生成的; 我沒有查看,所以嘗試使用函數的全名可能會失敗。

他們也可能正在序列化日期時間戳或使用序列化的會話密鑰以使函數名稱唯一/更不透明,這樣做的原因有很多。

盡管把這些東西拆開很痛苦,但它也是關於動態頁面如何工作的一個很好的教訓。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM