У меня есть класс для парсинга страниц под названием Loader:
loader.h
#ifndef LOADER_H
#define LOADER_H
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
class Loader : public QObject
{
Q_OBJECT
public:
explicit Loader(QObject *parent = nullptr);
void makeRequest(QString endPointRequest);
signals:
void dataReadyRead(QByteArray);
public slots:
void ReadRead(QNetworkReply *reply);
private:
QNetworkAccessManager *m_manager= new QNetworkAccessManager(this);
};
#endif // LOADER_H
loader.cpp
#include "loader.h"
Loader::Loader(QObject *parent) : QObject(parent)
{
connect(m_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(ReadRead(QNetworkReply*)));
}
void Loader::makeRequest(QString endPointRequest)
{
m_manager->get(QNetworkRequest(QUrl(endPointRequest)));
}
void Loader::ReadRead(QNetworkReply *reply)
{
QByteArray myData;
myData = reply->readAll();
emit dataReadyRead(myData);
}
И в основной форме я передаю ссылку для парсинга :
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&theLoader,SIGNAL(dataReadyRead(QByteArray)),this,SLOT(dataUploaded(QByteArray)) );
}
...
void MainWindow::on_pushButton_4_clicked()
{
theLoader.makeRequest("http://ru.wikipedia.org/wiki/Ключевая_ставка_в_России");
}
void MainWindow::dataUploaded(QByteArray data)
{
QString dataString;
dataString = data;
ui->apiResponseDisplay->setText(dataString);
qDebug()<<dataString;
}
Причём какую я бы ссылку не добавлял http://ru.wikipedia.org/wiki/Ключевая_ставка_в_России, http://ru.wikipedia.org/w/index.php?title=%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0_%D0%B2_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8&oldid=91903866, http://ru.wikipedia.org/w/index.php?title=Ключевая_ставка_в_России&oldid=91903866
Все равно возвращается пустая страница: "". Как мне спарсить данные с Википедии?
Минимально достаточный код для парсинга:
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QDebug>
#include <QTextStream>
#include <QSslError>
int main(int argc, char *argv[])
{
QCoreApplication application(argc, argv);
QNetworkAccessManager qnam;
const QNetworkRequest wikireq(QUrl(QStringLiteral("https://en.wikipedia.org/w/api.php?action=query&format=json&titles=lemon")));
QNetworkReply* wikirep = qnam.get(wikireq);
QObject::connect(wikirep,&QNetworkReply::finished,[wikirep]()->void{
QTextStream repStream(wikirep);
qDebug() << "Response Received:\n" << repStream.readAll();
wikirep->deleteLater();
});
QObject::connect(wikirep,QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),[wikirep]()->void{
qDebug() << "Network Error:\n" << wikirep->errorString();
wikirep->deleteLater();
});
QObject::connect(wikirep,&QNetworkReply::sslErrors,[wikirep](const QList<QSslError> &errors)->void{
qDebug() << "SSL Errors:";
for(auto&& err : errors)
qDebug() << err.errorString();
wikirep->deleteLater();
});
return application.exec();
}
Но на этом не всё, надо ещё выполнить указания по ссылки, если вы работаете в Windows. После чего скопировать две библиотеки(libeay32.dll,ssleay32.dll) из папки bin установленной программы и подключить их в pro файле LIBS += -Llibeay32 -Lssleay32
Сборка персонального компьютера от Artline: умный выбор для современных пользователей