如何在 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文件为例。
- 您可以从请求 headers 或 url,
检测到它是一个 CSS 资源
- 检查DOM资源实际被引用,
- 将 DOM 节点及其所有属性(和 innerHTML)复制到新的 DOM 节点,
- 删除旧的并插入新的。什么都没有改变,但它应该提示浏览器再次下载资源。所有这些都必须在
page.evaluate
回调的页面上下文中完成。
XHR 请求 明确通过页面发送。所以每个请求都有一个 finish/error 回调。您无法从外部访问这些回调,因此重新运行 那些请求将不起作用,因为不会调用在这些请求之后发生的操作。
您可能希望 运行 PhantomJS 带有 --disk-cache=true
选项,以便再次 运行 页面请求花费更少的时间。
我有一个 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文件为例。
- 您可以从请求 headers 或 url, 检测到它是一个 CSS 资源
- 检查DOM资源实际被引用,
- 将 DOM 节点及其所有属性(和 innerHTML)复制到新的 DOM 节点,
- 删除旧的并插入新的。什么都没有改变,但它应该提示浏览器再次下载资源。所有这些都必须在
page.evaluate
回调的页面上下文中完成。
XHR 请求 明确通过页面发送。所以每个请求都有一个 finish/error 回调。您无法从外部访问这些回调,因此重新运行 那些请求将不起作用,因为不会调用在这些请求之后发生的操作。
您可能希望 运行 PhantomJS 带有 --disk-cache=true
选项,以便再次 运行 页面请求花费更少的时间。