让 Mechanize 也能 “跑”javascript

 

由于工作方面的需要,让我对 mechanize 爱不择手。
但是 mechanize 也有她的缺点,她不能解释网页中的 javascript代码。
可是就在某一天里,我有了一个不小的发现。

我记得我需要做的是一个自动登陆,这对于 mechanize 来说轻而易举事。而事实却并非想像的那样简单。
原因是,在登陆的 submit 被点下时,网页中的 javascript 却将原来的 action 值给“掉包”了。

<html>
<head>
<title>sample</title>
</head>


<body>
function validateForm() {
  var elm = document.getElementById('postForm');
  elm.action = './write.php';
  return true;
}


<form action="javascript.php" method="post" onSubmit="return validateForm();">
<input type="text" name="user" value=""> 
<input type="text" name="pass" value="">
<input type="submit" name="submit" value="登陆">

</form>


</body>
</html>
 

我记得在 mechanize 里是可以对 action 进行赋值的,所以就很简单的解决了这个问题。

require 'rubygems'
gem 'mechanize', '0.8.5'
require 'mechanize'


# 生成模拟浏览器

agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 7'

# 抓取网页源码

page = agent.get('http://www.sample.com/')

# 添写 form 信息

form = page.forms.action('javascript.php').first
form.action = './write.php'
form['user'] = 'user_id'
form['pass'] = 'user_pass'

form.submit
 

通过这个例子,让我有一想法: 
如果将 javascript 代码的动作, 用 mechanze 模拟出来的话,是不是 mechanize 就可以 “跑” javascript 呢? 
很幸运,接下来我就遇到这样的问题。

在浏览器里看到的 form 完全是用 javascript 生成的。
用以往的 mechanize 抓取 form 信息, 返回的结果是 nil 。

好, 使用刚刚得来的经验, 用 mechanze 模拟 javscript 来生成 form 的代码(需要解读 javascrpit ,找出
form 的 action 值, 以及相关标签的 name 信息)。

require 'rubygems'
gem 'mechanize', '0.8.5'
require 'mechanize'


# 生成模拟浏览器

agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 7'

# 抓取网页源码
page = agent.get('http://www.sample.com/')

# 将 javascript 解读出 form 信息模拟成 html 代码

form_code = "<form action='javascript.php' method='post' name='form1'>" +               
                    "<input type='text' name='user' value=''>" +
                    "<input type='text' name='pass' value=''>" +
                    "<input type='submit' name='submit' value='登陆'>"

# 向 body 标签内强制添加 form 信息 
page.root.search("body").inner_html += form_code

# 抓取 form 信息
form = page.forms.name('form1').first 
p form
 

只要是 form 信息找对了,完美的实现了登陆动作,不过~!?

不过,我对 javascript 可不是太了解。
现在的网站, javascrpit 脚本动则就上百行,哪一部分才是自已需要的,分析起来很是花时间。

由是,我的完美方案出现了,哈~!

不必在成堆的 javascrpit 代码里去查找自已所需要的登陆信息了。

利用 firefox 插件 live http headers 将向服务器提交表单,的数据瞬间的抓取出来。

header代码:



http://www.sample.com/write.php


POST /write.php HTTP/1.1
Host: sample.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://www.sample.com/
Content-Type: application/x-www-form-urlencoded
Content-Length: 47


user=user_id&pass=user_pass
 

这样就达到了不必去解读 javascript 了。无论 javascript 怎么变, 向服务器提交时的数据一定是最真实的。

以上是个人在工作中的一些小总结。希望能给需要的人带去帮助。

同时,小弟正在查找一起有关 ruby mechanize 对 cookie 进行操作的资料,
如果那位哥们儿手里正好有有关资料的话,希望能共享一下。
先谢谢啦~!
 






 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值