机械化提交结果不是正确的页面

时间:2015-02-21 08:09:30

标签: ruby mechanize scrape

我试图将booking.com作为练习机械化的练习,但我无法解决问题。我正在尝试通过Mechanize使用以下代码获得酒店的价格:

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')

如果您通过网络浏览器关注这些页面,您会看到,在主页上提交表格并在下一页选择酒店后,您会看到所选日期的房价。

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

我已经有一段时间了,我似乎无法解决它。我认为问题是booking.com正在使用的JavaScript,但即使在我的网络浏览器上关闭JavaScript之后,我也能够获得正确的行为。

对此有何想法?

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

2 个答案:

答案 0 :(得分:0)

添加以下行以更改最终使用的用户代理:

agent.user_agent_alias = 'Mac Safari'

答案 1 :(得分:0)

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