Custom Google Search View

    Вы знаете, сколько данных вы качаете из сети каждый раз, чтобы увидеть вот эту страничку?



    Если без браузерного кэша, то 600 килобайт (в gzip-e) и 38 запросов. Если с кэшем, то 70 килобайт и 7-8 запросов.



    Вы знаете, что такое 600 килобайт? Это оба тома «Войны и мира» Льва Николаевича Толстого в том же gzip-e.

    Конечно, отрадно, что Google Inc. пичкает нас таким количеством полезной информации. Про сами результаты поиска даже говорить не приходится — тут и картинки, и справочная информация из Википедии, и часы работы, и карта, и отзывы. Но иногда хочется чего-то простого и лаконичного. Без изнасилованных ссылок, без продаваемых товарищу майору сторонним маркетологам твоих веб кампейнов. Чтобы не тормозило на устаревших смартфонах и перегруженных мобильных сетях.

    Можно, конечно, запроксировать запросы к поисковику через свой скрипт, с вивисекцией всего ненужного, но, к счастью, сам Google предлагает элегантное решение — доступ к своему Search API с выдачей чистых результатов в JSON или XML формате.

    Вот часть JSON ответа для примера:

    JSON
    {
     "kind": "customsearch#search",
     "url": {
      "type": "application/json",
      "template": "https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&lr={language?}&safe={safe?}&cx={cx?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&c2coff={disableCnTwTranslation?}&hq={hq?}&hl={hl?}&siteSearch={siteSearch?}&siteSearchFilter={siteSearchFilter?}&exactTerms={exactTerms?}&excludeTerms={excludeTerms?}&linkSite={linkSite?}&orTerms={orTerms?}&relatedSite={relatedSite?}&dateRestrict={dateRestrict?}&lowRange={lowRange?}&highRange={highRange?}&searchType={searchType}&fileType={fileType?}&rights={rights?}&imgSize={imgSize?}&imgType={imgType?}&imgColorType={imgColorType?}&imgDominantColor={imgDominantColor?}&alt=json"
     },
     "queries": {
      "request": [
       {
        "title": "Google Custom Search - habr",
        "totalResults": "327000",
        "searchTerms": "habr",
        "count": 10,
        "startIndex": 1,
        "inputEncoding": "utf8",
        "outputEncoding": "utf8",
        "safe": "off",
        "cx": "0019687164026253:oi9ssr7ci6e"
       }
      ],
      "nextPage": [
       {
        "title": "Google Custom Search - habr",
        "totalResults": "327000",
        "searchTerms": "habr",
        "count": 10,
        "startIndex": 11,
        "inputEncoding": "utf8",
        "outputEncoding": "utf8",
        "safe": "off",
        "cx": "00156687164026253:oi9ssr7ci6e"
       }
      ]
     },
     "context": {
      "title": "v-gornom.ru"
     },
     "searchInformation": {
      "searchTime": 0.531851,
      "formattedSearchTime": "0,53",
      "totalResults": "327000",
      "formattedTotalResults": "327 000"
     },
     "items": [
      {
       "kind": "customsearch#result",
       "title": "Лучшие публикации за сутки / Хабр",
       "htmlTitle": "Лучшие публикации за сутки / \u003cb\u003eХабр\u003c/b\u003e",
       "link": "https://habr.com/",
       "displayLink": "habr.com",
       "snippet": "Хабр – самое крупное в Рунете сообщество людей, занятых в индустрии \nвысоких технологий. Уникальная аудитория, свежая информация, ...",
       "htmlSnippet": "\u003cb\u003eХабр\u003c/b\u003e – самое крупное в Рунете сообщество людей, занятых в индустрии \u003cbr\u003e\nвысоких технологий. Уникальная аудитория, свежая информация, ...",
       "cacheId": "Wg3CgcvcAxUJ",
       "formattedUrl": "https://habr.com/",
       "htmlFormattedUrl": "https://\u003cb\u003ehabr\u003c/b\u003e.com/",
       "pagemap": {
        "cse_thumbnail": [
         {
          "width": "311",
          "height": "162",
          "src": "https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcT9MbmejtANdWSuXxH7pxKqWNFFRzPiTQuLmhWk5Tc5-Y-AgUgPrwEz0MV9"
         }
        ],
        "metatags": [
         {
          "viewport": "width=1024",
          "fb:app_id": "444736788986613",
          "og:type": "website",
          "fb:pages": "472597926099084",
          "og:site_name": "Хабр",
          "og:image": "https://habr.com/images/habr.png",
          "og:image:width": "1200",
          "og:image:height": "628",
          "og:title": "Лучшие публикации за сутки / Хабр",
          "og:description": "Хабр – самое крупное в Рунете сообщество людей, занятых в индустрии высоких технологий. Уникальная аудитория, свежая информация, конструктивное общение и коллективное творчество – всё это делает Хабр самым оригинальным IT-проектом в России.",
          "yandex-verification": "71593b225aeafc4e",
          "referrer": "unsafe-url",
          "pocket-site-verification": "ed24b2b9721edf0a282c5b4a3232c4",
          "application-name": "Хабр",
          "msapplication-tilecolor": "#77a2b6",
          "theme-color": "#77a2b6"
         }
        ],
        "cse_image": [
         {
          "src": "https://habr.com/images/habr.png"
         }
        ]
       }
      },
      {
       "kind": "customsearch#result",
       "title": "Хабр — Википедия",
       "htmlTitle": "\u003cb\u003eХабр\u003c/b\u003e — Википедия",
       "link": "https://ru.wikipedia.org/wiki/%D0%A5%D0%B0%D0%B1%D1%80",
       "displayLink": "ru.wikipedia.org",
       "snippet": "Хабр (бывший Хабрахабр) — русскоязычный веб-сайт в формате \nколлективного блога с элементами новостного сайта, созданный для \nпубликации ...",
       "htmlSnippet": "\u003cb\u003eХабр\u003c/b\u003e (бывший \u003cb\u003eХабрахабр\u003c/b\u003e) — русскоязычный веб-сайт в формате \u003cbr\u003e\nколлективного блога с элементами новостного сайта, созданный для \u003cbr\u003e\nпубликации ...",
       "cacheId": "lB7MkUOxB7gJ",
       "formattedUrl": "https://ru.wikipedia.org/wiki/Хабр",
       "htmlFormattedUrl": "https://ru.wikipedia.org/wiki/\u003cb\u003eХабр\u003c/b\u003e",
       "pagemap": {
        "cse_thumbnail": [
         {
          "width": "220",
          "height": "130",
          "src": "https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQqJU0itnwYGZAd6Z5aMJO0izPfF7cab6pc40vm0sujOP2dSgkP-UB0Je1T"
         }
        ],
        "metatags": [
         {
          "referrer": "origin",
          "og:image": "https://upload.wikimedia.org/wikipedia/ru/7/7f/Habrahabr_logo.png"
         }
        ],
        "cse_image": [
         {
          "src": "https://upload.wikimedia.org/wikipedia/ru/7/7f/Habrahabr_logo.png"
         }
        ]
       }
      },


    В этой статье мы напишем View для Google Custom Search, которое будет обладать мощью Google и удовлетворять наши приземленные желания.

    Чтобы получить доступ Google Custom Search API сперва нужно получить идентификатор своей поисковой системы. Для этого надо зарегистрировать систему пользовательского поиска на странице cse.google.com

    Заходим на сайт, добавляем поисковую систему, указываем произвольный сайт, заходим в панель управления и получаем идентификатор поисковой системы.

    Теперь надо получить токен для доступа к Custom Search API.

    Заходим на console.cloud.google.com (предполагается, что аккаунты на обоих сайтах у вас уже есть), создаем проект, в левом боковом меню выбирает «API и сервисы» → «Панель управления» → «Включить API и сервисы», ищем там «Custom Search API», выбираем, включаем, затем создаем учетные данные — а именно, «Ключ API». Можно ограничить использование данного ключа только на своих IP, можно не делать этого.

    Всё. Теперь мы можем отправлять запросы Google вот такой строкой:

    https://www.googleapis.com/customsearch/v1?key={apikey}&cx={sid}&q=query

    Где {apikey} — токен доступа, {sid} — идентификатор поиска.

    В ответ мы получим чистенький JSON.

    C помощью простого php скрипта мы получаем наше View, даже с некоторым приближением к оригиналу. Первая страница:

    Результаты поиска:



    Первая страничка — 2Кб, с результатами поиска — 6Кб.

    Дело тут не только в минимализме. Google в JSON ответе выдает кучу интересной информации и позволяет задать запрос с не меньшей кучей параметров. Подробнее тут. Можно даже сделать то, что не позволяет основная страница поисковика.

    Есть, конечно, и минусы — ограничение в 100 запросов в день. Остальное за доллары.

    Кстати, захостить наш php скриптик можно тоже на Google и тоже абсолютно бесплатно — на https://appengine.google.com. Правда, тут уже придется изрядно помучиться — FTP, web file manager и корневые директории сайта для Google рудименты. Поэтому придется превратить php скрипт в аппликейшн, засунуть его в энджин и с помощью специальной консоли задеплоить в облака.

    Задача, на самом деле, не тривиальная. Не зря Google собирается вводить новую сертификацию — Google Certified User.

    Комментарии 10

      +1
      Интересно в сравнении с 1996 годом и что качала и требовала www.altavista.com. эх, было время…
        +2
        Спасибо за вашу статью. Хочу узнать: можно ли точно такое же сделать и для яндекса?
        Да и сто запросов в день всё таки напрягают.
        Благодарю!
          +1

          Было бы прикольно сделать две колонки с выдачей обоих.

            0
            Есть в XML формате — https://tech.yandex.ru/xml/
            Ограничения — около 1000 запросов в день, и можно посылать запросы только с одного зарегистрированного IP.
              0
              Еще можно купить запросы на специализированных биржах, например xmlstock.com
            0

            Собственно это же поиск только по конкретному сайту. Без указания сайта по которому происходит поиск использовать нельзя.

              0

              UPD: А нет. Все-таки можно. Только после создания поиска нужно удалить введенный сайт и включить "Поиск в Интернете".

              0
              А плееры Youtube? 400kb скрипта. Я писал тут подробнее
              habr.com/post/417039
                +1
                А можно просто заблокировать для гугла джаваскрипт и получить 7 запросов 20 кб на главной и 12 запросов 45 кб на странице результатов. Не настолько минималистично, как в статье, но тоже очень компактно.
                  0
                  Custom Google Search конечно хороший инструмент, но очень дорогой.
                  Можно совершать запросы через Google XML, по типу как Яндекс XML, и стоит в разы дешевле, всего от 10 руб за 1000 запросов.

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое