2016-08-16 22 views
0

私は、学ぶためにウェブサイトから情報を引き出す小さなプログラムを作成しています。具体的には、私はこのロトのウェブサイトからアーカイブされた当選番号を引き出そうとしています。ここでHTTP 301ステータスコードの処理方法は?

https://www.ohiolottery.com/WinningNumbers/KenoDrawings/KenoDrawingsArchive.aspx?date=01%2f01%2f2010

私は現在(プロファイルでQT += networkに)持っているコードです:

Retriever.h

#ifndef RETRIEVER_H 
#define RETRIEVER_H 

#include <QObject> 
#include <QtNetwork> 
#include <QDebug> 

class Retriever : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Retriever(QObject *parent = 0); 
    void fetch(); 

public slots: 
    void replyFinished(QNetworkReply* reply); 

private: 
    QNetworkAccessManager* manager; 
}; 

#endif // RETRIEVER_H 

Retriever.cpp

#include "retriever.h" 

Retriever::Retriever(QObject *parent) : QObject(parent) 
{ 
    manager = new QNetworkAccessManager(this); 
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); 
} 


void Retriever::fetch() 
{ 
    QString stackoverflow = "http://stackoverflow.com"; 
    QString lotto = "https://www.ohiolottery.com/WinningNumbers/KenoDrawings/KenoDrawingsArchive.aspx?date=01%2f01%2f2010"; 

    manager->get(QNetworkRequest(QUrl(lotto))); 
} 


void Retriever::replyFinished(QNetworkReply *reply) 
{ 

    if (reply->error() == QNetworkReply::NoError) qDebug() << "no error"; 
    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 

    qDebug() << reply->url(); 
    qDebug() << reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); 
    qDebug() << statusCode; 

    if (reply->atEnd()) qDebug() << "already at end"; 

    while (!reply->atEnd()) { 
     QByteArray data = reply->readLine(); 
     QString::fromUtf8(data.data(), data.size()); 
     QString str(data); 
     qDebug() << str; 
    } 
} 

私はstackoverflowでこれを実行し、それは正常に動作します。私は宝くじのウェブサイトでこれを実行したときしかし、私はqDebugから次のような出力が得られます。

no error 
QUrl("https://www.ohiolottery.com/WinningNumbers/KenoDrawings/KenoDrawingsArchive.aspx?date=01%2F01%2F2010") 
QUrl("/mobile") 
301 
already at end 

いくつかの問題があるようです。まず、エラーはありませんが、モバイルサイトだと思いますか?それから、コンテンツの終わりに既にあると思っています(私は301のステータスコードのためにそのことを仮定しています)。私はウェブサイトから情報を取得することに慣れていないので、このエラーに対処する方法がわかりません。私はウェブサイトから正確にURLをコピーしたので、そのリダイレクトの理由はわかりません。このエラーを解決するにはどうすればよいですか?具体的には、QNetworkAccessManagerに与える正しいURLを取得するにはどうすればよいですか?

答えて

1

ステータス301は、あなたのケースでは/mobileである別のURLからデータを取得する必要があることを示しています。

user-agent要求ヘッダーをWebブラウザに設定する必要があります。そのWebサイトは、あなたがモバイルクライアントだと思うからです。

QNetworkRequest request(QUrl(lotto)); 
request.setHeader(QNetworkRequest::UserAgentHeader, QVariant("Mozilla/5.0 ")); 
manager->get(request); 
+0

私はこれを試しましたが、残念なことに同じ結果が出ました。私は初期化によって 'QNetworkRequest'に' QUrl'を設定することができなかったことにも気付きました。私はそれがクラス/構造体/共用体が欲しいと言っているエラーを持っています。私は 'QNetworkRequest :: setUrl'を使用しなければなりませんでした。 – Dillydill123

+0

私は 'user-agent'を' 'Google Chrome ''に設定することで動作させることができました – Dillydill123

関連する問題