2011-04-15 84 views
7

我正在解決一個具有挑戰性的問題:在預訂過程後尋找獲取數據的解決方案。基本上,我有一張帶有表格的頁面(SLIM FORM),我需要自動填寫來自提供者表單(例如easyjet.com或hotels.com,基本上任何預訂網站)的信息。例如:https://secure.booking.com/hotel/es/royal.html?sid=1c2bab12a0c64a541728840f52cd6401;errorc_checkin_invalid=checkin;errorc_intro_error_message_invalid=intro_error_message;errorv_stage=1;errorv_checkin=2011-07-05;errorv_hotel_id=90228;errorv_installment_count=1;errorv_hostname=www.booking.com;errorv_nr_rooms_9022801_80638194_0=1;errorv_interval=1我預訂的信息是我需要得到的。在外部網站上完成預訂完成後(cURL,iFrame ...?)檢索信息

enter image description here

我做了一些測試,這裏是我發現了什麼,現在:

這是不可能同時擁有在同一頁上,因爲捲曲,有與外部沒有通信服務器和iframes,它會盡快離開頁面iframe的src更改。

所以,我決定,預訂過程應該發生一個專門的頁面,在預約提供商(easyjet.com ...)

1)我說得對不對,審議關於執行預訂的域名真正的網站,還是有辦法在我的網頁上包括外部網站,並執行其中的預訂的全部過程(基本上填寫表格出發,到達日期等)?

如果不可能,我做了一些測試,以捲曲並得出這樣的結論:

_我必須定義擬合正則表達式爲每個供應商,我的印象是,一些有機制來識別捲曲和阻止它。 (如lufthansa.com),但它工作得很好與他人(booking.com)

我有2個其它附加問題:

2)是否有比捲曲更好的解決方案來分析一些HTML頁面中(尤其是因爲如果URL不包含sessionID,它不起作用)?我想也許使用像硒這樣的東西...

3)如何觸發我的cURL解析在其他選項卡或窗口? (我在想類似書籤的一個系統,可以引發一些JavaScript代碼)

謝謝您的回答,並遺憾的長度:-)

更新:根據我收到的,這裏的答案是新鮮想法:對於大型提供商(easyjet,hotels.com等),我會使用API​​(如果可用)。對於小型服務提供商(例如http://www.hotel-gare-clermont.com/en,1,6217.html),我認爲代理解決方案是值得另一個解決方案的,我不會收到任何關於「Hotel de la Gare」法律問題的投訴,同時爲這些小型提供商增加了可見性。你怎麼看?

+3

請記住,您應該嘗試與提供商交談 - 他們可能會提供一個API接口,他們可能會反對並阻止服務器IP(儘管這對他們來說是生意的,所以不太可能) – 2011-05-04 00:58:25

回答

7

1)這是可能的,但它具有邊界非法的副作用。你不能只是改變提供商的形式,並保留在iframe中的網頁。如果提供商發現你這樣做,你很可能會被起訴。

您需要的是與各供應商達成的合作協議。有了這個協議,他們可能會開放一個API(應用程序編程接口)供您使用。這可以讓你更直接地查詢他們的網站,並以乾淨和批准的方式進行預訂。


2)cURL是一個很好的庫,它可以很好地提取網頁。互聯網上有很多用於將頁面提取到字符串的例子。就解析該字符串而言,在理想的世界中,您可以使用XML解析器。不幸的是,HTML頁面的構造非常糟糕,這使得它們很難解析。大多數編碼器,當他們必須解析HTML塊時,都傾向於使用正則表達式。

爲了獲得會話ID,您的第一個cURL請求應該是example.com上的登錄表單。假冒http://example.com?username=bob&pass=secret提交登錄表單。您可以通過在服務器響應中查找「成功登錄」或類似文本來檢查有效登錄。您可以從響應頭獲取會話ID(如果它是一個cookie)。隨後的cURL請求應該發送您的cookie。


3)捲曲在服務器端運行,所以絕對沒有你的標籤,是開放的知識。您可以使用Javascript查詢標籤,但我敢打賭,大多數瀏覽器不會允許您出於安全原因執行此操作。

+1

+1爲非法界限。這也有技術含義。由於數據不是機器可讀的,因此可以自由更改輸出格式。因此使用您打算使用的接口不僅更合法,而且在佈局更改時不易破壞。 – Nicolas78 2011-05-02 10:32:45

+0

對合作夥伴協議的需求非常明確,謝謝。 – boisvert 2011-05-03 10:33:25

+0

這不是爲了從提供者那裏'竊取'任何數據。我正在爲一個大GDS工作,該網站是旅行社執行預訂的GUI(但不僅僅是),這就是爲什麼他們需要在easyjet.com或hotels.com進行預訂,並且這些數據需要做一些統計處理。但是聯繫每個允許預訂航班或酒店的提供商是一項幾乎不可能完成的任務。但我同意當API可用時,它絕對是最好的解決方案。 代理解決方案是否涉及此類法律問題? – 2011-05-03 13:06:48

6

將用戶直接發送給提供者是一種更可靠的解決方案,因爲您可以讓用戶控制過程。不過,當然,你失去的過程:)

或者,你必須創建一個查詢網站代表你的用戶的服務器上代理的控制:

end-user   yourdomain  easyjet 
    |     |    | 
    |-----search----->|    | 
    |<--booking form--|    | 
    |---user's data-->|    | 
    |     |---forward-->| 
    |     |<--result----| 
    |<--pass to user--|    | 
    |     |    | 
    v     v    v 

給最終用戶,預訂發生在你身上;到easyjet /漢莎航空公司/誰,你似乎是一個客戶。問題是,每個網站都是不同的,而且你會有很多工作使你的系統適應每個(或大部分)網站的要求,正如你已經注意到的那樣,航空公司不希望你採取他們的習慣。這就是爲什麼許多經紀人的網站(kelkoo,gocompare ...)開始做你正在計劃的事情,但最終成爲美化廣告。

+0

感謝這非常明確的答案(對不起,我不能投票的原因的賞金;-)) PS:在gocompare.com上,似乎你可以執行所有預訂,而無需去提供商的網站... – 2011-04-28 12:23:42

+0

沒有實現gocompare是那麼好。我試了他們的保險,而我得到的只是收集了大量關於我的數據,並且沒有準確的信息。但是,航空旅行並不複雜。 – boisvert 2011-04-28 13:22:43

+0

那麼法律問題呢?設置一個代理需要一些授權或者什麼? – 2011-05-03 14:26:29

0

從提供者使用API​​的最佳方法。接下來是cURL或IFrame。

您可以使用支持跨站點請求的JSON/AJAX,並且可以操縱輸出。