我尝试获取网页的HTML代码,但网络包含一些javascript代码,这些代码可以生成一些我需要的数据。
http = Net::HTTP.new('localhost')
path = '/files.php'
# POST request -> logging in
data = ''
headers = {
'Referer' => 'http://localhost:8080/files.php',
'User-Agent' => 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0',
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language' => 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
'Content-Encoding' => 'gzip, deflate',
'Connection' => 'keep-alive',
'Cookie' => ''
}
resp, data = http.post(path, data, headers)
puts resp.body
Run Code Online (Sandbox Code Playgroud)
但这只会返回html而不会评估javascript。我想在评估页面的javascript之后得到最终的html。
假设:您的 Javascript 位于页面上的单个标记中。否则你将不得不通过解析来寻找你想要的每一位js。你想要的 gem 叫做“therubyracer”,它将 google 的 v8 javascript 执行引擎嵌入到你的 ruby 中。
转到命令行并安装 therubyracer
gem install therubyracer
Run Code Online (Sandbox Code Playgroud)
然后:
require 'v8'
data = ''
headers = {
'Referer' => 'http://localhost:8080/files.php',
'User-Agent' => 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0',
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language' => 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
'Content-Encoding' => 'gzip, deflate',
'Connection' => 'keep-alive',
'Cookie' => ''
}
resp, data = http.post(path, data, headers)
js = resp[resp.index('<script')..resp.index('</script>')]
js = js[js.index('/>')..-1]
cxt = V8::Context.new
result = cxt.eval(js)
puts result
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1087 次 |
| 最近记录: |