使用watir-webdriver(或Ruby中的任何其他方式)刮擦POST请求AJAX网页?

时间:2012-07-11 21:46:22

标签: ruby screen-scraping web-scraping watir-webdriver http-post

我正试图从Palm Beach County Sheriff's Office.

的警方记录中获取逮捕数据

我将我的搜索范围限制在西棕榈滩市,可以追溯到数据(1974年10月31日)。

我正在使用FireFox。

当我得到结果时,我打开FireBug,查看HTML标签,我可以从页面上看到我想要的信息(即被捕人员的姓名,逮捕地址,收费等)。

我检查了网络>> XHR>>帖子标签以查找POST请求参数,但是将其放入我的代码中什么也没做。我对watir-webdriver是一个完全新手可能没有帮助。

这是我的代码:

require 'watir-webdriver'
require 'net/http'
require 'uri'

b = Watir::Browser.new
b.goto 'http://www.pbso.org/index.cfm?fa=blotter'
b.text_field(:name => 'start_date').set '01/01/1900'
b.text_field(:name => 'city_name').set 'West Palm Beach'
b.button(:name => 'process').click

是否有人知道是否可以获取响应页面HTML(即包含姓名,地址,犯罪等的HTML)?

2 个答案:

答案 0 :(得分:1)

如果您想获取页面的HTML,可以执行以下操作:

puts b.html

或者将其限制为包含数据的表格的HTML:

puts b.table(:class, 'contentTxt').html

虽然您必须遍历所有结果页面。这样的事情,注意到你需要等到每次导航后出现结果。

at_end = false
begin
  #Wait until the results appear
  b.table(:class, 'contentTxt').wait_until_present

  #Output the results
  puts b.table(:class, 'contentTxt').html

  #Go to next page if it exists
  if b.link(:text => /Next/, :class => 'contentTxt').exists?
    b.link(:text => /Next/, :class => 'contentTxt').click
  else 
    at_end = true
  end
end until at_end

答案 1 :(得分:1)

那个看起来不那么糟糕,我会用机械化代替:

require 'mechanize'
agent = Mechanize.new
form = agent.get('http://www.pbso.org/index.cfm?fa=blotter').forms[0]
form['captcha_id'] = -1

# page 1 of results
page = form.submit

# page 2 of results
form['fromrec'] = form['fromrec'].to_i + 5
page = form.submit

watir-webdriver和ajax更新结果的问题是当一个dom元素突然消失时你会得到的错误