我正在创建一个小程序,它将从网站中提取信息以便学习。具体来说,我试图从这个乐透网站中提取存档的中奖号码。
https://www.ohiolottery.com/WinningNumbers/KenoDrawings/KenoDrawingsArchive.aspx?date=01%2f01%2f2010
以下是我目前拥有的代码(在pro文件中有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
?
答案 0 :(得分:1)
状态virtual
告诉您必须从其他网址获取数据,在您的情况下为301
。
您需要将/mobile
请求标头设置为网络浏览器,因为该网站认为您是移动客户端。
user-agent