jQuery + AJAX + (Google Search API || Yahoo Search API)

Как понятно из заголовка – данный пост будет посвящен работе с Google Search API и Yahoo Search API посредством JavaScript бибилотеки jQuery.

Материалы данной статьи включены в учебник «jQuery для начинающих». Учебник распространяется бесплатно, и сопровождается интерактивными примерами.

Yahoo Search AJAX API

Начну с использования Yahoo Search API. И на то есть 2 причины:

  1. Сервис Google более глючная штука нежели у Yahoo (зелен он еще)
  2. Yahoo не обращает внимание на атрибут ref=”nofollow”, за счет чего его выдача более полная

Итак приступим, для начала нам понадобиться зарегистрировать аккаунт Yahoo и получить “Application Id”.

Вашей “любимой” закладкой на время станет http://developer.yahoo.com/search/.

Далее решим для себя какой поиск нас интересует (все ссылки на соответствющие разделы документации по Yahoo API):

  • Audio Search
    • Album Search
    • Artist Search
    • Download Location
    • Song Search
  • Autos Custom
  • Content Analysis
  • Image Search
  • Local Search
    • Local Search V3
  • MyWeb 2.0
    • Related Tags
    • Tag Search
    • URL Search
  • News Search
  • Site Explorer
    • Pages
    • Inlinks
    • Update Notification
  • Video Search
  • Web Search
    • Web Search
    • Context Search
    • Related Queries
    • Spelling Suggest

Их много, но выберем один – Web Search, на нем и будем дальше эксперементировать.

Составляем REST запрос

По ссылкам приведенным выше получаем базу нашего URL, для Web Search это:
http://search.yahooapis.com/WebSearchService/V1/webSearch

Добавляем Ваш API ID appid=YahooDemo и сам запрос query=PHP (прежде чем добавить запрос его необходимо подготовить используя функцию encodeURIComponent)

В итоге получаем следующий URL:

http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&query=PHP

Это наш необходимый минимум, но XML – это не самый удобоваримый формат для JavaScript’a, нам больше симпатичен JSON, и даже лучше JSONP. Для этого нам необходимо указать формат вывода используя параметр output. Для использования прелестей JSONP нам необходимо так же указать имя callback функции, и теперь наш URL будет выглядеть следующим образом:

http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&output=json&callback=foo&query=PHP

JavaScript

А теперь возьмем jQuery и получим следующую конструкцию:

$.getJSON("http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&output=json&query=PHP&callback=?",
function(data){
    var ul = document.createElement("ul");
    $.each(data.ResultSet.Result, function(i, val){
           var li = document.createElement("li");
        	var inner = '<a href="'+val.Url+'" title="'+val.Url+'" target="_blank">'+val.Title+"</a>";
        	if (val.Summary != "" && val.Summary != "undefined") {
        		inner += " - "+val.Summary;
        	}
        	li.innerHTML = inner;        						
        	ul.appendChild(li);
    });
    $('body').html(ul);
});

Данный пример аналогичен следующему:

$.ajax({
            // AJAX-specified URL
           url: "http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&output=json&query=PHP&callback=?",
           dataType : "jsonp",
           // Handle the success event
           success: function (data) {
               // equal to previuos example
               // ...
           }
});

Примечание: запрос мы чуть-чуть изменили – теперь он оканчивается на …&callback=? – это необходима, чтобы jQuery подставил правильное имя callback функции в запрос. Callback функция в данном примере создает список UL, в котором элементы LI будут соответствовать результатам поиска. (у каждого типа поиска свои, специфические поля, более подробное описание смотрите по вышеприведенным ссылкам).

Как мы видим все достаточно просто – теперь вывод результатов поиска ложится полностью на вашу фантазию…

Google Search AJAX API

Если Вы уже сталкивались с Google Search AJAX API, то знаете – у них есть чудная JavaScript библиотека, которую достаточно проблематично кастомизировать под конкретные нужды, поэтому, по аналогии с Yahoo API воспользуемся JSONP. Но прежде… нам потребуется получить “AJAX Search API Key”.

Отправной точкой для нас будет страница: http://code.google.com/apis/ajaxsearch/documentation/reference.html

Составляем REST запрос

Выбираем тип поиска, и соответствующий базовый URL:

  • Web Search – http://ajax.googleapis.com/ajax/services/search/web
  • Local Search – http://ajax.googleapis.com/ajax/services/search/local
  • Video Search – http://ajax.googleapis.com/ajax/services/search/video
  • Blog Search – http://ajax.googleapis.com/ajax/services/search/blogs
  • News Search – http://ajax.googleapis.com/ajax/services/search/news
  • Book Search – http://ajax.googleapis.com/ajax/services/search/books
  • Image Search – http://ajax.googleapis.com/ajax/services/search/images

Необходимо указать три параметра – это версия API – v=1.0, Ваш API Key key=your-key и непосредственно сам запрос q=PHP (ключ не является обязательным параметром, но очень рекомендуемый):

http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=PHP

Примечание: у каждого типа поиска есть свои специфические параметры, все они описаны в документации.

JavaScript

Теперь возвращаясь к нашему любимому JSONP – Google сделал нам медвежью услугу – для организации JSONP он предусмотрел целых два параметра – callback и context и они являются взаимообязательными, и параметр context будет всегда возвращаться нам в callback функцию в качестве первого параметра (сие сделано для того, чтобы мы могли различать одновременные обращения к API). Но есть одна загвоздка – для работы с jQuery сие не подходит, т.к. jQuery ожидает в качестве первого параметра данные, по этой причине пришлось пойти на хитрость и создать промежуточную callback функцию:

// callback function
function GoogleCallback (func, data) {
    window[func](data);
}

Теперь мы готовы “спрашивать”:

// change key!!!
$.getJSON("http://ajax.googleapis.com/ajax/services/search/web?v=1.0?key=your-key&q=PHP&callback=GoogleCallback&context=?",
function(data){
    var ul = document.createElement("ul");
    $.each(data.results, function(i, val){
        	var li = document.createElement("li");
        	li.innerHTML = '<a href="'+val.url+'" title="'+val.url+'" target="_blank">'+val.title+"</a> - "+val.content;      						
        	ul.appendChild(li);
    });
    $('body').html(ul);
});

Примечание: у каждого типа результатов свои свойства, более подробную информацию найдете в документации.

Как видим – теперь мы не ограничены “возможностями” Google JavaScript бибилотеки, и вольны распоряжаться данными на свое усмотрение, чего собственно и добивались…

P.S. Используя подобный подход – мы снимаем ограничение на представление данных, и что немаловажно – перекидываем нагрузку с сервера на клиента (именно таким образом организован поиск на сайте analyser.hohli.com).

30 thoughts on “jQuery + AJAX + (Google Search API || Yahoo Search API)”

  1. Замечательный обзор, Антон! Как раз сам хотел разобраться с поисковыми API. Спасибо.

  2. разве AJAX способен делать CrossDomain-запросы? вроде это только через getScript в jQuery возможно

  3. @sunnybear:
    Вы конечно же правы – XMLHttpRequest к другому домену не возможен, но это не относится к двум другим способам реализации AJAX’a – а это динамическое создание IFRAME или тэга SCRIPT.
    В данном примере как раз используется подключения JavaScript’a на лету, который и содержит необходимые нам объект с результатами.

  4. @sunnybear:
    С версии 1.2 функция getScript в jQuery может стучаться к любому домену, не только к “родному”…

  5. Ошибочка

    li.innerHTML = '<a href="'+val.url+'" title="'+val.url+'" target="_blank">'+val.title+"</a> - "+val.content;

    а должно:

    var inner = '<a href="'+val.url+'" title="'+val.url+'" target="_blank">'+val.title+"</a> - "+val.content;

    Спасибо за инфу. Поначалу думал заюзать твои скрипты c analyser.hohli.com, но решил что они мне непотходят под мою задачу)))

  6. @DEKODA
    Спс, исправил, только я так и не понял где Вы собирались заюзать сей скрипт?!? О_о

  7. А лучшего поисковика и не будет. Google никогда не сдаст своих позиций.

  8. Главная проблема гугла – плохая документация.
    С гуглом можно работать без промежуточной callback-функции:

        url= "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q="+escape(query)+"&callback=?";
        $.getJSON(url, function (json){
            var results = json.responseData.results;
            for (var i=0;i<results.length;++i){
                var r = results[i];
                //...
            }
        });
    

    структура результата r описана в мануале:
    http://code.google.com/apis/ajaxsearch/documentation/#fonje

  9. результаты выдачи несколько отличаются от выдачи google.ru (google.com), это у всех так или я не указала какие-то доп. параметры?

  10. @nandi:
    Результаты будут одинаковыми, если использовать англоязычный гугл-поиск – т.е. добавьте в строку адреса в браузере параметр &hl=en

  11. так было

    $url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&hl=ru&lr=lang_ru&q=".$q."&start=".$startIndex;

    если правильно понимаю, надо было сделать так

    $url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&hl=en&q=".$q."&start=".$startIndex;

    результат неверен :(

  12. @nandi:
    Я имел ввиду, что результаты поиска соответствуют англоязычному поиску (http://www.google.com/search?q=jquery&hl=en), каким образом получить результат соответствующий google.ru – я даже не знаю, собственно это вопрос не ко мне, а к google…

    1. как я понял hl это сайты на каком языке будут отображаться(ну или как то так), что бы поискать в google.ru нужно использовать gl=ru для google.com.ua gl=ua, соответственно

  13. выложите пожалуйста пример в гугл и jquery. Почему то

    $.getJSON("http://ajax.googleapis.com/ajax/services/search/web?v=1.0?key=your-key&q=PHP&callback=GoogleCallback&context=?",
    function(data){
        var ul = document.createElement("ul");
        $.each(data.results, function(i, val){
                var li = document.createElement("li");
                li.innerHTML = '<a href="'+val.url+'" title="'+val.url+'" target="_blank">'+val.title+"</a> - "+val.content;                           
                ul.appendChild(li);
        });
        $('body').html(ul);
    });

    не отрабатывает. хотя в строке состояния пишет. что выплняется запрос к ajax.googleapis.com. your-key поменял.

  14. Добрый день, Антон !

    Мне понравилась Ваша статья. Нам нужен один модуль, реализующий поиск на сайте, мы готовы его заказать у Вас.
    Пожалуйста, свяжитесь по контактам, уазанным на сплеш-скрине сайта.

    Спасибо,
    Sergei Shablovsky

  15. Антон, отличная информация по Search API Yahoo. Как раз то, что я искал. Я бы очень хотел связаться с тобой, пожалуйста, ответь на e-mail.
    Богдан

  16. Господа, никто не сталкивался с такой проблемой: всеми любимый браузер Internet Explorer при получении JSON данных в UTF-8 от гугла, не хочет смотреть на их кодировку, и на странице в windows-1251 кодировке выдает крокозябры.
    Как лечить? Прогонять через бекэнд, что бы там посылать верный заголовок, очень не хочется (
    Заранее спасибо за советы.

  17. Помогите начинающему, если не трудно.
    Решил сделать себе поиск по MySpace. Прочитал их документацию по MySpace Search API, изучил примеры по использованию getJSON и ajax. И ничего не получается. И $.ajax и getJSON и load пишут, что статус “success”, но результат возвращается только в IE. FF в Firefox говорит, что объект data в обработчике запроса нулевой! Анализатор трафика показывает, что MySpace исправно возвращает данные, которые просто куда то деваются. Content-type возвращаемых данных application/json, может в этом дело?
    Запрос делаю совершено стандартным образом:
    $.getJSON(“http://api.myspace.com/opensearch/people”,{
    searchTerms : “Ozzy”, startPage : “1”, format : “json” },function(data , status){……..
    Уже всю голову сломал, а спросить некого. Заранее спасибо.

  18. Антон, ты вымазался и почему кофе в PHP-кружке, а не в Java :)
    А, вообще, было полезно почитать. Спасибо

  19. Пробую сейчас вот прикрутить поиск к сайту но почему то ваш пример не работает можете прояснить

Comments are closed.