论坛首页 编程语言技术论坛

Mechanize对WEB的操作

浏览 9933 次
精华帖 (3) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-23   最后修改:2010-02-22
与网页交互(Interacting With a Web Page)

通过Mechanize模拟自然的浏览器行为来完成与网页之间的交互.



# Mechanize的安装
Mechanize的安装请查看 ->  Ruby library的安装

# 使用Mechanize时,需要在脚本头部注明
require 'mechanize'

# Mechanize object的设定
agent = WWW::Mechanize.new

# 对虚拟的user_agent的设定
agent.user_agent_alias = 'Windows IE 7'

# 历史纪录的大小设
agent.max_history = 1

# 激活网址
agent.get('http://www.test.com')

# 网页连接超时设定
agent.open_timeout = 10

# 设定连接网页时的认证(要在激活网页前使用)

agent.auth('username', 'password')

# 读取网页的title标签
page = agent.get('http://www.test.com')
page.title

# 取得当前网页的网址
page = agent.get('http://www.test.com')
page.uri

# 读取网页的form标签
page.forms.name('Name')

# 使用form的action
page.forms.action('test.php')

# 如果网页中有多个form时
page.forms[0]

# 如果网页中有多个同名称或相同action的form时
page.forms.name('Name').first

# 使用传递方法进行判断
page.forms.action('./test.php').find{|f| f.method == 'POST'}

# 文本框,密码框,文本域的填写
form = page.forms.name('Name').first
form['文本框或文本域name'] = '填写内容'
form.fields.name('文本框或文本域name').value = '填写内容'

# submit标签
form = page.form[0]
form.submit
form.submit(form.buttons.name('Name'))

# CheckBox标签
form = page.forms.name('chkbox')
返回的值为 c1 = form.checkboxes[0].name
返回的值为 val2 = form.checkboxes[1].value
返回的值为 false = form.checkboxes.name("c1″).checked

# 复选框的选择
form.checkboxes.name('c1').check
# 对应的HTML代码为:
<form name="chkbox">
  <input type="checkbox" name="c1″ value="val1″>复选框1
  <br>
  <input type="checkbox" name="c2″ value="val2″ checked>复选框2
</form>

# 单选框的选择
form.radiobuttons.name('box')[1].check

# 获得当前SelectList选择的选项及SelectList的设定
form = page.forms.name(form1).first
返回的值为  選択3 = form.fields.name('select1').value
返回的值为 選択3 = form.fields.name('select1').options[2].select

# 选项的选择
form.name('select1').value = “1″
对应的HTML代码为:
<form name='form1' action="" method="post">
   <select name='select1'>
    <option value="1″>選択1</option>
    <option value="2″>選択2</option>
    <option value="3″ selected>選択3</option>
  </select>
</form>

# SelectList多选择时为
form.fields.name('select1') = ['one', 'three']

# 对应的HTML代码为:
<form>
   <select name="select1″ size="3″ multiple>
      <option value="one" selected>選択1</option>
      <option value="two">選択2</option>
      <option value="three" selected>選択3</option>
   </select>
</form>

# 文件的上传
# 方法一
page.forms[0].file_uploads.name('upfile').file_name = './hoge.jpg'
# 方法二
page.forms[0].file_uploads.name('upfile').file_data = File.open('./hoge.jpg','rb'){|f| f.read}

# 对应的HTML代码为:
<form>
   <input type="file" name="upfile" enctype="multipart/form-data">
</form>

# 网页中的超链接
# 网页中的全部超链接的输出
page = agent.get('http://www.test.com')
page.links.each{|link| puts link.href}

# 网页中超链接的击活(可使用正则表达式)
page.links.href('http://www.test.com')[2].click
page.links.text('文本')[0].click

# frame网页的查看
# 方法一:使用name查看
page.frames.name('left').click
# 方法二:使用链接查看
leftpage = page.frames.src('frame_left.htm').click
# 对应的HTML代码为:
<frameset cols="150,*">
  <frame src="frame_left.htm" name="left">
  <frame src="frame_right.htm" name="right">
</frameset>

# 网页中的文件下载(正则表达式可用)
agent = WWW::Mechanize.new
data = agent.get_file('http://www.test.com/top.gif')
open('top.gif', 'wb'){|f| f.write(data)}
# 对应的HTML代码为:
<img src="http://www.test.com/top.gif">

# table部分的的文字
page.root.search('table/tr/td'){|e| puts e}

ruby
   发表时间:2008-12-23   最后修改:2008-12-23
require 'rubygems'
require 'mechanize'

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

page = agent.get("http://www.iteye.com/login")
form = page.forms[0]
form.fields[0].value = "javaeye帐号"
form.fields[1].value = "javaeye密码"
    
agent.submit form #登录JavaEye

page = agent.get("http://qichunren.iteye.com/admin/messages/new") # 这里的域名改成你个人的
form =  page.forms[0]
form.fields[0].value = "qichunren" # 消息接收者
form.fields[1].value = "测试消息" #标题
form.fields[4].value = %Q{
我代表火星全人类欢迎你加入火星圈子!
地址是http://mars.group.iteye.com/ 点击申请加入.
火星口号:火星新闻,火星笑话,火星文, 只要你的想法够火星 地球很危险 JE很严肃 大家还是回火星去吧
}

5.times{agent.submit form} # 把这个数字写成 1000 也是可以的,*_*
0 请登录后投票
   发表时间:2008-12-23  
真可谓灌水之神器啊 ……
0 请登录后投票
   发表时间:2009-04-07   最后修改:2009-04-07
真可谓灌水之神器啊 ……

===>   加个验证码就完了
0 请登录后投票
   发表时间:2009-04-16  
String token=Integer.toString(new Random().nextInt());
   session.setAttribute("token",token);

页面里加入这个,后台再判断下,可秒杀机器人
0 请登录后投票
   发表时间:2009-04-16  
汪兆铭 写道
String token=Integer.toString(new Random().nextInt());
   session.setAttribute("token",token);

页面里加入这个,后台再判断下,可秒杀机器人


Mechanize可以接受cookie和session,秒杀不了的
0 请登录后投票
   发表时间:2009-04-16  
校内貌似会用js生成一堆东西,这个应该就搞不定了
0 请登录后投票
   发表时间:2009-09-16   最后修改:2009-09-16
mechanize可以使用浏览器的cookie吗
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics