首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抓取WebObjects网站和REST

抓取WebObjects网站和REST
EN

Stack Overflow用户
提问于 2014-02-11 10:15:56
回答 2查看 420关注 0票数 1

我需要通过编程与WebObjects网站进行交互,并从响应中提取数据。我正在抓取的特定WebObjects站点使用组件操作,并将会话存储在cookie(而不是urls)中。这意味着所有的urls看起来都是这样的:

代码语言:javascript
复制
http://example.com/WOApp/WebObjects/WOApp.woa/wo/7.0.0.0.29.1.1.1

我的第一个问题是:

  1. 像这样的urls没有完全破坏本地和共享的缓存机会(REST中的可持续约束)吗?我认为使用这样的urls进行唯一有效的缓存是WebObjects服务器本身。
  2. 地址不是也坏了吗?每个资源确实有一个唯一的端点,但是它会不断地变化。此外,(我认为) WebObjects也使太老的URL无效,因为它们在一段时间后“超时”。不过,我不确定这是否只适用于具有会话的urls。

关于抓取,我不确定是否有可能从网站中提取任何有意义的端点。例如,对于一个普通的网站,我会查看HTML并提取POST urls,然后在我的刮板中使用它们,直接发布到它们,而不是经过正常的请求响应周期。

在这种情况下,我显然不能使用从HTML中提取的任何URL,因为它们是在每个请求中动态生成的,但是我读到了一些关于如果安全设置没有被设置为不允许直接访问WebObjects组件的内容(参见3.5/PDF/WebObjectsDevGuide.pdf,第53页“对直接请求的限制”)。不过,我不知道该怎么做,也不知道是否可能。

如果这是不可能的,那么什么是好方法呢?我能想到的唯一选择是:

  • 使用成熟的浏览器客户端与网站进行交互(例如WatiR或Selenium),并从响应中提取和处理HTML。
  • 手动提取动态端点,首先请求它们所在的页面,然后在HTML中找到它们所在的位置。然后把它们当作是“静态的”来使用。

我对如何处理这个场景很感兴趣,因为我不认为上面的任何解决方案都是特别好的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-19 09:18:51

你问了很多问题,我看看能不能依次讨论一下。

像这样的urls没有完全破坏本地和共享的缓存机会(REST中的可持续约束)吗?我认为使用这样的urls进行唯一有效的缓存是WebObjects服务器本身。

实际上,WebObjects应用服务器中有一个页面缓存,您可以正确地观察到,这些组件操作URL可能会阻碍任何其他类型的缓存。此外,即使会话ID不存在于URL中,您也需要cookie中的会话ID来重新创建相同的页面,因此只有该URL才能从应用服务器获得会话恢复错误。

地址不是也坏了吗?每个资源确实有一个唯一的端点,但是它会不断地变化。

嗯,是的,从表面上看这是真的。您已经给出了一个组件操作URL作为示例,它们与会话绑定在一起。

此外,(我认为) WebObjects也使太老的URL无效,因为它们在一段时间后“超时”。不过,我不确定这是否只适用于具有会话的urls。

再说一遍,都是真的。组件操作URL生成会话,会话超时。

在这一点上,让我做一个快速转移注意力。我假设您不是WebObjects应用程序的所有者--您说的是必须刮掉一个WebObjects应用程序,并且您已经确定了这个特定应用程序不符合REST原则的一些方法。您完全正确--一个完全基于组件的WebObjects应用程序不会是RESTful。WebObjects提前几年就可以休息了。话虽如此,有一些方法可以使WebObjects应用程序完全成为RESTful:

  • 使用无会话的直接行动提供了一定程度的REST行为,当然可以解决缓存、可寻址性和过期等问题。
  • 使用ERRest框架创建100%的RESTful应用程序。

当然,如果您只是想刮旧的应用程序,所有这些都不会对您有所帮助。

关于抓取,我不确定是否有可能从网站中提取任何有意义的端点。例如,对于一个普通的网站,我会查看HTML并提取POST urls,然后在我的刮板中使用它们,直接发布到它们,而不是经过正常的请求响应周期。

同样,如果它是一个完全基于组件操作的应用程序,那么您是对的--所有这些URL都将动态生成,并且对您毫无用处。

在这种情况下,我显然不能使用从HTML中提取的任何URL,因为它们是在每个请求中动态生成的,但是我读到了一些关于如果安全设置没有设置为不允许这个…时可以直接访问…组件的内容。

这是在讨论如何让组件直接从模板呈现,但有一些限制:

  • 正如您注意到的,应用程序可以很容易地防止其发生。
  • 如第53页所述,呈现组件的用户输入和动作调用阶段被跳过,这可能意味着这种方法将仅限于呈现没有任何动态内容的组件。虽然您需要知道您感兴趣的组件名称,但这对您来说可能是非常有限的,而且通常不会在任何地方公开。

我不确定您是否会找到比前面建议的高级别功能方法类型更好的方法,比如在浏览器级别使用Selenium实现自动化。如果您需要的是应用程序中资源的REST式直接可寻址性,那么除非您可以重写应用程序,以便在需要时使用直接操作或ERRest,否则您不会得到它。

票数 1
EN

Stack Overflow用户

发布于 2019-01-28 13:14:02

有点晚了,但可以帮上忙。

我使用Apache的mod_ext_filter (小修改)对来自WebObjects应用程序的请求/响应进行预/后过滤。过滤器调用PHP脚本,并可以从HTML页面读取动态的超级推荐和其他内容。脚本还可以修改HTTP请求,因此我们可以编程地从请求中添加/删除参数,以便在遗留应用程序前面实现新的工作流,并在请求到达WebObjects之前清理它们。还可以在脚本中处理额外的数据库,并通过多个请求存储一些内容。

因此,您可以获得动态创建的链接(可能是按钮的名称或HTML表单目标),并且可以在请求中识别这些名称。

也可以用“点击页面上的第三个按钮”这样的小脚本来“远程控制”这样的应用程序。惟一需要的是一个DOM解析器来获取HTML页面的结构,然后重新构建浏览器将要执行的操作(即手动创建HTTP请求并将其作为POST发送到提取的表单目的地href)。唯一的问题是Javascript代码,我们分析它并在PHP中重新编程(即启用/禁用输入元素,这样它们就不会在请求中传输)

Apache的WebObjects适配器模块中存在一些问题。它仍然在header中使用内容长度,这在mod_ext_filter中是不能更改的。如果更改HTML或请求中的参数,则内容的长度将不再匹配。但这是有可能改变的。

从理论上讲,还可以控制平板电脑或智能手机上的新用户界面上的此类封闭源遗留应用程序,将用户交互委托给后端WebObjects应用程序。

脚本取决于页面结构,因此如果您的WebObjects应用程序将被更改,您必须更正脚本中的某些内容(即第三个按钮现在可以是第四个按钮)。

还应该可以在应用程序前面添加Restful接口,并通过过滤器脚本查询遗留应用程序中的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21698930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档