2017-08-08 59 views
0

机械化在此页面上找不到表单。所以我试图通过输入来填写。问题在于表单是Google自动填充。首先,我需要填写输入内容,然后从下拉菜单中选择一个城市。因此,我曾尝试是这样的:使用google自动完成机械化

​​

并获得:

NoMethodError: private method `select' called for nil:NilClass 

附:首先我没有找到AirBnB API。所以我潜心于机械化。如果有一个AirBnB API链接表示赞赏。

+0

自动完成是一个JavaScript的事情,所以你会需要硒这一点。 – pguardiario

回答

1

你的问题并没有真正包含的问题,所以在你希望完成我最好的刺如下:

既然我没有看到太多的动作此页面上,我假设你正在寻求获得各地区的每周平均费率。

您实际上并不需要根据自动填写填写下拉列表。这种互动是通过从Google地理编码API获取纬度/经度,并将其传递到https://www.airbnb.com/wmpw_data

对于那些需要使用JavaScript来函数(像这样),你有两个选择网站:

  • 反向工程,他们使用(如下面的例子)
  • 使用诸如硒/ webdriver的一个框架的API使用完全本机浏览器浏览网站。

需要逆向API,网络调试代理工具是非常重要的。你可以通过查看浏览器开发工具“网络”选项卡获得大量信息,但是“Fiddler”,“Charles Proxy”,“Burp”等等是非常宝贵的。

当你检查通信,你会看到可用以下参数在你发送请求:

  • 时间
  • person_capacity
  • room_type
  • 装载
  • sw_lat
  • sw_lng
  • NE-纬度
  • ne_lng

你可以找到一些有效的值与通过使用像

[37] pry(main)> page.css("[data-room-type]").map{|n| n["data-room-type"]}.uniq 
=> ["entire_home_apt", "private_room", "shared_room"] 

如果设置的各种纬度/经度值,以适合你的东西玩,你会得到该地区的每周平均价格。我注意到“localized_place”正在报告我的个人区域,而不考虑经纬度的变化,但货币价值实际上在变化,并与网站显示的内容相匹配。也许这个属性是基于IP的位置,或者有什么不妥之处。

尽管这些值似乎随着sw/ne界限越来越小的区域成比例缩放,您也可以对两者使用相同的lat/lng并仍然可以得到结果。它可能并不完全反映Google Geocoder如何引用一个地方 - 但它可能足以满足您的使用需求。

一旦你有获得你的纬度/经度的来源,你可以直接喂他们到他们的API。

这里似乎是一个工作示例:

require 'mechanize' 
agent = Mechanize.new 
page = agent.get "https://www.airbnb.com/host/homes" 

room_types = page.css("[data-room-type]").map{|n| n["data-room-type"]}.uniq 

# Values for near Charleston, WV, a random place from Google Maps 
sw_lat = '38.360928' 
sw_lng = '-81.6464767' 
ne_lat = sw_lat 
ne_lng = sw_lng 
duration = '1_week' 
person_capacity = 1 
room_type = room_types.first # => 'entire_home_apt' 

url = "https://www.airbnb.com/wmpw_data?page=slash_host&duration=#{duration}&person_capacity=#{person_capacity}&room_type=#{room_type}&loading=false&sw_lat=#{sw_lat}&sw_lng=#{sw_lng}&ne_lat=#{ne_lat}&ne_lng=#{ne_lng}" 

money = agent.get(url).body 

require 'json' 
JSON.parse(money)["data"] 
# => {"average_income_raw"=>385.0, 
#  "average_income"=>"$385", 
#  "localized_place"=>"xxx", 
#  "list_your_space_link"=>"https://www.airbnb.com/rooms/new", 
#  "earning_estimation_duration"=>"1_week", 
#  "localized_market"=>"Other (International)"}