【发布时间】:2014-03-04 10:02:42
【问题描述】:
我想从http://maxdelivery.com 抓取搜索结果,但不幸的是,他们在搜索表单中使用的是 POST 而不是 GET。我找到了关于如何使用 Nokogiri 和 RestClient 伪造提交表单的描述,但它没有为我返回任何结果:http://ruby.bastardsbook.com/chapters/web-crawling/
我以前曾与 Nokogiri 合作过,但不是为了 POST 表单提交的结果。
这是我现在的代码,仅对上面链接中的示例稍作修改:
class MaxDeliverySearch
REQUEST_URL = "http://www.maxdelivery.com/nkz/exec/Search/Display"
def initialize(search_term)
@term = search_term
end
def search
if page = RestClient.post(REQUEST_URL, {
'searchCategory'=>'*',
'searchString'=>@term,
'x'=>'0',
'y'=>'0'
})
puts "Success finding search term: #{@term}"
File.open("temp/Display-#{@term}.html", 'w'){|f| f.write page.body}
npage = Nokogiri::HTML(page)
rows = npage.css('table tr')
puts "#{rows.length} rows"
rows.each do |row|
puts row.css('td').map{|td| td.text}.join(', ')
end
end
end
end
现在(忽略格式化的东西),我希望 if page = RestClient.post(REQUEST_URL, {...} 如果传递了一个“好”搜索词,则返回一些搜索结果,但每次我只是返回搜索结果页面而没有实际结果,就好像我已将 URL 粘贴到浏览器中。
有人知道我错过了什么吗?或者,只是如何用另一个 gem 取回我正在寻找的结果?
有了上面的课程,我希望能够做到:
s = MaxDeliverySearch.new("ham")
s.search #=> big block of search results objects to traverse
【问题讨论】:
-
是否所有必需的参数都传递给了帖子,你能用 curl 运行它并返回一些东西吗?
-
对于提交表单,您应该使用机械化。