機械化在此頁面上找不到表單。所以我試圖通過輸入來填寫。問題在於表單是Google自動填充。首先,我需要填寫輸入內容,然後從下拉菜單中選擇一個城市。因此,我曾嘗試是這樣的:使用google自動完成機械化
並獲得:
NoMethodError: private method `select' called for nil:NilClass
附:首先我沒有找到AirBnB API。所以我潛心於機械化。如果有一個AirBnB API鏈接表示讚賞。
機械化在此頁面上找不到表單。所以我試圖通過輸入來填寫。問題在於表單是Google自動填充。首先,我需要填寫輸入內容,然後從下拉菜單中選擇一個城市。因此,我曾嘗試是這樣的:使用google自動完成機械化
並獲得:
NoMethodError: private method `select' called for nil:NilClass
附:首先我沒有找到AirBnB API。所以我潛心於機械化。如果有一個AirBnB API鏈接表示讚賞。
你的問題並沒有真正包含的問題,所以在你希望完成我最好的刺如下:
既然我沒有看到太多的動作此頁面上,我假設你正在尋求獲得各地區的每週平均費率。
您實際上並不需要根據自動填寫填寫下拉列表。這種互動是通過從Google地理編碼API獲取緯度/經度,並將其傳遞到https://www.airbnb.com/wmpw_data
。
對於那些需要使用JavaScript來函數(像這樣),你有兩個選擇網站:
需要逆向API,網絡調試代理工具是非常重要的。你可以通過查看瀏覽器開發工具「網絡」選項卡獲得大量信息,但是「Fiddler」,「Charles Proxy」,「Burp」等等是非常寶貴的。
當你檢查通信,你會看到可用以下參數在你發送請求:
你可以找到一些有效的值與通過使用像
[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