Несовпадение результатов браузера и кода при получении страницы с помощью QNetworkRequest и QNetworkAccessManager

Я пишу простой веб-паук. Идея состоит в том, чтобы получить страницу программно с помощью QNetworkAccessManager, QNetworkReply и QNetworkRequest, все отлично работает.

Проблема, с которой я сталкиваюсь, заключается в том, что (для некоторых страниц) я получаю разные/несоответствующие результаты программно или при посещении страницы вручную с помощью браузера. Я всегда получаю синтаксически правильные HTML-страницы, но они выглядят для меня своего рода ответами «защиты от пауков». Страницы, на которые я ссылаюсь, НЕ ЯВЛЯЮТСЯ POST-страницами, тесты, которые я делаю, это очень простые URL-страницы, иногда с параметрами (например, www.sample.com/index.php?param=something), иногда даже с простой страницей. .html URL-адреса.

Псевдокод выглядит следующим образом:

QNetworkRequest req;
req.setUrl(QUrl(myurl));
req.setRawHeader(*I did try this one with no success*);
QNetworkAccessManager man;
QNetworkReply rep = man->get(req);
//finish and error slots connection code here

. . .

void replyFinished()
{
    QNetworkReply* rep = qobject_cast<QNetworkReply *>(sender());
    if (rep->error() == QNetworkReply::NoError)
    {
        // read data from QNetworkReply here
        QByteArray bytes = rep->readAll();
        QString stringa(bytes); 
        qDebug() << stringa;
    }
}

В слоте finish () я печатаю данные из сетевого ответа, и иногда я получаю несоответствующие результаты из простой операции «Просмотр исходного кода» в браузере, полученной путем посещения вручную URL-адреса.

Иногда я получаю пользовательскую страницу «Не найдено», иногда более странные страницы с формами входа или другим неожиданным содержимым. Может быть, это какая-то защита от пауков? Кто-нибудь может помочь?


person Dario Corno    schedule 05.09.2012    source источник


Ответы (1)


Существует 3 основных метода защиты от веб-пауков:

  • Идентификация веб-браузера — с помощью заголовков сообщений веб-сайт видит разницу между браузером и веб-сканерами. Вы пишете, что использовали необработанные заголовки - вы уверены, что предоставляете те же заголовки и значения, что и ваш браузер?
  • Данные сеанса/куки - тесно связаны с предыдущими. Формы входа предполагают, что веб-сайт ожидает получить некоторую информацию, которую обычно отправляет браузер.
  • Код Javascript печатает фактические данные html в веб-документ. Вы проверяете, получаете ли вы тот же код HTML, проверяя источник веб-сайта в своем веб-браузере (просмотр-> источник), или вы проверяете макет HTML с помощью какого-либо инструмента, такого как Firebug?
  • Перенаправление Javascript — браузер загружает веб-сайт, который использует javascript, чтобы перенаправить вас на веб-сайт с актуальным содержимым.

Что касается первых двух вариантов, вам следует использовать какой-нибудь сниффер tcp/ip, например Smart sniff чтобы проверить, совпадают ли данные, отправленные браузером, с данными, отправленными вашей программой. Если оно равно, это означает, что вы, вероятно, сталкиваетесь с каким-то javascript-барьером. Если это так, вы можете попробовать использовать какой-нибудь механизм просмотра с поддержкой JavaScript, например QWebPage. Я не знаю, выполняет ли он свой javascript, когда не подключен к какому-либо QWebView хотя - возможно, потребуется скрытый вид.

Если я оказываюсь в ситуации, когда мне нужно олицетворять браузер какой-либо удаленной службе, я обычно просто пишу Firefox-плагин (используя javascript); что обычно устраняет любую из вышеперечисленных проблем;)

person j_kubik    schedule 05.09.2012