`
diyuxinlang
  • 浏览: 31128 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

让 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 进行操作的资料,
如果那位哥们儿手里正好有有关资料的话,希望能共享一下。
先谢谢啦~!
 






 


 

分享到:
评论
14 楼 Hooopo 2010-05-08  
huacnlee 写道
这玩意儿好啊,上次我用它帮人做一个采集功能,两晚上就完成,转了1K

....
13 楼 huacnlee 2010-05-07  
这玩意儿好啊,上次我用它帮人做一个采集功能,两晚上就完成,转了1K
12 楼 jy00105276 2010-05-06  
chrishzb 写道
diyuxinlang 写道
marshluca 写道
"page.root.search("body").inner_html += form_code"

在mechanize 0.9.4中好像不能硬着来吧.



因为在 mechanize 0.9.0 以上版本中默认的是用 nokogiri 来解析 HTML。
如果想使用 hpricot 的话,得先声明。

例:


require 'rubygems'  
gem 'mechanize', '0.9.3'  
require 'mechanize'  
require 'hpricot'


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



同问一下, 跟楼上这位兄弟有同样的疑惑,nokogiri 如何强行给body 加代码呢?


强行加代码,mechanize低版本默认用hpricot解析html,有inner_html=方法。
为什么加了form可以提交,估计是mechanize封装的net/http库发送post请求?
11 楼 chrishzb 2010-05-06  
diyuxinlang 写道
marshluca 写道
"page.root.search("body").inner_html += form_code"

在mechanize 0.9.4中好像不能硬着来吧.



因为在 mechanize 0.9.0 以上版本中默认的是用 nokogiri 来解析 HTML。
如果想使用 hpricot 的话,得先声明。

例:


require 'rubygems'  
gem 'mechanize', '0.9.3'  
require 'mechanize'  
require 'hpricot'


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



同问一下, 跟楼上这位兄弟有同样的疑惑,nokogiri 如何强行给body 加代码呢?
10 楼 marshluca 2010-02-26  
diyuxinlang 写道
marshluca 写道
"page.root.search("body").inner_html += form_code"

在mechanize 0.9.4中好像不能硬着来吧.



因为在 mechanize 0.9.0 以上版本中默认的是用 nokogiri 来解析 HTML。
如果想使用 hpricot 的话,得先声明。

例:


require 'rubygems'  
gem 'mechanize', '0.9.3'  
require 'mechanize'  
require 'hpricot'


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



我的意思是怎么把定制的form强加给  page.body

你最后不还是用mechanize去登陆form吗
9 楼 diyuxinlang 2010-02-26  
鹤惊昆仑 写道
firefox有个插件(https://addons.mozilla.org/en-US/firefox/addon/8154)可以把cookie导出,wget、python都可以直接利用该文件通过网站登录验证。


哈,这个插件挺有意思的,收藏了~!谢谢啦~!
8 楼 鹤惊昆仑 2010-02-25  
firefox有个插件(https://addons.mozilla.org/en-US/firefox/addon/8154)可以把cookie导出,wget、python都可以直接利用该文件通过网站登录验证。
7 楼 diyuxinlang 2010-02-23  
marshluca 写道
"page.root.search("body").inner_html += form_code"

在mechanize 0.9.4中好像不能硬着来吧.



因为在 mechanize 0.9.0 以上版本中默认的是用 nokogiri 来解析 HTML。
如果想使用 hpricot 的话,得先声明。

例:


require 'rubygems'  
gem 'mechanize', '0.9.3'  
require 'mechanize'  
require 'hpricot'


WWW::Mechanize.html_parser = Hpricot 
agent = WWW::Mechanize.new  
agent.user_agent_alias = 'Windows IE 7' 
6 楼 marshluca 2010-02-23  
"page.root.search("body").inner_html += form_code"

在mechanize 0.9.4中好像不能硬着来吧.
5 楼 photon 2010-02-23  
我用的python,watir就先不试了。
4 楼 diyuxinlang 2010-02-23  
photon 写道
引用
我记得我需要做的是一个自动登陆,这对于 mechanize 来说轻而易举事。

试过登陆google或gmail吗?最近被这个问题困扰。



哎,google的技术太强了,我也拿他是没办法。

网站代码写的也是超难看!

用 watir 不行吗?
3 楼 diyuxinlang 2010-02-23  

darkbaby123 写道
LZ的头像挺眼熟的,是希特勒?


哈,被你认出来啦~!
在网上找的,呵,感常见酷一点吧~!
2 楼 photon 2010-02-22  
引用
我记得我需要做的是一个自动登陆,这对于 mechanize 来说轻而易举事。

试过登陆google或gmail吗?最近被这个问题困扰。
1 楼 darkbaby123 2010-02-22  
LZ的头像挺眼熟的,是希特勒?

相关推荐

    multi-mechanize-master

    总的来说,"multi-mechanize-master"是一个利用Python的`mechanize`库进行多线程网页爬取的示例项目,旨在提高爬虫效率,同时也涉及了网络请求控制、错误处理、数据存储等多个方面,对于学习和实践Python爬虫技术...

    mechanize-2.7.3.gem

    ruby mechanize包,mechanize-2.7.3.gem

    Mechanize相关资料

    此外,结合实际项目实践,可以提升对Mechanize的运用技巧,比如抓取动态加载的内容、处理JavaScript等更复杂的场景。 总之,Mechanize是Python Web爬虫和自动化测试领域中不可或缺的工具之一,其强大的功能和易用性...

    Ruby-Mechanize一个让自动化web交互变得容易的ruby库

    让我们深入了解一下Mechanize库的核心功能和使用方法。 首先,Mechanize库提供了一个友好的API,可以方便地打开URL、导航页面和处理HTTP请求。通过`Mechanize.new`创建一个新的实例后,你可以使用`get`方法来访问...

    ruby mechanize安装需要的gem包

    Ruby Mechanize 是一个非常强大的 Ruby 库,用于自动化与网站的交互,比如模拟浏览器操作、填写表单、点击链接等。在使用 Ruby Mechanize 之前,首要任务是正确安装其依赖的 gem 包。以下是对 Ruby Mechanize 安装...

    ruby mechanize 2.7.2 gem 包

    ruby mechanize 2.7.2 gem 包

    mechanize-源码.rar

    mechanize还提供了一些高级特性,比如支持JavaScript,虽然不是完全模拟,但可以通过配合其他库如Selenium实现对JavaScript的处理。此外,mechanize支持定制HTTP头,这样可以模拟不同的用户代理,避免被网站识别为...

    mechanize-js:Mechanize是一个Javascript库,可实现自动Web交互

    Mechanize自动存储和发送Cookie,跟随重定向,跟随链接并提交表单。 可以填写和提交表单字段。 机械化还可以将您曾经访问过的站点作为历史记录进行跟踪。入门在根文件夹中,您可以运行get_page示例: node examples...

    python第三方库-mechanize

    用python成为顶级黑客,第三方库必备,mechanize网络爬虫

    python mechanize 0.2.5

    在"mechanize-0.2.5"这个特定的版本中,开发者可能会遇到一些已知的问题和限制,比如对某些现代网页技术(如JavaScript)的支持可能不足,因为Mechanize不执行客户端脚本。但总体来说,对于纯HTML交互和测试,它仍然...

    mechanize4j源程序及所有依赖的jar

    该库模仿了Python的mechanize库,使得Java开发者也能轻松进行网页抓取和模拟浏览器行为。 **mechanize4j的核心功能**: 1. **HTTP交互**:mechanize4j能够发送GET和POST请求,处理表单提交,支持HTTP和HTTPS协议,...

    www-mechanize-firefox:WWW :: Mechanize的API,结合了Firefox的Javascript功能

    总结来说,WWW::Mechanize::Firefox是Perl中一个强大且灵活的工具,它让Perl程序员能够处理那些以往只能由真正浏览器处理的任务,极大地扩展了Perl在Web自动化领域的应用范围。通过结合Firefox的JavaScript执行,...

    Python库 | mechanize-0.3.2-py2-none-any.whl

    这个资源是mechanize库的0.3.2版本,专为Python 2构建,支持多种平台。其以whl(wheel)格式提供,这是一种预编译的Python软件包,可以简化安装过程,避免了编译源代码的步骤。 在Python开发中,mechanize库主要...

    WWW-Mechanize-Chrome:自动化Chrome浏览器

    4. **处理JavaScript**:由于Chrome浏览器支持执行JavaScript,因此可以处理那些依赖JavaScript动态加载内容的网页。 5. **截屏和日志记录**:可以捕获浏览器的屏幕快照,或者记录浏览器的活动日志,用于调试和分析...

    The_official_source_code_for_the_python-mechanize__mechanize.zip

    The_official_source_code_for_the_python-mechanize__mechanize

    Ruby中的Mechanize的使用教程

    Ruby中实现网页抓取,一般用的是mechanize,使用非常简单。 安装 代码如下: sudo gem install mechanize 抓取网页 代码如下: require ‘rubygems’ require ‘mechanize’ agent = Mechanize.new page = agent.get...

    在Python中使用mechanize模块模拟浏览器功能

    mechanize模块是一个强大的工具,它提供了模拟浏览器的功能,包括处理表单提交、跟踪cookies和设置代理等。下面我们将详细探讨mechanize模块的使用方法。 首先,引入必要的库: ```python import mechanize import ...

    Python使用Mechanize模块编写爬虫的要点解析

    Mechanize提供了对HTTP请求的控制,使爬虫能更好地模仿用户操作。下面将详细介绍如何使用Mechanize以及结合其他模块来编写爬虫。 首先,要使用Mechanize,确保已经安装了这个模块。如果没有,可以通过`easy_install...

    mechanize:Mechanize是一个ruby库,可以轻松实现自动的Web交互

    机械化描述Mechanize库用于自动与网站进行交互。 Mechanize自动存储和发送Cookie,遵循重定向,并可以遵循链接和提交表单。 可以填写和提交表单字段。 机械化还可以将您曾经访问过的站点作为历史记录进行跟踪。依存...

Global site tag (gtag.js) - Google Analytics