如何使用由Javascript函数生成的Ruby刮取数据?

如何使用由Javascript函数生成的Ruby刮取数据?,javascript,ruby,nokogiri,scrape,Javascript,Ruby,Nokogiri,Scrape,我试图从页面中的最新日期(表的第一行)中获取数据URL链接。表的内容似乎是由JavaScript函数生成的 我尝试使用Nokogiri来获取它,但Nokogiri无法获取JavaScript。然后,我尝试仅使用Nokogiri获取脚本部分,使用: url = "http://www.sgx.com/wps/portal/sgxweb/home/marketinfo/historical_data/derivatives/daily_data" doc = Nokogiri::

我试图从页面中的最新日期(表的第一行)中获取数据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,下面是您需要做的一些事情,但是实际使用它仍然需要做一些工作:

  • 从以下代码开始:

    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'>"
    
    数据
    来自被调用函数的参数,因此我们从这里开始

  • 获取包含函数名的唯一部分
    loadGridns\uu
    并搜索它。每次找到它时,都要查找参数
    data
    ,然后查看
    data
    的定义位置。如果它被传递到该方法中,则搜索以查看调用它的内容。重复这个过程,直到您发现变量没有传递到函数中,这时您就知道您使用的是创建它的方法

  • 我发现自己在一个以
    loadGridDatans
    开头的函数中,它是执行
    xhrPost
    调用以检索URL的块的一部分。该URL是您要查找的目标,因此请获取包含函数的名称,并在传递URL的调用中循环,就像您在上述步骤中所做的那样

  • 搜索结果显示如下所示:

    var url = viewByDailyns_7_2AA4H0C090FIE0I1OH2JFH20K1_...
    
  • 此时,您可以开始重建所需的URL。打开一个JavaScript调试器,如Firebug,并在该行上放置一个断点。重新加载页面,JavaScript将在该行停止执行。单步执行,或设置断点,并观察
    url
    变量的创建,直到其最终形式。此时,您可以在
    OpenURI
    中使用一些东西,这些东西应该可以检索您想要的JSON

  • 注意,它们的函数名可能是动态生成的;我没有检查以查看,因此尝试使用函数的全名可能会失败

    他们还可能序列化日期时间戳,或者使用序列化的会话键使函数名唯一/更不透明,这样做的原因有很多


    尽管分解这些东西很痛苦,但这也是动态页面如何工作的一个很好的教训。

    您必须以某种方式运行页面,让它动态生成,然后将DOM作为HTML使用Nokogiri进行解析。您还需要另一种技术,如无头浏览器:PhantomJS在这一点上祝您好运。要么是故意混淆代码,要么是实施此操作的开发人员有非常非常复杂的代码mind@tihom,对于使用JavaScript的代码,Mechanize只做Nokogiri,因为Mechanize的核心是Nokogiri。为此,有两种选择,使用WATIR驱动的浏览器或JavaScript解释器,或者手工输入并跟踪代码,以确定如何生成检索JSON的URL。
    var url = viewByDailyns_7_2AA4H0C090FIE0I1OH2JFH20K1_...