Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Pixel от Май 18, 2013, 19:43



Название: Получение информации с сайта
Отправлено: Pixel от Май 18, 2013, 19:43
нужно тупо считать все что на сайте написано. вроде как все правильно делаю, но почему на всех сайтах выдает либо ошибку чтения либо вообще ничего никак непойму.
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";

}


Название: Re: Получение информации с сайта
Отправлено: kambala от Май 18, 2013, 20:43
попробуй connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(searshFinished(QNetworkReply*))); поставить перед manager->get(QNetworkRequest(QUrl("http://www.youtube.com/"))); и не плоди тонну QNetworkAccessManager'ов — у тебя на каждое нажатие кнопки создается новый объект.

и повыводи ответ вне зависимости от наличия ошибки.


Название: Re: Получение информации с сайта
Отправлено: Pixel от Май 18, 2013, 20:56
все попробовал. безрезультатно


Название: Re: Получение информации с сайта
Отправлено: thechicho от Май 19, 2013, 09:36
http://www.prog.org.ru/topic_24772_0.html (http://www.prog.org.ru/topic_24772_0.html)
в этой теме выкладывал функции, которые я юзаю для работы с сетью. они могут решить твою проблему.
вообще подумай нужен ли тебе c++/qt для твоей задачи. это мозгоделание еще то, пока не поймешь как оно работает.


Название: Re: Получение информации с сайта
Отправлено: keekdown от Май 19, 2013, 12:07
Моё мнение что ошибка в     
Цитировать
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(searshFinished(QNetworkReply*)));
проверь на null.Я не работал  с сетью,просто такое мнение


Название: Re: Получение информации с сайта
Отправлено: kambala от Май 19, 2013, 14:31
интересно что тут может быть null. если менеджер, то программа бы вылетела при вызове метода гет; если коннект вернет фолс, то об этом сообщится в выводе приложения.

код у тебя правильный, это что-то ютьюб выделывается. потесть на другом сайте.


Название: Re: Получение информации с сайта
Отправлено: Pixel от Май 19, 2013, 15:36
тестил очень многие сайты. ответил только google.com и то вывел нечто невнятное


Название: Re: Получение информации с сайта
Отправлено: alex312 от Май 19, 2013, 17:05
Примерно так должен выглядеть запрос, что б ему отвечали приличные сайты
Код
C++ (Qt)
   QNetworkRequest request(url);
   request.setRawHeader("Host", "XXX.uz.gov.ua");
   request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0");
   request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
   request.setRawHeader("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
   request.setRawHeader("Accept-Encoding", "deflate");
   request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
   request.setRawHeader("Referer", "http://XXXXX.uz.gov.ua/ru/");
   request.setRawHeader("Connection", "keep-alive");
   request.setRawHeader("Pragma", "no-cache");
   request.setRawHeader("Content-Length", "0");
 
   QNetworkReply* reply = accessManager_->get(request);
   connect(reply, SIGNAL(finished()), this, SLOT(finishLoadCities()));
 


Название: Re: Получение информации с сайта
Отправлено: Serr500 от Май 19, 2013, 17:12
Вот простенький работающий проект. Ошибок не выдаёт.


Название: Re: Получение информации с сайта
Отправлено: thechicho от Май 19, 2013, 20:59
request.setRawHeader("Accept-Encoding", "deflate");
а чем ответ разархивировать будешь, если в deflate придет?

request.setRawHeader("Host", "XXX.uz.gov.ua");
request.setRawHeader("Pragma", "no-cache");
request.setRawHeader("Content-Length", "0");
нафик не надо. для пост запроса Content-Length автоматически формируется

request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
для пост-запроса. для простой формы. для гет-запроса не нужен(в большинстве случаев). теоретически может вызвать проблемы


Название: Re: Получение информации с сайта
Отправлено: Pixel от Май 19, 2013, 23:38
thechicho, напиши плз как надо тогда? и если не c++/qt что тогда? плагин для браузера? придется же тонну литературы перечитать.


Название: Re: Получение информации с сайта
Отправлено: thechicho от Май 20, 2013, 09:31
а чо за прогу ты хочешь на youtube написать? накрутчик?


Название: Re: Получение информации с сайта
Отправлено: Pixel от Май 20, 2013, 17:28
ютюб был пример. мне нужно считывать данные из таблицы на сайте. и далее проводить с ними операции. с сишником и qt проблем никаких нету, но вот как именно считать эти данные я не знаю


Название: Re: Получение информации с сайта
Отправлено: alex312 от Май 20, 2013, 17:54
ютюб был пример. мне нужно считывать данные из таблицы на сайте. и далее проводить с ними операции. с сишником и qt проблем никаких нету, но вот как именно считать эти данные я не знаю
В своем любимом браузере открываешь расширение для разработчиков  и смотришь какие запросы отправляются, какие ответы приходят. Потом аккуратненько переносиш все в Qt/c++.


Название: Re: Получение информации с сайта
Отправлено: thechicho от Май 20, 2013, 18:11
//с сишником и qt проблем никаких нету, но вот как именно считать эти данные я не знаю
в смысле не знаешь? ты же сам писал
QString data = QString::fromUtf8(networkReply->readAll());


Название: Re: Получение информации с сайта
Отправлено: Pixel от Май 20, 2013, 18:23
thechicho, ну тему то не просто так создал)) смотри сабж
alex312, а вот с этого места можно по подробней?) на примере хрома. ну инструменты открыл дальше как посмотреть запросы и как скопировать в qt?)


Название: Re: Получение информации с сайта
Отправлено: thechicho от Май 20, 2013, 18:37
чо смотри сабж? чо ты хочешь вообще я не пойму.
тебе дали примеры кода. парси сайт, парси таблицу. в чем проблема?


Название: Re: Получение информации с сайта
Отправлено: alex312 от Май 20, 2013, 18:38
alex312, а вот с этого места можно по подробней?) на примере хрома. ну инструменты открыл дальше как посмотреть запросы и как скопировать в qt?)
Хром не установлен. Прилагаю картинку для Огнелиса. В Qt надо копировать с умом  :D


Название: Re: Получение информации с сайта
Отправлено: Pixel от Май 20, 2013, 19:28
Вобщем из всего предложенного заработал только пример, сделанный Serr500. Спасибо ему за то что не поленился написать пример =)
alex312, кажется понял)


Название: Re: Получение информации с сайта
Отправлено: thechicho от Май 20, 2013, 20:16
почти сутки прошли и до тебя только сейчас дошло, что тебе вчера еще выложили рабочий пример?
или ты только сейчас "не поленился" его скачать и проверить?
*FACEPALM*