Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Загрузка исходника html страницы

Автор: RazrFalcon 16.7.2010, 0:40

Пример: нужно узнать рейтинг фильма на "кинопоиске" (ссылка на страницу имеется).
С чего начать, совсем непонятно.

Раскрывающийся текст
<div style="color: #f60; font-family: tahoma; font-size: 25px"><a href="/level/83/film/301/" class="continue" style="background: url(/images/dot_or.gif) 0 93% repeat-x; font-weight: normal !important; text-decoration: none">8.496<span style="font:100 14px tahoma, verdana">&nbsp;&nbsp;44&nbsp;168</span></a>
</div>
8.496 как раз и надо получить. :(

Автор: Litkevich Yuriy 16.7.2010, 0:43

ты не знаешь как загрузить страницу?

Автор: RazrFalcon 16.7.2010, 0:47

Цитата(Litkevich Yuriy @ 16.7.2010, 0:43) *
ты не знаешь как загрузить страницу?
Нуу... и это тоже. Но мне то ее открывать и просматривать не нужно, только текст нужен.
PS: тут ниже есть моя тема, я там пытался передать сообщение через инет (переделка Network Chat Client на инет), но дальше лана изначального так нечего и не вышло. :(

Автор: ufna 16.7.2010, 9:33

QNetworkAssistant + QNetworkReply

Примеры есть повально в тот же гугле.

А как разбирать страницу на кусочки - это уже на тему парсеров, тут я обычно делаю слишком топорно, если позволяет сайт ))

Автор: RazrFalcon 9.8.2010, 16:11

Можно какой то, любой, пример. Мучаюсь-мучаюсь а ничего не выходит толкового.
Как просто вывести xml код веб-страницы в тот же QTextEdit.
Заранее спасибо всем откликнувшимся.

Автор: kwisp 19.8.2010, 9:30

вышло что нибудь толковое или нет?

Автор: RazrFalcon 26.8.2010, 23:12

Цитата(kwisp @ 19.8.2010, 9:30) *
вышло что нибудь толковое или нет?

Да ничего совсем.
http://www.forum.crossplatform.ru/index.php?showtopic=5215
тут разбирался с работой с инетом, если что, там есть и пример выложенный.
А на счет скачки то кроме wget(под Linux, хотя и в Win можно) никак пока. Качал страницы и потом открывал их уже в QT. Пеньколодисто конечно, но другого ничего так и не вышло. К слову, страницу кинозала не скачать, стоит защита от скачивания сайта, типа чтоб сервера не перегружались ну и инфу не тырили на свои рекламо-сайты. Есть статьи для wget, типа обход запрета через шифровку под браузер, но так ничего и не вышло у меня.
Видел такое уже здесь некоторые спрашивали, но так до сих пор без ответа.

Автор: kwisp 27.8.2010, 9:03

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

Автор: RazrFalcon 27.8.2010, 10:41

Цитата(kwisp @ 27.8.2010, 9:03) *
скинь сайт этого кинозала.

Ступил :lol: :lol: :lol:
Кинопоиск а не кинозал, http://www.kinopoisk.ru/level/1/film/397220/
вот к примеру нужно здесь узнать рейтинг, который выглядит как X.XXX
Ну и похожее можно повторить с http://www.imdb.com/title/tt0791205/
Некоторые интересовались возможностью узнать свой ip с http://www.whatismyip.com/

Автор: kwisp 27.8.2010, 11:12

RazrFalcon,
ну самое быстрое но не самое красивое решение это использовать QWebView. загружать туда страничку - сохранять и парсить. это по быстрому.
по медленному это ethereal`ом или другим снифером. посмотреть в каком виде отправляется запрос на сервер какие поля какие значения имеют из браузера. сделать такой же запрос QNetworkAccessManager`ом.

П.С.
ставлю wireshark

Автор: ufna 27.8.2010, 11:20

Не, ну реально, посмотреть любой пример с QNetwortAccessManager, QNetworkReply() и get() религия не позволяет? О_о

Автор: kwisp 27.8.2010, 11:35

ufna,
тебе же говорят - сервер не дает страничку если ты не браузер. я сейчас только что проверил. надо под браузер шифроваться для этого надо знать значени полей http запроса отправляемого браузером. я их наизусть не помню - поставлю wireshark посмотрю. )

Автор: ufna 27.8.2010, 11:42

Извини за резкость, но задача в ассистанте разобрана на кучу раз.

Минимальный пример:

a_teststate.h
//-----------------------------------------------------------------------------
// 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



a_teststate.cpp
//-----------------------------------------------------------------------------
// 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;
}





а, счас проверим

Цитата(kwisp @ 27.8.2010, 12:35) *
ufna,
тебе же говорят - сервер не дает страничку если ты не браузер. я сейчас только что проверил. надо под браузер шифроваться для этого надо знать значени полей http запроса отправляемого браузером. я их наизусть не помню - поставлю wireshark посмотрю. )


счас проверим. В принципе, там проверка либо по яве, либо по тому что шлется в юзер-агент.

Автор: kwisp 27.8.2010, 11:49

ну проверь.
о результатах доложить:)

Автор: BRE 27.8.2010, 11:54

Нужно "прикинутся" и все он будет отдавать. :)

    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" );


Автор: ufna 27.8.2010, 11:55

В примере выше моем делаем в конструкторе:

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);

/* далее по тексту */


На выходе - то что нужно. Только в qDebug() все данные пихать не надо, т.к. размер большой - ничего не выведет. По кускам - все отлично.

Практически одновременно с BRE отписались :)

Автор: kwisp 27.8.2010, 11:58

другое дело.:)

и так тоже работает

Цитата
wget -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.437.3 Safari/534.1" http://www.kinopoisk.ru/level/1/film/397220/


потом можно так
Цитата
grep "repeat-x; font-weight: normal \!important; text-decoration: none" ./index.html | sed 's/.* none">/ /g' | sed 's/<span.*/ /g'

можно конечно пооптимальнее обработать но 8,202 я получил с твоей странички

Автор: RazrFalcon 27.8.2010, 13:22

Цитата(kwisp @ 27.8.2010, 11:58) *
wget -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.437.3 Safari/534.1" http://www.kinopoisk.ru/level/1/film/397220/

Похожее находил, тока пример тот не работал. А это пашит, я в шоке! :o:
Я конечно еще не такой МОЗГ как остальные тут, ну надеюсь разберусь потихоньку.
По крайней мере половина слов мне еще не знакома :lol: (ethereal снифер wireshark парсить и тд.)
Как говорится: вики в помощь, сейчас поучимся уму разуму.

ufna, я еще разбираюсь с QNetwortAccessManager...

Автор: k0p4 18.9.2010, 21:01

А как скачать большой файл? К примеру

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();
}

выдаёт критическую ошибку.

Автор: k0p4 19.9.2010, 10:41

Решил свою проблему. Код лежит http://paste.org/pastebin/view/22552, если кому-то интересно.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)