Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

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

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

Ответ
 
Опции темы
Старый 18.05.2013, 23:58   #1
Pixelrom33
Пользователь
 
Регистрация: 23.02.2012
Сообщений: 32
Репутация: 10
По умолчанию [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,595
Репутация: 972
По умолчанию

Код:

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
Профессионал
 
Регистрация: 02.01.2011
Сообщений: 3,238
Репутация: 915
По умолчанию

Вот хороший учебный пример. Содержимое страницы "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,595
Репутация: 972
По умолчанию

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

Я думаю, целесообразно взять пример из 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, 16:43   #6
SAMOUCHKA
Участник клуба
 
Регистрация: 07.08.2011
Адрес: Димитровград
Сообщений: 561
Репутация: 126

skype: ilya10009
По умолчанию

то же возникла подобная задача. в инете нашел пример, почти повторяет код из первого поста.
Но выдает ошибки:
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 ошибок не дает
__________________
eremeew.ilya@yandex.ru

Последний раз редактировалось SAMOUCHKA; 03.01.2018 в 17:07.
SAMOUCHKA вне форума   Ответить с цитированием
Старый 03.01.2018, 17:24   #7
SAMOUCHKA
Участник клуба
 
Регистрация: 07.08.2011
Адрес: Димитровград
Сообщений: 561
Репутация: 126

skype: ilya10009
По умолчанию

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

Опять начинаются танцы с бубном
__________________
eremeew.ilya@yandex.ru
SAMOUCHKA вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение информации о процессе 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 07:05
Получение информации о классе Sibedir Общие вопросы Delphi 7 07.12.2007 15:37


14:34.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru