Пример: нужно узнать рейтинг фильма на "кинопоиске" (ссылка на страницу имеется).
С чего начать, совсем непонятно.
ты не знаешь как загрузить страницу?
QNetworkAssistant + QNetworkReply
Примеры есть повально в тот же гугле.
А как разбирать страницу на кусочки - это уже на тему парсеров, тут я обычно делаю слишком топорно, если позволяет сайт ))
Можно какой то, любой, пример. Мучаюсь-мучаюсь а ничего не выходит толкового.
Как просто вывести xml код веб-страницы в тот же QTextEdit.
Заранее спасибо всем откликнувшимся.
вышло что нибудь толковое или нет?
RazrFalcon,
скинь сайт этого кинозала.
если будет время на работе посомтрим что там.
RazrFalcon,
ну самое быстрое но не самое красивое решение это использовать QWebView. загружать туда страничку - сохранять и парсить. это по быстрому.
по медленному это ethereal`ом или другим снифером. посмотреть в каком виде отправляется запрос на сервер какие поля какие значения имеют из браузера. сделать такой же запрос QNetworkAccessManager`ом.
П.С.
ставлю wireshark
Не, ну реально, посмотреть любой пример с QNetwortAccessManager, QNetworkReply() и get() религия не позволяет? О_о
ufna,
тебе же говорят - сервер не дает страничку если ты не браузер. я сейчас только что проверил. надо под браузер шифроваться для этого надо знать значени полей http запроса отправляемого браузером. я их наизусть не помню - поставлю wireshark посмотрю. )
Извини за резкость, но задача в ассистанте разобрана на кучу раз.
Минимальный пример:
//-----------------------------------------------------------------------------
// File: a_teststate.h
//
// Desc:
//-----------------------------------------------------------------------------
#ifndef A_TESTSTATE_H
#define A_TESTSTATE_H
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
//--------------------------------------------------------------------------------------
// Name: cTestState
// Desc:
//--------------------------------------------------------------------------------------
class cTestState :
public QObject
{
Q_OBJECT
public:
// Constructor & destructor
//----------------------------------------------------------------------------------
cTestState(QObject *parent = 0);
~cTestState();
QNetworkAccessManager* networkManager() { return pNetManager; }
private:
//
//----------------------------------------------------------------------------------
QNetworkAccessManager *pNetManager;
public slots:
// control
//----------------------------------------------------------------------------------
void slotReadyRead();
void slotError(QNetworkReply::NetworkError);
void slotFinished();
};
#endif
//-----------------------------------------------------------------------------
// File: a_teststate.cpp
//
// Desc:
//-----------------------------------------------------------------------------
#include "a_teststate.h"
#include <QDebug>
//--------------------------------------------------------------------------------------
// cTestState class constructor
//--------------------------------------------------------------------------------------
cTestState::cTestState(QObject *parent)
: QObject(parent)
{
pNetManager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl(QUrl("http://ufna.ru/"));
QNetworkReply *reply = pNetManager->get(request);
connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(slotError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(finished()), this, SLOT(slotFinished()));
}
//--------------------------------------------------------------------------------------
cTestState::~cTestState() {}
//=============================================================================
// PUBLIC SLOTS
//=============================================================================
//--------------------------------------------------------------------------------------
void cTestState::slotReadyRead()
{
qDebug() << "cTestState::slotReadyRead()";
}
//--------------------------------------------------------------------------------------
void cTestState::slotError(QNetworkReply::NetworkError error)
{
qDebug() << "cTestState::slotError("
<< error << ")";
}
//--------------------------------------------------------------------------------------
void cTestState::slotFinished()
{
qDebug() << "cTestState::slotFinished()";
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
reply->deleteLater();
// Вывод загруженной страницы
QByteArray data = reply->readAll();
QString str = QString::fromUtf8(data);
qDebug() << str;
}
ну проверь.
о результатах доложить
Нужно "прикинутся" и все он будет отдавать.
QNetworkRequest req;
req.setUrl( QUrl( "http://www.kinopoisk.ru/level/1/film/397220/" ) );
req.setRawHeader( "User-Agent:", "Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.1b4) Gecko/20090427 Fedora/3.5-0.20.beta4.fc11 Firefox/3.5b4" );
В примере выше моем делаем в конструкторе:
request.setUrl(QUrl("http://www.kinopoisk.ru/level/1/film/397220/"));
request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.437.3 Safari/534.1");
QNetworkReply *reply = pNetManager->get(request);
/* далее по тексту */
другое дело.
и так тоже работает
А как скачать большой файл? К примеру
void MainWindow::slotFinished()
{
// file.close();
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
file.setFileName("lost.avi");
file.open(QIODevice::WriteOnly);
QDataStream stream( &file );
stream << reply->readAll();
file.close();
reply->deleteLater();
}
Решил свою проблему. Код лежит http://paste.org/pastebin/view/22552, если кому-то интересно.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)