使用google自动完成机械化
机械化在此页面上找不到表单。所以我试图通过输入来填写。问题在于表单是Google自动填充。首先,我需要填写输入内容,然后从下拉菜单中选择一个城市。因此,我曾尝试是这样的:使用google自动完成机械化
并获得:
NoMethodError: private method `select' called for nil:NilClass
附:首先我没有找到AirBnB API。所以我潜心于机械化。如果有一个AirBnB API链接表示赞赏。
你的问题并没有真正包含的问题,所以在你希望完成我最好的刺如下:
既然我没有看到太多的动作此页面上,我假设你正在寻求获得各地区的每周平均费率。
您实际上并不需要根据自动填写填写下拉列表。这种互动是通过从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)"}
自动完成是一个JavaScript的事情,所以你会需要硒这一点。 – pguardiario