Rest 抓取WebObjects网站&;休息

Rest 抓取WebObjects网站&;休息,rest,web-scraping,webobjects,Rest,Web Scraping,Webobjects,我需要以编程方式与WebObjects网站交互,并从响应中提取数据。我正在抓取的特定WebObjects站点使用组件操作并将会话存储在Cookie(而不是URL)中。这意味着所有URL的外观如下所示: http://example.com/WOApp/WebObjects/WOApp.woa/wo/7.0.0.0.29.1.1.1 我的第一个问题是: 这样的URL是否不会完全破坏本地和共享缓存机会(REST中的可缓存约束)?我认为使用此类URL的唯一有效缓存是WebObjects服务器本身 可

我需要以编程方式与WebObjects网站交互,并从响应中提取数据。我正在抓取的特定WebObjects站点使用组件操作并将会话存储在Cookie(而不是URL)中。这意味着所有URL的外观如下所示:

http://example.com/WOApp/WebObjects/WOApp.woa/wo/7.0.0.0.29.1.1.1
我的第一个问题是:

  • 这样的URL是否不会完全破坏本地和共享缓存机会(REST中的可缓存约束)?我认为使用此类URL的唯一有效缓存是WebObjects服务器本身
  • 可寻址性不是也被破坏了吗?每个资源都有一个唯一的端点,但它会不断变化。此外(我认为)WebObjects也会使太旧的URL无效,因为它们会在一段时间后“超时”。我不确定这是否只适用于带有会话的URL
  • 关于抓取,我不确定是否有可能从网站中提取任何有意义的端点。例如,对于一个普通的网站,我会浏览HTML并提取POST URL,然后在我的刮板中使用它们,直接发布到它们,而不是通过正常的请求-响应周期

    在这种情况下,我显然不能使用从HTML中提取的任何URL,因为它们是在每次请求时动态生成的,但我读到了一些关于在安全设置未设置为不允许的情况下能够直接访问WebObjects组件的内容(见第53页“直接请求的限制”)。我不知道该怎么做,或者是否可能

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

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

    我对如何处理这种情况的意见很感兴趣,因为我认为上面的任何解决方案都不是特别好。

    您已经问了很多问题,我将看看是否可以依次回答每个问题

    这样的URL不会完全破坏本地和共享缓存吗 机会(REST中的可缓存约束)?我是唯一的 WebObjects服务器本身可以有效地缓存此类URL

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

    可寻址性不是也被破坏了吗?每个资源都有一个唯一的 端点,但它不断变化

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

    此外,我认为 WebObjects还使太旧的URL无效,因为它们在 一段时间。我不确定这是否只适用于带有 尽管如此

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

    现在,让我快速转移一下注意力。我假设您不是WebObjects应用程序的所有者,您正在谈论的是必须刮取WebObjects应用程序,并且您已经确定了此特定应用程序不符合REST原则的一些方式。你完全正确——一个完全基于组件操作的WebObjects应用程序不会是RESTful的。WebObjects的日期提前了几年。话虽如此,WebObjects应用程序有几种完全RESTful的方式:

    • 使用sessionless可以提供一定程度的REST行为,并且肯定会解决您在缓存、可寻址性和过期性方面遇到的问题
    • 使用创建100%RESTful应用程序
    当然,如果您只是想刮取一个遗留应用程序,这些都不会对您有帮助

    关于刮擦,我不确定是否可以提取 网站中任何有意义的端点。例如,使用正常的 我会浏览HTML并提取帖子的URL,然后 使用它们在我的刮板直接张贴到他们,而不是去 通过正常的请求-响应周期

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

    在这种情况下,我显然不能使用从HTML中提取的任何URL 因为它们是根据每个请求动态生成的,但是我读了 如果需要,可以直接访问WebObjects组件 安全设置未设置为不允许此

    这是指直接从组件的模板渲染组件,但有一些限制:

    • 正如您所注意到的,应用程序可以很容易地阻止它发生
    • 如第53页所述,呈现组件的用户输入和操作调用阶段被跳过,这可能意味着这种方法将仅限于呈现一个没有任何动态内容的组件。这可能对您的使用非常有限,尽管您需要知道您感兴趣的组件名称,并且它们通常不会在任何地方公开
    我不确定您是否会找到比您上面已经建议的高级功能方法更好的方法,例如使用Selenium在浏览器级别实现自动化。如果您需要的是应用程序中资源的REST风格的直接寻址能力,那么除非您可以重新编写应用程序以使用直接操作,否则您将无法获得这种能力