Ruby Mechanize提交结果不是正确的页面

Ruby Mechanize提交结果不是正确的页面,ruby,mechanize,scrape,Ruby,Mechanize,Scrape,我想把booking.com作为学习机械化的练习,但我无法克服一个问题。我正在尝试使用以下代码通过机械化获取酒店的价格: hotel_name = "Hilton New York" date = Date.today day_after_date = date + 1 agent = Mechanize.new homepage = agent.get("http://www.booking.com") # Fill out the main form on the booking.com

我想把booking.com作为学习机械化的练习,但我无法克服一个问题。我正在尝试使用以下代码通过机械化获取酒店的价格:

hotel_name = "Hilton New York"
date = Date.today
day_after_date = date + 1
agent = Mechanize.new

homepage = agent.get("http://www.booking.com")
# Fill out the main form on the booking.com homepage
main_form = homepage.form_with(name: 'frm')
main_form.ss = hotel_name
main_form.checkin_monthday = date.day.to_s
main_form.checkin_year_month = "#{date.year}-#{date.month}"
main_form.checkout_monthday = day_after_date.day.to_s
main_form.checkout_year_month = "#{day_after_date.year}-#{day_after_date.month}"
main_form[''] = 1 # 1 adult, 0 children

homepage.save('1-homepage.html') # For debugging purposes

# Choose the hotel from the list that comes up
hotel_selection_page = agent.submit main_form
hotel_link = hotel_selection_page.links.select { |link| link.text =~ /#{hotel_name}/i }.first
hotel_page = hotel_link.click

# For debugging purposes
hotel_selection_page.save('2-hotels-list.html')
hotel_page.save('3-hotel-page.html')
如果您通过web浏览器查看页面,您将看到,在主页上提交表单并在下一页选择酒店后,您将看到所选日期的房价

但是通过Mechanize,在
3-hotel-page.html
页面上,您无法看到价格

我已经做了一段时间了,但我似乎无法解决它。我原以为问题出在booking.com使用的JavaScript上,但即使在关闭web浏览器上的JavaScript后,我仍然能够获得正确的行为

有什么想法吗


编辑:我刚刚意识到,当表单通过web浏览器发送时,在您选择酒店的第二个页面上,酒店链接有一个
sid
参数(例如,
sid=ba232d9d340c66ae73f1ded22b80a0da
),但当我通过Mechanize发送表单时,我没有得到
sid
参数。原因可能是什么?

添加以下行以更改用户代理最终奏效:

agent.user_agent_alias = 'Mac Safari'

解决这些问题的最佳方法是通过调试代理(如Charles或Fiddler)代理Mechanize请求和浏览器请求,并将它们并排比较。

查看浏览器中的表单。可以设置具有名称属性的所有内容。像
main\u form['']=1
这样的东西没有任何意义。@pguardiario为什么没有意义?如果您在浏览器中查看表单,您将看到他们的“来宾”选择框定义为
(省略)1个成人,0个儿童(省略)
要访问该表单,我使用
主表单[''']=1
。显然booking.com需要清理它的标记,但我对此无能为力。对,我理解你为什么这么做,但参数需要名称,这意味着你忽略了一些东西。@pguardiario,你能详细说明一下吗?你的确切意思是哪个参数?我对这一点很陌生,我真的看不出问题所在。我是说,如果select没有name属性,就意味着它对提交的内容没有任何作用。