Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2013, 23:58   #1
Pixelrom33
Пользователь
 
Регистрация: 23.02.2012
Сообщений: 32
По умолчанию [Qt] Получение информации с сайта

нужно тупо считать все что на сайте написано. вроде как все правильно делаю, но почему на всех сайтах выдает либо ошибку чтения либо вообще ничего никак непойму.
mainWindow.h:
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QUrl>
#include <QtNetwork>
#include <QDebug>

class mainWindow: public QMainWindow
{
    Q_OBJECT

public:
    mainWindow();

private:
    QPushButton *btn;

private slots:
    void searshFinished(QNetworkReply*);
    void sendRequest();
};

#endif // MAINWINDOW_H
mainWindow.cpp:
Код:
#include <mainWindow.h>

mainWindow::mainWindow()
{
    btn = new QPushButton("go", this);
    connect(btn, SIGNAL(clicked()),this, SLOT(sendRequest()));
}

void mainWindow::sendRequest()
{    
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    manager->get(QNetworkRequest(QUrl("http://www.youtube.com/")));
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(searshFinished(QNetworkReply*)));
}

void mainWindow::searshFinished(QNetworkReply* networkReply)
{
    if (!networkReply->error()) {
        QString data = QString::fromUtf8(networkReply->readAll());
        qDebug() << data;
    }else qDebug() << "error";

}
Pixelrom33 вне форума Ответить с цитированием
Старый 19.05.2013, 06:38   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Код:
manager->get(QNetworkRequest(QUrl("http://www.youtube.com/")));
вроде бы тут ошибка (не проверял). Сначала надо установить хост соответствующим методом, а потом получать страницы через get собственно.
-----------
ЗЫ. МБ кто-то подскажет мне тоже (не создавать чтобы отдельную тему уж). Пытался я граббить сайт reelance.ru и периодически в ответ на зарпос он выдает пустую страницу (ошибок нет никаких, просто networkReply->readAll() возвращает пустую строку.Но если подождать какое-то время и попробовать получить туже страницу еще раз - то все может получица.

При этом, в браузере страница всегда отображаеца нормально. В чем может быть дело?

---------
А вот нашел ответ на свой вопрос )
сигнал requestFinished с пустым ответом приходит после выполнения setHost

Последний раз редактировалось rrrFer; 19.05.2013 в 07:03.
rrrFer вне форума Ответить с цитированием
Старый 19.08.2013, 07:49   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Вот хороший учебный пример. Содержимое страницы "index.html" записывается в файл.

Код взят отсюда: C++ Qt 64 - QHttp download files from the web with ease

main.cpp
Код:
#include <QCoreApplication>
#include "downloader.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    downloader cDown;
    cDown.Do_Download();
    
    return a.exec();
}
downloader.h
Код:
#ifndef DOWNLOADER_H
#define DOWNLOADER_H

#include <QObject>
#include <QHttp>
#include <QFile>
#include <QDebug>

class downloader : public QObject
{
    Q_OBJECT
public:
    explicit downloader(QObject *parent = 0);
    
    void Do_Download();
signals:
    
public slots:
    void stateChanged ( int state );
    void responseHeaderReceived ( const QHttpResponseHeader & resp );
    void requestFinished ( int id, bool error );
    
private:
    QHttp *http;
};

#endif // DOWNLOADER_H
downloader.cpp
Код:
#include "downloader.h"

downloader::downloader(QObject *parent) :
    QObject(parent)
{
}

void downloader::Do_Download() {
    http = new QHttp(this);

    connect(http, SIGNAL(stateChanged(int)), this, SLOT(stateChanged(int)));
    connect(http, SIGNAL(responseHeaderReceived(QHttpResponseHeader)),
            this, SLOT(responseHeaderReceived(QHttpResponseHeader)));
    connect(http, SIGNAL(requestFinished(int,bool)),
            this, SLOT(requestFinished(int,bool)));

    http->setHost("notes.orgfree.com");
    http->get("/index.html");
}

void downloader::stateChanged (int state){
    switch (state) {
    case 0:
        // There is no connection to the host
        qDebug() << "Unconnected";
        break;
    case 1:
        // A host name lookup is in progress
        qDebug() << "HostLookup";
        break;
    case 2:
        // An attempt to connect to the host is in progress
        qDebug() << "Connecting";
        break;
    case 3:
        // The client is sending its request to the server
        qDebug() << "Sending";
        break;
    case 4:
        // The client's request has been sent and the client is
        // reading the server's response
        qDebug() << "Reading";
        break;
    case 5:
        // The connection to the host is open, but the client is
        // neither sending a request, nor waiting for a response
        qDebug() << "Connected";
        break;
    case 6:
        // The connection is closing down, but is not yet closed. (The
        // state will be Unconnected when the connection is closed
        qDebug() << "Closing";
        break;
    default:
        break;
    }
}

void downloader::responseHeaderReceived (const QHttpResponseHeader& resp) {
    qDebug() << "Size " << resp.contentLength();
    qDebug() << "Type " << resp.contentType();
    qDebug() << "Status " << resp.statusCode();
}

void downloader::requestFinished (int id, bool error) {
    if (error) {
        qDebug() << "Request finished with an error!";
    }
    else {
        qDebug() << "Request finished!";

        QFile *file = new QFile("C:/text.txt");
        if (file->open(QFile::Append)) {
            file->write(http->readAll());
            file->flush();
            file->close();
        }
        delete file;
    }
}

Последний раз редактировалось 8Observer8; 19.08.2013 в 07:53.
8Observer8 вне форума Ответить с цитированием
Старый 06.09.2013, 21:25   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Извиняюсь за некропостинг, но не было времени в августе-начале сентября.
8Observer8, пример хороший, но QHttp выпилен из Qt5 (он оставлен для совместимости в отдельном модуле и может быть в любой момент выпилен окончательно).
В августе видел несколько вопросов по САБЖу, поэтому решил написать статью: http://pro-prof.com/archives/1034
(там получается и парсится информация с freelance.ru)
rrrFer вне форума Ответить с цитированием
Старый 07.09.2013, 17:04   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Я думаю, целесообразно взять пример из SDK. Там не используется QHttp. находится этот пример в папке "examples" и называется "http" (C:\Qt\4.8.5_MinGw\examples\network \http). Его можно открыть через "Start" -> "All Programs" -> "Qt (версия)" -> "Examples and Demos" -> "Networking" -> "HTTP Client" -> "Documentation" и почитать описание.

8Observer8 вне форума Ответить с цитированием
Старый 03.01.2018, 15:43   #6
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

то же возникла подобная задача. в инете нашел пример, почти повторяет код из первого поста.
Но выдает ошибки:
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error

Цитата:
Код:

manager->get(QNetworkRequest(QUrl("http://www.youtube.com/")));

вроде бы тут ошибка (не проверял). Сначала надо установить хост соответствующим методом, а потом получать страницы через get собственно.
каким методом?

При чем ошибки не на всех сайтах, http://google.com ошибок не дает

Последний раз редактировалось SAMOUCHKA; 03.01.2018 в 16:07.
SAMOUCHKA вне форума Ответить с цитированием
Старый 03.01.2018, 16:24   #7
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

нашел информацию. подобные ошибки возникают из за
Цитата:
отсутствие алгоритмов шифрования в Qt для соединения с сервером.
лечится прикручиванием OpenSsl к Qt.
Информация от сюда http://vladimirispiryants.blogspot.r...httphttps.html

Опять начинаются танцы с бубном
SAMOUCHKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение информации о процессе RibGeDx Visual C++ 2 13.04.2013 14:09
c++ получение информации из файла NinjaNoob Помощь студентам 9 27.01.2013 23:52
Получение информации о принтере mutabor Общие вопросы Delphi 4 17.05.2011 16:37
Получение информации о железе FalseMaster Win Api 2 25.11.2009 06:05
Получение информации о классе Sibedir Общие вопросы Delphi 7 07.12.2007 14:37