当前位置:  开发笔记 > 编程语言 > 正文

以编程方式发布数据

如何解决《以编程方式发布数据》经验,为你挑选了1个好方法。

我想以编程方式下载网页的内容,但该页面是作为POST的结果生成的,我似乎无法使其正常工作.

这是页面:http://jp.translink.com.au/mobile/Input.aspx

您可以输入以下值以查看其工作原理:

从:Coorparoo火车站

至:中央火车站

我用tcpdump监控流量,并尽可能使用代码重新创建它.这是测试代码:

http = Net::HTTP.new("jp.translink.com.au", 80)
path = "/mobile/Input.aspx"

# GET request -> so the host can set his cookies
resp, data = http.get(path, nil)
cookie = resp.response['set-cookie']

viewstate = data.match(/"__VIEWSTATE" value="([^"]+)"/)[1]

# POST request -> logging in
data = "__VIEWSTATE=#{viewstate}&FromTextBox=mitchelton+railway+station&FromModeList=stopLandmark&ToTextBox=morayfield+railway+station&ToModeList=stopLandmark&VehicleList%3A1=on&HourList=11&MinuteList=40&NoonList=PM&DateList=0&goButton=Go%21"
headers = {
  'Cookie' => cookie,
  'Referer' => 'http://jp.translink.com.au/mobile/Input.aspx',
  'origin' => 'http://jp.translink.com.au',
  'Content-Type' => 'application/x-www-form-urlencoded',
  'User-Agent' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19',
  'Accept' => 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
  'Accept-Language' => 'en-us',
  'Accept-Encoding' => 'gzip, deflate'
}

resp, data = http.post(path, data, headers)

# Output on the screen -> we should get either a 302 redirect (after a successful login) or an error page
puts 'Code = ' + resp.code
puts 'Message = ' + resp.message
resp.each {|key, val| puts key + ' = ' + val}
puts data

我得到回复告诉我重定向到错误页面.有谁知道如何成功地做到这一点?

编辑:谢谢你,很少回复我的问题.我下面是我的问题的解决方案:)

require 'mechanize'
agent = WWW::Mechanize.new
initial_page = agent.get('http://jp.translink.com.au/mobile/Input.aspx')
initial_form = initial_page.form('InputForm')
initial_form.FromTextBox = 'Mitchelton Railway Station'
initial_form.radiobuttons_with(:name => 'FromModeList')[1].check
initial_form.ToTextBox = 'Morayfield Railway Station'
initial_form.radiobuttons_with(:name => 'ToModeList')[1].check
initial_form.checkbox_with(:name => 'VehicleList:0').uncheck
initial_form.checkbox_with(:name => 'VehicleList:2').uncheck
go_button = initial_form.buttons[0]
result_page = agent.submit(initial_form, go_button)
puts result_page.body

David Burrow.. 5

我不会从头开始使用Net库,有很多宝石可以自定义构建来做你想做的事情,看看像机械化或者Webrat或nokogiri这样的东西.

现在任何事都是可以报废的,如果你遇到更严重的问题(比如ajax页面内容生成)你可能不得不求助于以编程方式驱动一个浏览器实例--webrat与Selenium集成,这是一个允许你驱动浏览器的测试工具代码并检查实时浏览器dom.这种方法很慢,所以首先尝试机械化,它应该能够做你想要的.



1> David Burrow..:

我不会从头开始使用Net库,有很多宝石可以自定义构建来做你想做的事情,看看像机械化或者Webrat或nokogiri这样的东西.

现在任何事都是可以报废的,如果你遇到更严重的问题(比如ajax页面内容生成)你可能不得不求助于以编程方式驱动一个浏览器实例--webrat与Selenium集成,这是一个允许你驱动浏览器的测试工具代码并检查实时浏览器dom.这种方法很慢,所以首先尝试机械化,它应该能够做你想要的.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有