5

https://web.apps.markit.com/WMXAXLP?YYY2220_zJkhPN/sWPxwhzYw8K4DcqW07HfIQykbYMaXf8fTzWT6WKnuivTcM0W584u1QRwjから値を取得するプログラムがあり ます。

私の現在のコードは次のとおりです。

doc = Nokogiri::HTML(open(source_url))

puts doc.css('span.indexDate').text
date = doc.css('span.indexDate').text
date = Date.parse(date)
puts date
values = doc.css('table#CdsIndexTable td.col2 span')
puts values

これにより、「CDS Indexes」テーブルの 2 番目の列の日付と値が正しく取得されます。これは問題ありません。ここで、問題に直面している「Bond Indexes」テーブルから同様の値を取得したいと考えています。

ページをロードせず、ページの URL を変更せずに、JavaScript 関数がそれを変更することがわかります。これら 2 つのテーブルの違いは、ID が異なることです。しかし、残念ながら私が試してみると:

values = doc.css('table#BondIndexTable')
puts values

Bond Indexes テーブルから何も得られません。ただし、次を使用すると、CDS Indexes テーブルから値を取得します。

values = doc.css('table#CdsIndexTable')
puts values

両方のテーブルから値を取得するにはどうすればよいですか?

4

3 に答える 3

15

Poltergeist ドライバーで Capybara を使用して、Javascript を実行し、ページをフォーマットできます。Poltergeist は、PhantomJS ヘッドレス ブラウザーのラッパーです。これを行う方法の例を次に示します。

require 'rubygems'
require 'capybara'
require 'capybara/dsl'
require 'capybara/poltergeist'

Capybara.default_driver = :poltergeist
Capybara.run_server = false

module GetPrice
  class WebScraper
    include Capybara::DSL

    def get_page_data(url)
      visit(url)
      doc = Nokogiri::HTML(page.html)
      doc.css('td.col2 span')
    end
  end
end

scraper = GetPrice::WebScraper.new
puts scraper.get_page_data('https://web.apps.markit.com/WMXAXLP?YYY2220_zJkhPN/sWPxwhzYw8K4DcqW07HfIQykbYMaXf8fTzWT6WKnuivTcM0W584u1QRwj').map(&:text).inspect

Amazon.com を使用した完全な例については、 https ://github.com/wakproductions/amazon_get_price/blob/master/getprice.rb をご覧ください。

于 2013-12-26T20:59:23.990 に答える
5

PhantomJS を使用したくない場合は、Firefox または Chrome 開発ツールでネットワーク スニファーを使用することもできます。HTML テーブル データが JavaScript POST 要求でサーバーに返されることがわかります。

次に、Nokogiri で元のページ URL を開く代わりに、Ruby スクリプトからこの POST を実行し、代わりにそのデータを解析して解釈します。HTMLが埋め込まれた単なるJSONデータのようです。HTML を抽出して Nokogiri にフィードできます。

少し追加の検出作業が必要ですが、私はこの方法を JavaScript Web ページとスクレイピングで何度も使用しました。ほとんどの単純なタスクでは問題なく機能しますが、ページとネットワーク トラフィックの内部の仕組みを少し掘り下げる必要があります。

Javascript POST リクエストからの JSON データの例を次に示します。

債券:
https://web.apps.markit.com/AppsApi/GetIndexData?indexOrBond=bond&ClientCode=WSJ

CDS :
https://web.apps.markit.com/AppsApi/GetIndexData?indexOrBond=cds&ClientCode=WSJ

アイデアを得るための簡単で汚い解決策を次に示します。これは、最初のページから Cookie を取得し、それをリクエストで使用して JSON データを取得し、JSON データを解析して、抽出された HTML を Nokogiri にフィードします。

require 'rubygems'
require 'nokogiri'
require 'open-uri'
require 'json'

# Open the initial page to grab the cookie from it
p1 = open('https://web.apps.markit.com/WMXAXLP?YYY2220_zJkhPN/sWPxwhzYw8K4DcqW07HfIQykbYMaXf8fTzWT6WKnuivTcM0W584u1QRwj')

# Save the cookie
cookie = p1.meta['set-cookie'].split('; ',2)[0]

# Open the JSON data page using our cookie we just obtained
p2 = open('https://web.apps.markit.com/AppsApi/GetIndexData?indexOrBond=bond&ClientCode=WSJ',
          'Cookie' => cookie)

# Get the raw JSON
json = p2.read

# Parse it
data = JSON.parse(json)

# Feed the html portion to Nokogiri
doc = Nokogiri.parse(data['html'])

# Extract the values
values = doc.css('td.col2 span')
puts values.map(&:text).inspect

=> ["0.02%", "0.02%", "n.a.", "-0.03%", "0.02%", "0.04%", 
    "0.01%", "0.02%", "0.08%", "-0.01%", "0.03%", "0.01%", "0.05%", "0.04%"]
于 2012-11-13T16:58:28.630 に答える
1

PhantomJSは、JavaScriptAPIを備えたヘッドレスブラウザです。スクレイピングしているページでスクリプトを実行する必要があるため、ブラウザがそれを実行します。PhantomJSを使用すると、スクリプトの実行後にページを操作およびスクレイプできます。

于 2012-11-13T16:34:21.093 に答える