由于工作方面的需要,让我对 mechanize 爱不择手。
但是 mechanize 也有她的缺点,她不能解释网页中的 javascript代码。
可是就在某一天里,我有了一个不小的发现。
我记得我需要做的是一个自动登陆,这对于 mechanize 来说轻而易举事。而事实却并非想像的那样简单。
我记得我需要做的是一个自动登陆,这对于 mechanize 来说轻而易举事。而事实却并非想像的那样简单。
原因是,在登陆的 submit 被点下时,网页中的 javascript 却将原来的 action 值给“掉包”了。
通过这个例子,让我有一想法:
不过,我对 javascript 可不是太了解。
<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 生成的。
在浏览器里看到的 form 完全是用 javascript 生成的。
用以往的 mechanize 抓取 form 信息, 返回的结果是 nil 。
只要是 form 信息找对了,完美的实现了登陆动作,不过~!?
好, 使用刚刚得来的经验, 用 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 代码里去查找自已所需要的登陆信息了。
由是,我的完美方案出现了,哈~!
不必在成堆的 javascrpit 代码里去查找自已所需要的登陆信息了。
利用 firefox 插件 live http headers 将向服务器提交表单,的数据瞬间的抓取出来。
这样就达到了不必去解读 javascript 了。无论 javascript 怎么变, 向服务器提交时的数据一定是最真实的。
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 进行操作的资料,
如果那位哥们儿手里正好有有关资料的话,希望能共享一下。
先谢谢啦~!