如何在 PhantomJS 中重新发送资源超时请求?

How to resend a request on resource timeout in PhantomJS?

我有一个 PHP 脚本可以抓取网络并使用 PhantomJS 将抓取的数据插入数据库。
目前,在 PhantomJS 资源超时时,我取消了页面的整个请求并通过 PHP.
再次请求整个页面 这是我的代码:

page.settings.resourceTimeout = 5000; // 5 seconds
page.onResourceTimeout = function(e) {
  console.log(e.errorCode);   // it'll probably be 408 
  console.log(e.errorString); // it'll probably be 'Network timeout on resource'
  console.log(e.url);         // the url whose request timed out
  phantom.exit(1);
};

我只想对超时的资源重新发送请求,而不是重新请求整个页面。 这可能吗?

您可以重新发送 (GET) 请求,但这对您没有多大帮助,因为请求的原因不同。

资源请求 当 javascript 文件在 <script> 标签中引用时自动发生。您可以通过 XHR 使用 PhantomJS 下载它,但很可能依赖它的其他脚本已经尝试 运行 但失败了。您将不得不再次 re-run 所有这些。这真的很乏味。
CSS 文件或图像等其他资源对时间不敏感,可以 re-downloaded。但是当你这样做时,你必须将它们插入到正确的位置。我们以CSS文件为例。

  1. 您可以从请求 headers 或 url,
  2. 检测到它是一个 CSS 资源
  3. 检查DOM资源实际被引用,
  4. 将 DOM 节点及其所有属性(和 innerHTML)复制到新的 DOM 节点,
  5. 删除旧的并插入新的。什么都没有改变,但它应该提示浏览器再次下载资源。所有这些都必须在 page.evaluate 回调的页面上下文中完成。

XHR 请求 明确通过页面发送。所以每个请求都有一个 finish/error 回调。您无法从外部访问这些回调,因此重新运行 那些请求将不起作用,因为不会调用在这些请求之后发生的操作。

您可能希望 运行 PhantomJS 带有 --disk-cache=true 选项,以便再次 运行 页面请求花费更少的时间。