2011-04-15 82 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,并且可以操纵输出。