4

HTTP ページをロードして解析し、最初のページから受け取ったデータに基づいて他のページを開くプロジェクトがあります。

Qt の QNetworkAccessManager は非同期で動作するため、HTTP リクエストを作成し続けることで、一度に複数のページをロードできるように思われます。その後、応答の処理は、応答が戻ってきた順序で行われ、ループでも。

ただし、これを行う方法を理解するのにいくつか問題があります。

まず、stackoverflow のどこかで、QNetworkAccess マネージャーを 1 つだけ使用する必要があることを読みました。それが本当かどうかはわかりません。

問題は、単一の QNetworkAccess マネージャーの完成したスロットに接続していることです。一度に複数のリクエストを行うと、終了した信号がどのリクエストに応答しているのかわかりません。シグナルから渡された QNetworkReply オブジェクトを検査して、それがどのような応答であるかを調べる方法があるかどうかはわかりません。それとも、実際にはリクエストごとに異なる QNetworkAccessManager を使用する必要がありますか?

これは、私が現在どのようにチェーン化しているかの例です。しかし、一度に複数のリクエストを行っている場合、これが機能しないことはわかっています。

from PyQt4 import QtCore,QtGui,QtNetwork

class Example(QtCore.QObject):
    def __init__(self):
        super().__init__()
        self.QNetworkAccessManager_1 = QtNetwork.QNetworkAccessManager()
        self.QNetworkCookieJar_1 = QtNetwork.QNetworkCookieJar()
        self.QNetworkAccessManager_1.setCookieJar(self.QNetworkCookieJar_1)
        self.app = QtGui.QApplication([])
    def start_request(self):
        QUrl_1 = QtCore.QUrl('https://erikbandersen.com/')
        QNetworkRequest_1 = QtNetwork.QNetworkRequest(QUrl_1)
        #
        self.QNetworkAccessManager_1.finished.connect(self.someurl_finshed)
        self.QNetworkAccessManager_1.get(QNetworkRequest_1)
    def someurl_finshed(self, NetworkReply):
        # I do this so that this function won't get called for a diffent request
        # But it will only work if I'm doing one request at a time
        self.QNetworkAccessManager_1.finished.disconnect(self.someurl_finshed)
        page = bytes(NetworkReply.readAll())
        # Do something with it
        print(page)
        QUrl_1 = QtCore.QUrl('https://erikbandersen.com/ipv6/')
        QNetworkRequest_1 = QtNetwork.QNetworkRequest(QUrl_1)
        #
        self.QNetworkAccessManager_1.finished.connect(self.someurl2_finshed)
        self.QNetworkAccessManager_1.get(QNetworkRequest_1)
    def someurl2_finshed(self, NetworkReply):
        page = bytes(NetworkReply.readAll())
        # Do something with it
        print(page)


kls = Example()
kls.start_request()
4

1 に答える 1