我试图将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
参数。可能是什么原因?
答案 0 :(得分:0)
添加以下行以更改最终使用的用户代理:
agent.user_agent_alias = 'Mac Safari'
答案 1 :(得分:0)
解决这些问题的最佳方法是通过Charles或Fiddler等调试代理代理Mechanize请求和浏览器请求,并将它们并排比较。