由于工作方面的需要,让我对 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 将向服务器提交表单,的数据瞬间的抓取出来。
这样就达到了不必去解读 javascript 了。无论 javascript 怎么变, 向服务器提交时的数据一定是最真实的。
以上是个人在工作中的一些小总结。希望能给需要的人带去帮助。
同时,小弟正在查找一起有关 ruby mechanize 对 cookie 进行操作的资料,
如果那位哥们儿手里正好有有关资料的话,希望能共享一下。
先谢谢啦~!
分享到:
相关推荐
ruby mechanize包,mechanize-2.7.3.gem
ruby mechanize 2.7.2 gem 包
Mechanize自动存储和发送Cookie,跟随重定向,跟随链接并提交表单。 可以填写和提交表单字段。 机械化还可以将您曾经访问过的站点作为历史记录进行跟踪。入门在根文件夹中,您可以运行get_page示例: node examples...
Mechanize相关资料
multi-mechanize-master
ruby mechanize安装需要的gem包,安装需要的本地gem文件
Mechanize 一个让自动化web交互变得容易的ruby库
用python成为顶级黑客,第三方库必备,mechanize网络爬虫
mechanize-源码.rar
Ruby中实现网页抓取,一般用的是mechanize,使用非常简单。 安装 代码如下: sudo gem install mechanize 抓取网页 代码如下: require ‘rubygems’ require ‘mechanize’ agent = Mechanize.new page = agent.get...
www-mechanize-firefox:WWW :: Mechanize的API,结合了Firefox的Javascript功能
机械化描述Mechanize库用于自动与网站进行交互。 Mechanize自动存储和发送Cookie,遵循重定向,并可以遵循链接和提交表单。 可以填写和提交表单字段。 机械化还可以将您曾经访问过的站点作为历史记录进行跟踪。依存...
mechanize是对urllib2的部分功能的替换,能够更好的模拟浏览器行为,在web访问控制方面做得更全面。结合beautifulsoup和re模块,...其实只用默认的设置也可以完成基本任务。 #!/usr/bin/env python import sys,mecha
Mechanize¶↑docs.seattlerb.org/mechanize github.com/sparklemotion/mechanize描述¶↑Mechanize库用于自动与网站交互。 Mechanize自动存储和发送coo Mechanize¶↑docs.seattlerb.org/mechanize github....
python mechanize可以方便的模拟URL的访问,测试时的必要工具。
import mechanize import cookielib # Browser br = mechanize.Browser() # Cookie Jar cj = cookielib.LWPCookieJar() br.set_cookiejar(cj) # Browser options br.set_handle_equiv(True) br.set_handle_gzip(True...
WWW-Mechanize-Chrome:自动化Chrome浏览器
# Browserbr = mechanize.Browser()br.set_cookiejar(cj) # Browser optionsbr.set_handle_equiv(True)br.set_handle_gzip(True)br.set_handle_redirect(True)br.set_handle_referer(True)br.se