我正在研究一个具有挑战性的问题:在预订过程之后找到获取数据的解决方案。基本上,我有一个带有表格的页面(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,它会使页面尽快离开iframe的src更改。
所以,我决定预订流程应该在预订提供商(easyjet.com)的专用页面上进行。
1)我是否有权考虑在真实网站上进行预订,或者是否有办法在我的网页上包含外部网站并执行整个预订过程(基本上填写表格在出发,到达日期等...)?
如果不可能,我用cURL做了一些测试并得出了这个结论:
_我必须为每个提供商定义适当的正则表达式,我的印象是有些人有识别cURL并阻止它的机制。 (例如lufthansa.com)但它与其他人(booking.com)的效果相当不错
我有两个额外的问题:
2)是否有比cURL更好的解决方案来解析页面中的某些HTML(特别是因为如果URL不包含sessionID,它不起作用)?我想的可能是使用像Selenium这样的东西......
3)如何在其他选项卡或窗口上触发cURL解析? (我在想一个类似于可以触发一些JavaScript代码的书签的系统)
感谢您的回答并抱歉: - )
更新:根据我收到的答案,以下是新思路:对于大型供应商(easyjet,hotels.com等等),我会使用API(如果有的话)。对于小型提供商(例如http://www.hotel-gare-clermont.com/en,1,6217.html),我认为代理解决方案值得另外一个,我不会从“Hotel de la Gare”收到任何有关法律问题的投诉,同时增加对这些小型提供商的可见性。你觉得怎么样?
答案 0 :(得分:7)
1)这是可能的,但它具有边界非法的副作用。您不能只是scape提供者表单并在iframe中保留他们的页面。如果提供商抓住你这样做,你很可能会被起诉。
您需要的是与各个提供商的合作协议。根据该协议,他们可能会打开一个API(应用程序编程接口)供您使用。这样您就可以更直接地查询他们的网站,并以清洁和批准的方式进行预订。
2)cURL是一个很棒的库,可以很好地获取网页。互联网上有许多用于将页面提取到字符串的示例。在解析该字符串方面,在理想的世界中,您可以使用XML解析器。不幸的是,HTML页面的构造非常糟糕,这使得它们难以解析。大多数编码人员在必须解析HTML块时都倾向于使用正则表达式。
要获取会话ID,您的第一个cURL请求应该是example.com上的登录表单。尝试获取http://example.com?username=bob&pass=secret假冒登录表单的提交。您可以通过在服务器响应中查找“成功登录”或类似文本来检查有效登录。您可以从响应标头中获取会话ID(如果它是cookie)。后续的cURL请求应该发送您的cookie。
3)cURL在服务器端运行,因此绝对不知道您打开的选项卡。您可以使用Javascript查询标签,但我敢打赌,出于安全考虑,大多数浏览器都不允许您这样做。
答案 1 :(得分:6)
将用户直接发送给提供商是一种更可靠的解决方案,因为您可以让用户控制流程。但是,当然,你失去了对过程的控制:)
或者,您必须在服务器上创建代表您的用户查询网站的代理:
end-user yourdomain easyjet
| | |
|-----search----->| |
|<--booking form--| |
|---user's data-->| |
| |---forward-->|
| |<--result----|
|<--pass to user--| |
| | |
v v v
对最终用户而言,预订与您同在;对于easyjet / lufthansa / whoever,你似乎是一个客户。问题是,每个网站都是不同的,您将有很多工作使您的系统适应每个(或大多数)网站的要求,并且您已经注意到,航空公司不希望您采取他们的习惯。这就是为什么许多经纪人的网站(kelkoo,gocompare ......)开始做你正在计划的事情,但结果却是美化广告。
答案 2 :(得分:0)
从提供商处使用API的最佳方法。接下来是cURL或IFrame。
您可以使用支持跨站点请求的JSON / AJAX,并且可以操作输出。