Automate interaction with websites using MechanizeJanuary 9, 2008 – 4:44 pm
其实我是在寻找 Ruby 里面处理 Cookie 的库的时候找到它的。学校的网络以前是要先通过一个 Web 页面登录才能上网的(可恶的电信!),早就有前辈们写了上网登录脚本,方便使用(事实上在 Linux 下想要使用学校提供的 201+ 卡方式访问校外网的话,只有用登陆脚本了,电信提供的 IE 插件根本没法用)。可是脚本是用 perl 写的,我倒是不想为了上网自动登录大费周章地去装一个 Perl (在 Windows 下),不过倒是装了 Ruby ,便想自己写一个吧。 看了那个 Perl 脚本,又抓了写包看了看,好像挺麻烦的,有重定向、还要处理 Cookie ,Ruby 标准库 粗略地扫描了下他的 README ,便开始在 IRB 里做实验,先 require 'rubygems' 打开登录页面: page = agent.get('http://61.175.164.14:8880/webLogin.jsp') 可是出错了: WWW::Mechanize::ResponseCodeError: 403 => Net::HTTPForbidden 唉!这都是那可恶的电信,居然还判断 agent.user_agent_alias = 'Windows Mozilla' 这下页面获取到手了,从 IRB 的输出就可以看到里面有一个简单的 form ,只有一个字段 form = page.form('mainform') 这下得到了一个好长的页面,里面有一个超级大的 form (还是叫做 form = page.form('mainform') 再返回的页面里面已经没有 form 了,出问题了?不是!打开浏览器,发现已经可以上网了! Mechanize 确实很好用啊,比传统的用于处理 web
页面的脚本抽象了更多的东西,让我们可以更加专注于需要关注的东西,而不用去处理细枝末节了。下面分别是用 Mechanize 做的 Ruby
脚本和原本的 Perl 脚本,从长度就可以看出来差别了,而且 Ruby 脚本应该是更易懂的
然后是 Perl 版的脚本:
可以看到用传统的方法的话,需要抓包分析,而且许多事情需要手工来做,比如一个 form 的内容通常需要全部填写(看 Perl
脚本里面的那个巨大的 form )。如果是使用浏览器的话,许多工作就没有了,浏览器会自动跟踪重定向,而且隐藏的 form
字段也不会显示出来让你全部填写,而 Mechanize 的工作方式更像浏览器一点:打开登录页面、填上用户名和密码、提交!当然会方便许多了! |
