KL
Konstantin Lazarev20 декабря 2016 г. 10:37

Запрос позиций сайта в выдаче Google при помощи Qt

Qt, Google

Добрый день. Как при помощи Qt узнать позицию сайта в Google по запросу?
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

7
Evgenii Legotckoi
  • 21 декабря 2016 г. 2:41

День добрый.
Вопрос так вопрос… Смотря что Вы хотите получить..
Если хотите просматривать данные по своему сайту, то у Google Search Console и Google Analytics есть API.
Изучаете API и реализовываете запросы с помощью QNetworkAccessManager.

Если хотите искать инфу в поисковике по любому сайту, то можете посмотреть информацию по XML Custom Search API.

А как такового открытого API для проверок позиций сайта Google вроде бы не предоставляет… Иначе бы у всех этих сервисов проверки позиций сайта результаты были бы одинаковые.

То есть необходимо реализовывать систему запросов и обработки поисковой выдачи. Это немаленькая задача, но вполне реализуемая средствами Qt. Только не забывайте, что Google не приемлет автоматизированных средств запросов к поиску и довольно быстро попросит ввести каптчу.

    KL
    • 21 декабря 2016 г. 12:26
    При помощи парсинга выдачи Google возможно реализовать? Я могу спарсить html код страницы сайтов, которые не защищены.
    В Google стоит защита. Может, у вас есть подобная практика?
      Evgenii Legotckoi
      • 21 декабря 2016 г. 12:35
      Нет. Такой практики у меня нет.
      Но думаю, что при парсинге XML выдачи для кастомизированного поиска может что-нибудь получиться.
      Посмотрите описание XML API Reference
        KL
        • 22 декабря 2016 г. 3:56
        • Ответ был помечен как решение.

        Евгений, большое спасибо. Ваша статья очень мне помогла, как и урок, который вы написали для работы с QNetworkAccessManager. Я не совсем понял зачем создавать отдельный класс downloade, почему нельзя создать все в widget. Но запрос составил и файл скачал. Запрос выглядит примерно так:
        QUrl url(“http://www.google.ru/search?hl=ru&q=платные+комментарии&oq=платные+комментарии&lr=lang_ru&cr=countryRU&xml_no_dtd;”); // URL, к которому будем получать данные

        Подскажите, при считывании из файла идет наложение текста выглядит это примерно так:

          Evgenii Legotckoi
          • 23 декабря 2016 г. 0:43

          Пожалуйста.
          Есть интерфейс, а есть логика работы с сетью… На мой взгляд логику работы с сетью лучше выносить в отдельный класс. Хотя вы правы, можно было сделать всё в widget`е.

          Видимо, в наложении текста должна была быть картинка. Прикрепите её во вложения.

            KL
            • 24 декабря 2016 г. 14:58

            Евгений, подскажите как загрузить массив фотографий при помощи QNetworkAccessManager.
            Вот моя реализация.
            GoogleQuery::GoogleQuery(QWidget *parent) :
            QWidget(parent),
            ui(new Ui::GoogleQuery)
            {
            ui->setupUi(this);
            connect(&pageYandexTic,SIGNAL(finished(QNetworkReply*)), SLOT(on_load(QNetworkReply*)));
            QStringList list;
            QStringList.append(UrlSite1);
            QStringList.append(UrlSite2);
            QStringList.append(UrlSite3);
            }
            void GoogleQuery::on_pushButton_clicked()
            {
            for(int i=0; i<list.size(); i++)
            {
            QNetworkRequest request;
            request.setUrl(list);
            pageYandexTic.get(request); // QNetworkAccessManager отправляем запрос с урлом картинки
            }
            }
            void GoogleQuery::on_load(QNetworkReply* reply)
            {
            QPixmap pixmap;
            pixmap.loadFromData(reply->readAll());
            ui->label->setPixmap(pixmap);
            }

            Проблема в том, что изначально выполняется цикл for, а затем on_load. Картинки не успевают загрузиться.

              Evgenii Legotckoi
              • 26 декабря 2016 г. 3:21

              Вам нужно запускать скачивание следующей картинки только тогда, когда скачалась предыдущая, а не сразу запихивать все запросы в кучку.
              Правильная реализация будет такая.

              #ifndef MAINWINDOW_H
              #define MAINWINDOW_H
               
              #include <QMainWindow>
              #include <QNetworkAccessManager>
              #include <QNetworkReply>
              #include <QNetworkRequest>
              #include <QLabel>
               
              namespace Ui {
              class MainWindow;
              }
               
              class MainWindow : public QMainWindow
              {
                  Q_OBJECT
               
              public:
                  explicit MainWindow(QWidget *parent = 0);
                  ~MainWindow();
               
              private slots:
                  void on_pushButton_clicked();
                  void onLoad(QNetworkReply* reply);
               
              private:
                  Ui::MainWindow *ui;
                  QStringList urlsList;
                  QNetworkAccessManager downloader;
              };
               
              #endif // MAINWINDOW_H
              #include "mainwindow.h"
              #include "ui_mainwindow.h"
               
              MainWindow::MainWindow(QWidget *parent) :
                  QMainWindow(parent),
                  ui(new Ui::MainWindow)
              {
                  ui->setupUi(this);
                  connect(&downloader, &QNetworkAccessManager::finished, this, &MainWindow::onLoad);
               
                  urlsList.append("https://www.alfaromeousa.com/content/alfausa/en/cars/alfa-romeo-giulia-quadrifoglio/_jcr_content/image.img.png/1461766810123.png");
                  urlsList.append("https://www.alfaromeousa.com/content/alfausa/en/cars/alfa-romeo-4c-spider/_jcr_content/image.img.png/1461766874697.png");
                  urlsList.append("http://buyersguide.caranddriver.com/media/assets/submodel/7063.jpg");
              }
               
              MainWindow::~MainWindow()
              {
                  delete ui;
              }
               
              void MainWindow::on_pushButton_clicked()
              {
                  if (!urlsList.isEmpty())
                  {
                      QNetworkRequest request;
                      request.setUrl(urlsList.first());
                      urlsList.removeFirst();
                      downloader.get(request);
                  }
              }
               
              void MainWindow::onLoad(QNetworkReply *reply)
              {
                  QPixmap image;
                  image.loadFromData(reply->readAll());
                  QLabel* label = new QLabel(this);
                  label->setPixmap(image);
                  ui->verticalLayout->addWidget(label);
                  on_pushButton_clicked();
              }

               

                Комментарии

                Только авторизованные пользователи могут публиковать комментарии.
                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                e
                • ehot
                • 1 апреля 2024 г. 0:29

                C++ - Тест 003. Условия и циклы

                • Результат:78баллов,
                • Очки рейтинга2
                B

                C++ - Тест 002. Константы

                • Результат:16баллов,
                • Очки рейтинга-10
                B

                C++ - Тест 001. Первая программа и типы данных

                • Результат:46баллов,
                • Очки рейтинга-6
                Последние комментарии
                k
                kmssr9 февраля 2024 г. 5:43
                Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                АК
                Анатолий Кононенко5 февраля 2024 г. 12:50
                Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                EVA
                EVA25 декабря 2023 г. 21:30
                Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                J
                JonnyJo25 декабря 2023 г. 19:38
                Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                G
                Gvozdik19 декабря 2023 г. 8:01
                Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                Сейчас обсуждают на форуме
                a
                a_vlasov14 апреля 2024 г. 16:41
                Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                Павел Дорофеев
                Павел Дорофеев14 апреля 2024 г. 12:35
                QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                f
                fastrex4 апреля 2024 г. 14:47
                Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                P
                Pisych27 февраля 2023 г. 15:04
                Как получить в массив значения из связанной модели? Спасибо, разобрался:))
                AC
                Alexandru Codreanu19 января 2024 г. 22:57
                QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

                Следите за нами в социальных сетях