预订完成后(cURL,iFrame ......?)在外部网站上检索信息

Mic*_*oso 6 javascript php iframe curl

我正在研究一个具有挑战性的问题:在预订过程之后找到获取数据的解决方案.基本上,我有一个带有表单(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",同时为那些小型供应商增添了知名度.你怎么看?

xco*_*ist 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查询标签,但我敢打赌,出于安全考虑,大多数浏览器都不允许您这样做.

  • 不要过于关注法律方面的考虑因素:在我看来,实际问题更令人担忧!当像hotels.com这样的知名提供商改变他们的某些形式时会发生什么?如果easyjet.com为他们中的一个添加验证码,会发生什么?或者如果瑞安航空公司开始阻止你的IP怎么办?是否真的符合大型GDS的利益,拥有一个围绕连接构建的核心基础设施,这种连接永远不会超过弱攻击? (2认同)

boi*_*ert 6

将用户直接发送给提供商是一种更可靠的解决方案,因为您可以让用户控制流程.但是,当然,你失去了对过程的控制:)

或者,您必须在服务器上创建代表您的用户查询网站的代理:

end-user         yourdomain     easyjet
   |                 |             |
   |-----search----->|             |
   |<--booking form--|             |
   |---user's data-->|             |
   |                 |---forward-->|
   |                 |<--result----|
   |<--pass to user--|             |
   |                 |             |
   v                 v             v
Run Code Online (Sandbox Code Playgroud)

对于最终用户,预订发生在您身边; 对于easyjet/lufthansa/whoever,你似乎是一个客户.问题是,每个网站都是不同的,您将有很多工作使您的系统适应每个(或大多数)网站的要求,并且您已经注意到,航空公司不希望您采取他们的习惯.这就是为什么许多经纪人的网站(kelkoo,gocompare ......)开始做你正在计划的事情,但结果却是美化的广告.