【问题标题】:How to return html soon as was loaded html in phantomjs?如何在phantomjs中加载html后立即返回html?
【发布时间】:2023-04-08 08:28:01
【问题描述】:

我正在使用 PhantomJS 加载页面,每个请求大约需要 20 秒,所以我想加快速度。

browser.createPage((err, page) => {
    page.set('settings', {
        userAgent: random_ua.generate(),
        javascriptEnabled: true,
        loadImages: false
    });

    return page.open(url, (err,status) => {
        if (err) {
            console.log('Error:', err);
            onError();
        }

        if (status == 'success') {
            page.evaluate(function () {
                return document.body.innerHTML.trim();
            }, (err,result) => {

                console.log('Execution time: ' + ((new Date).getTime() - time) / 1000 + 's');

                browser.exit();
                resolve(result)
            });
        } else {
            console.log('Status:', status);
            onError();
        }

    });
}

正如我所见,它等待页面和外部资源(css、js 等)的完全加载。

如何在加载后立即解析 html 而不会延迟加载外部链接?

【问题讨论】:

  • 如果你只想要html,你为什么要使用phantomjs?请参阅对此的评论:stackoverflow.com/a/20174298/484780
  • @KevinJantzer 因为 OP 可能想要由 javascript 形成的页面的结果 HTML?
  • 但如果是这种情况,您必须等待页面完全加载外部资源(正如 OP 所说的那样,他不想这样做)
  • 不,您只需等待 javascript 加载。无需获取所有那些数兆字节的图标字体 css abominations 并渲染它们。

标签: javascript phantomjs


【解决方案1】:

我相信您等待 page.open 请求返回成功,然后评估()方法,这将需要时间。也许您可以尝试使用 evaluateAsync()。

evaluateAsync():在网页上下文中评估给定函数,而不阻塞当前执行。函数立即返回,没有返回值。这对于异步运行某些脚本很有用

http://phantomjs.org/api/webpage/method/evaluate-async.html

【讨论】:

    【解决方案2】:

    不确定您使用的是什么自动化脚本,因此将指向 vanilla PhantomJS 解决方案。

    onResourceRequested 允许中止对资源的请求或将其重定向到其他地方。

    来自官方示例«Load url without css»:

    page.onResourceRequested = function(requestData, request) {
        if ((/http:\/\/.+?\.css/gi).test(requestData['url']) || requestData.headers['Content-Type'] == 'text/css') {
            console.log('The url of the request is matching. Aborting: ' + requestData['url']);
            request.abort();
        }
    };
    

    【讨论】:

    • 问题依旧。我向自己的代理服务器发出请求,因此我可以观察加载 URL。例如,我使用 phantomjs 请求 '2ip.ru',但我的代理处理对域的请求两次 prntscr.com/e5ktsw 其他请求(持续时间 >10 秒)对我来说过多
    • 不确定我明白了 - 双重请求是代理还是 PhantomJS 的问题?在任何情况下,您都可以在任何基础上(路径、方案、域、关键字)中止请求 - 正则表达式可以帮助您 :) 代理看起来不错,那是什么?
    • 我认为,当我执行 page.open() 时,所有外部脚本都开始加载(日志屏幕在上方),并且只有在那之后(延迟 >10 秒)才开始在资源请求上工作。如果我把它放到我的 phantomJS 脚本中: page.onResourceRequested =(requestData, request) =>{ console.log('Request'); };我会收到数据,onResourceRequested 会在延迟后安慰我“请求”(我想避免延迟)。在节点 js 服务器上实现的代理,这里是 - pastebin.com/eDSuxmbS
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多