2017-08-08 85 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)"}