首次加载后 QWebPage 无法正常工作

Posted

技术标签:

【中文标题】首次加载后 QWebPage 无法正常工作【英文标题】:QWebPage not working after the first load 【发布时间】:2012-05-03 05:09:26 【问题描述】:

我正在编写一个使用 QWebPage 抓取一些网页的应用程序。当响应是 Http 重定向(例如 302、303 等)时,我遇到了一些麻烦。 QWebPage 根本不遵循重定向。

为了解决这个问题,我已经连接到页面的网络管理器的完成信号以捕获响应的状态并加载任何重定向,但是,当我第二次调用 load 方法时在 QWebPage 上,它只是将 url 设置为空白并且不发出任何请求。

以下是一些相关的代码:

connect(page->networkAccessManager(), SIGNAL(finished(QNetworkReply*)), SLOT(gotReply(QNetworkReply*)));
connect(page, SIGNAL(loadFinished(bool)), SLOT(doneLoading(bool)));
page->mainFrame()->load(url);

我的位置:

void Snapshot::gotReply(QNetworkReply *reply)

    if(reply->header(QNetworkRequest::ContentTypeHeader).toString().contains(QString("text/html")))
    
        qDebug() << "Got reply " + reply->url().toString() + " - " + reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString() + " - " + reply->header(QNetworkRequest::ContentTypeHeader).toString();
    

    if(!statusCode && reply->header(QNetworkRequest::ContentTypeHeader).toString().contains(QString("text/html"))) 
        statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
        redirectUrl = QUrl(reply->header(QNetworkRequest::LocationHeader).toUrl());
    


void Snapshot::doneLoading(bool)

    // A reasonable waiting time for any script to execute
    timer->start(3000);


void Snapshot::doneWaiting()

    if( statusCode != 0 &&
        statusCode != 301 &&
        statusCode != 302 &&
        statusCode != 303
       ) 
        qDebug() << page->mainFrame()->url().toString();
        qDebug() << page->mainFrame()->toHtml();

        QImage image(page->viewportSize(), QImage::Format_ARGB32);
        QPainter painter(&image);

        page->mainFrame()->render(&painter);

        painter.end();

        image.save(*outputFilename);

        delete outputFilename;
        QApplication::quit();
    
    else if(statusCode != 0) 
        statusCode = 0;
        qDebug() << "Redirecting to: " + redirectUrl.toString();
        if(page->mainFrame()->url().toString().isEmpty()) 
            qDebug() << "about:blank";
            page->mainFrame()->load(this->redirectUrl); // No network activity after this
            qDebug() << "Loading";
        
    

    // This should ensure that the program never hangs
    if(statusCode == 0) 
        if(tries > 5) 
            qDebug() << "Giving up.";
            QApplication::quit();
        
        tries++;
    

【问题讨论】:

【参考方案1】:

问题是我正在测试的页面重定向到 https 并且有一个自签名证书。

解决方案是让 QNetworkReply 忽略 ssl 错误:

void Snapshot::sslErrors(QNetworkReply *reply, const QList<QSslError> &errors)

    reply->ignoreSslErrors();

【讨论】:

以上是关于首次加载后 QWebPage 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

关于SDWebImage加载webp格式图片异常问题

处理 QWebView / QWebPage 中的错误

使用 QWebPage 抓取多个 url

使用 QWebPage 抓取多个 url

使用 ajax json 加载数据后,引导数据表无法正常工作

首次加载后以编程方式突出显示 tableview 中的第一行