Russian Qt Forum

Qt => Работа с сетью => Тема начата: NickSergeev от Сентябрь 03, 2013, 21:06



Название: Получение любой http страницы
Отправлено: NickSergeev от Сентябрь 03, 2013, 21:06
Весь день промучился с получением html кода страницы, так и не получилось сделать универсального решения. Делал всё это посредством QNetworkAccessManager, очень похоже что запрещает удалённый сервер таким образом получать исходный код страницы, тестировал на нескольких сайтах. Поэтому пришёл на форум за помощью, задача следующая:

реализовать QT класс, в конструкторе которого задаётся нужная страница ( например: http:\\google.com ), и есть метод с помощью которого можно получать html содержимое этой страницы полностью.

Тестировал на сайтах по спортивной тематике: football-lineups.com, marathonbet.com, 24score.com, везде у меня содержимое страницы урезалось, а на последнем вообще возвращалось ""

Чтобы как - то простимулировать, обещаю награду в 500 рублей за такую реализацию. Это помимо того, что поможете очень хорошему человек)) Тестировать буду на этих сайтах, которые приводил выше


Название: Re: Получение любой http страницы
Отправлено: kambala от Сентябрь 03, 2013, 22:04
все 3 сайта у меня загружаются без всяких проблем через QNetworkAccessManager, ничего не обрезается. проверял этим: http://www.prog.org.ru/index.php?topic=18530.msg124691#msg124691 переделать под то, что ты хочешь, можно за 5 минут.


Название: Re: Получение любой http страницы
Отправлено: BuRn от Сентябрь 03, 2013, 22:47
В интернете примеров куча. Ваш код увидеть можно ? У меня тоже периодически возникает проблема с получением кода страницы на определенный сайт, но это уже проблема связанная с блокировкой и баном моего адреса. На компиляцию не проверял, но будет что - то типа :
Код:
class DownloadPage:QObject
{
Q_OBJECT
private slots:
   replyFinished(QNetworkReply* reply){
   if(reply->error()==QNetworkReply::NoError)
   {
      html = QString(reply->readAll());
      emit EndLoad(html);
   }
   else
     qDebug()<<"Error load page";
  
}
signals:
void EndLoad(QString);
public:
    DownloadPage(QUrl _url){
    url = _url;
    manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
         this, SLOT(replyFinished(QNetworkReply*)));
    manager->get(QNetworkRequest(url));
}
private:
  QNetworkAccessManager *manager ;
  QString html;
  
};
Далее просто создаете объект, передав ему QUrl нужной страницы и вешаете обработчик на этот объект типа :
Код:
DownloadPage *d = new DownloadPage(QUrl("http://google.com"));
connect(d,EndLoad(QString),this,вашафункция(QString));
void вашафункция(QString str){qDebug()<<str;}
И да , дестркутор в класс еще нужно


Название: Re: Получение любой http страницы
Отправлено: NickSergeev от Сентябрь 04, 2013, 13:42
Ну ваш код ничем не отличается от моего, и выдаёт тоже самое на тех сайтах, странно если проблема в блокировке со стороны сервера, если можно с браузера посмотреть, то значит можно как - то и скачать исходный код.


Название: Re: Получение любой http страницы
Отправлено: Bepec от Сентябрь 04, 2013, 14:08
Смотрите заголовок ответа - может вас просто перенаправляют на заглушку?

Хм. Или же у вас антивирь какой-нить стоит, что рубит загрузку. Хотя врядли :)

PS после работы (17:00 МСК) напишу тестовую прожку и выложу сюда.


Название: Re: Получение любой http страницы
Отправлено: BuRn от Сентябрь 04, 2013, 17:07
Ну ваш код ничем не отличается от моего, и выдаёт тоже самое на тех сайтах, странно если проблема в блокировке со стороны сервера, если можно с браузера посмотреть, то значит можно как - то и скачать исходный код.
А можно список сайтов ? или хотя бы 1, проверить.


Название: Re: Получение любой http страницы
Отправлено: Bepec от Сентябрь 04, 2013, 17:12
Он приведён в первом посте :)

Update: Сделал класс как просили.

Сайты оригинальные. Первый без прямого указания адреса (без www) отдаёт команду для браузеров на обновление с адресом полным (с www). Ну а остальные при неправильном наборе перенаправляют. Вроде больше ничего не нашлось.

PS ссылка на архив внизу сообщения. Исходники + тестовая программа.
https://www.dropbox.com/sh/6wvj3mcp0zssvum/pE69DriCSj/Source.zip


Название: Re: Получение любой http страницы
Отправлено: NickSergeev от Сентябрь 04, 2013, 20:43
вывод такой же как и у моей самописной программы:

например, на football-lineups.com
<html><head><meta http-equiv="refresh" content="0;url=http://www.football-lineups.com/">  </head></html>

думаю может заюзать curl


Название: Re: Получение любой http страницы
Отправлено: Bepec от Сентябрь 04, 2013, 20:52

Первый без прямого указания адреса (без www) отдаёт команду для браузеров на обновление с адресом полным (с www).

ппц специально заострил на этом внимание :D

Адрес полный пишите.

"www.football-lineups.com"
"www.marathonbet.com"
"www.24score.com"

И будет вам счастье. Просто админ football решил делать не перенаправление, а заглушку при помощи HTML. А HTML обрабатывается браузером.

PS переведу вывод этого футболса - вы ввели адрес без www, потому идите ка вы на www.



Название: Re: Получение любой http страницы
Отправлено: NickSergeev от Сентябрь 05, 2013, 11:56
 Давно видимо не прогал) И странно что он выводит всё равно чего - то)) Кидай кошелёк, скину денежку)