如何使用由Javascript函数生成的Ruby刮取数据?
我试图从页面中的最新日期(表的第一行)中获取数据URL链接。表的内容似乎是由JavaScript函数生成的 我尝试使用Nokogiri来获取它,但Nokogiri无法获取JavaScript。然后,我尝试仅使用Nokogiri获取脚本部分,使用:如何使用由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 = "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
变量的创建,直到其最终形式。此时,您可以在OpenURI
中使用一些东西,这些东西应该可以检索您想要的JSON尽管分解这些东西很痛苦,但这也是动态页面如何工作的一个很好的教训。您必须以某种方式运行页面,让它动态生成,然后将DOM作为HTML使用Nokogiri进行解析。您还需要另一种技术,如无头浏览器:PhantomJS在这一点上祝您好运。要么是故意混淆代码,要么是实施此操作的开发人员有非常非常复杂的代码mind@tihom,对于使用JavaScript的代码,Mechanize只做Nokogiri,因为Mechanize的核心是Nokogiri。为此,有两种选择,使用WATIR驱动的浏览器或JavaScript解释器,或者手工输入并跟踪代码,以确定如何生成检索JSON的URL。
var url = viewByDailyns_7_2AA4H0C090FIE0I1OH2JFH20K1_...