Google Search API иногда возвращает первый результат, иногда второй результат по сравнению с веб-интерфейсом

Во-первых, это не дубликат: -a-se">Почему поиск Google через API Google возвращает разные результаты поиска на веб-странице? Ни один из других вопросов "API поиска Google возвращает неожиданные результаты", которые я смог ответить найти.

Я пишу небольшую программу javascript, которая использует API веб-поиска Google. Я создаю настраиваемые ссылки для моей страницы, где купить, которые должны направлять пользователя на правильную страницу на нашем сайте дилеров, чтобы купить продукт, который они просматривали в последний раз, когда нажимали «где купить». Я использую метод javascript для document.referrer, а затем анализирую URL-адрес, чтобы определить, какую страницу моего сайта последний раз посещал пользователь.

Затем я создаю соответствующую строку запроса, ограничиваю сайт конкретным дилером, говорю Google, чтобы он возвращал только один результат, а затем запускаю запрос. Затем я использую URL-адрес, чтобы переписать HTML-код в этом конкретном div href на первый (и единственный) результат поиска. По сути, я эмулирую функции кнопки «Мне повезет», которые раньше были у Google, но структурирую запрос таким образом, чтобы получить именно тот результат, который я ищу.

Итак, теперь, когда вы знаете, что я делаю и почему я это делаю, вот где все становится странным: большинство результатов, которые я получаю, работают отлично. Они возвращают первый результат поиска. Некоторые из них (и всегда одни и те же) возвращают второй результат поиска.

Вот код, который вы можете скопировать и вставить в Code Playground сами, чтобы увидеть проблему, о которой я тоже говорю:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>

    <title>Google AJAX Search API Sample</title>
    <script src="http://www.google.com/jsapi?key=AIzaSyA5m1Nc8ws2BbmPRwKu5gFradvD_hgq6G0" type="text/javascript"></script>
    <script type="text/javascript">
google.load('search', '1');   
var SearchVariables = [
      ["alto","altomusic.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/altomusic-button.png","wp-image-6343"],
      ["acme","www.acmelectronics.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/acme-button.png","wp-image-6344"],
      ["bhphoto","www.bhphotovideo.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/bh-button3.png","wp-image-6345"],
      ["frontend","www.frontendaudio.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/frontend-button.png","wp-image-6346"],
      ["fullcompass","www.fullcompass.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/fullcompass-button3.png","wp-image-6347"],
      ["performance","www.performanceaudio.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/performance-audio-button.png","wp-image-6348"],
      ["proaudio","www.proaudiosuperstore.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/ProAudioSolutions-button.png","wp-image-6349"],
      ["rmc","www.rmcaudiodirect.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/rmc-button1.png","wp-image-6350"],
      ["sweetwater","www.sweetwater.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/sweetwater-button3.png","wp-image-6351"],
      ["vintageking","www.vintageking.com","http://www.earthworksaudio.com/wp-content/uploads/2012/03/vintageking-button3.png","wp-image-6352"]
    ];  
var Search = new Array(SearchVariables.length);
function searchComplete() {


  for(var i = 0; i < Search.length; i++){
    if (Search[i].results && Search[i].results.length > 0) {
       var contentDiv = document.getElementById(Search[i].ed[0]);
       var curURL = Search[i].results[0].unescapedUrl;
       var newImage = ' <a href="'+curURL+'"><img class="alignleft size-full '+Search[i].ed[2]+'" title="'+Search[i].ed[0]+'" src="'+Search[i].ed[1]+'" alt=" " width="235" height="94" /></a>';
       contentDiv.innerHTML = newImage;
    }
  }     
} 
function parseURLString(inString)
{
    var OutString = 'earthworks';
        inString = inString.replace(/-/g,' ');
        inString = inString.replace('zdt','');
    var MicVsPre=['preamps','microphones'];
    var idx = [];
        for(var j=0;j<MicVsPre.length;j++)
        {
          if(inString.search(MicVsPre[j])>=0)
          {
            OutString = OutString+' '+MicVsPre[j];
                  for(var i=inString.length;i>0;i--)
                  {
                    if(inString[i]=='/')
                    {
                      idx.push(i);
                    }
                  }
            OutString = OutString+' '+inString.substring(idx[0],idx[1]+1);
          }
        }
return OutString;
}

function OnLoad() {
      var String_To_Parse = 'http://www.earthworksaudio.com/microphones/qtc-series-2/qtc40/';     
      var query = parseURLString(String_To_Parse);

       var testloc = document.getElementById('vardiv');
       testloc.innerHTML = query;

      for(var i = 0; i < SearchVariables.length; i++)
      {
        Search[i] = new google.search.WebSearch();
        Search[i].setNoHtmlGeneration();
        Search[i].setResultSetSize(1);
        Search[i].setUserDefinedLabel([SearchVariables[i][0],SearchVariables[i][2],SearchVariables[i][3]]);
        Search[i].setSiteRestriction(SearchVariables[i][1]);
        Search[i].setSearchCompleteCallback(this, searchComplete,null);
        Search[i].execute(query);
      }
}
google.setOnLoadCallback(OnLoad);

    </script>
  </head>
  <body style="font-family: Arial;border: 0 none;">
    <div id="vardiv">Testing</div>
    <div id='acme'></div>
    <div id='alto'></div>
    <div id='bhphoto'></div>
    <div id='fullcompass'></div>
    <div id='frontend'></div>
    <div id='performance'></div>
    <div id='proaudio'></div>
    <div id='rmc'></div>
    <div id='sweetwater'></div>
    <div id='vintageking'></div>
  </body>
</html>​ 

Я включил пример URL-адреса страницы продукта вместо фактического использования метода document.referrer (поскольку, очевидно, вы сейчас не просматриваете мой веб-сайт), чтобы продемонстрировать, что происходит. Я также создал дополнительный тег div вверху, который показывает, какой точный поиск выполняется.

Обратите внимание, как последний в списке (винтажный король или предпоследний в решениях для профессионального аудио) вытягивают URL для ВТОРОГО результата поиска, если вы выполняете точно такой же поиск самостоятельно. Однако большинство из них корректно отображают ПЕРВЫЙ результат поиска (например: sweetwater, b&h, полный компас). Это происходит почти с каждым поиском, который я делаю на этих конкретных сайтах. Я знаю, что это никак не связано с моим браузером и моими сохраненными настройками, поскольку я пробовал это в режиме инкогнито на других компьютерах, в разных браузерах и т. д. Кто-нибудь знает, что здесь происходит? Почему я не всегда могу получить первый результат поиска из веб-поиска Google в качестве возвращаемого URL-адреса?


person dynamphorous    schedule 04.09.2012    source источник
comment
Вы уверены, что используете API веб-поиска? Он устарел уже много лет...   -  person Alex Churchill    schedule 04.09.2012
comment
Я знаю о его статусе, но, согласно google, он должен продолжать функционировать в обозримом будущем с единственным ограничением на количество запросов в день, и не будет обновлений, которые могли бы нарушить функциональность моей программы. Учитывая простой характер того, для чего я его использую, я не вижу проблем, которые заставили бы меня перейти на их пользовательский API поиска, поскольку с ним сложнее выполнить то, что я пытаюсь сделать.   -  person dynamphorous    schedule 04.09.2012
comment
Хм... Я больше знаком с CSE API, но, вероятно, это все еще связано с теми же проблемами, что и другой вопрос, который вы указали: может быть, обнаруженная локаль отличается, может быть, другие параметры имеют другие значения по умолчанию, может быть, API не точно такой же, как тот, который Google использует для своих веб-результатов (в конце концов, это устаревший API; возможно, результаты Google проходят какую-то другую обработку в другом месте)   -  person Alex Churchill    schedule 04.09.2012
comment
Также в целом поисковые API будут давать похожие, но разные результаты в разное время для разных людей. Возможно, будет проще просто переосмыслить свой подход к проблеме. Если вам нужно сделать что-то таким образом, использование мобильной конечной точки и синтаксический анализ HTML (я знаю, что это отстой — мне пришлось сделать это один раз для gmail) может быть единственным способом.   -  person Alex Churchill    schedule 04.09.2012
comment
Хорошо, если бы это не была эта конкретная проблема, и это было бы точно одно и то же каждый раз. Это всегда результат поиска #2, и это всегда при поиске именно тех сайтов дилеров, И это всегда второй лучший результат? Вы абсолютно правы в одном: если это API и есть проблемы с этим API, я никогда не смогу это исправить. Я надеялся, что кто-нибудь сможет сказать мне, что не так с моим конкретным кодом, который они могли видеть. Что я действительно искал, так это какой-то параметр, который бы отключал оптимизации, которые могли нарушить поиск.   -  person dynamphorous    schedule 05.09.2012
comment
Может быть один, о котором я не знаю; поисковые API Google не очень полны/доступны.   -  person Alex Churchill    schedule 05.09.2012
comment
Ты можешь сказать это снова. Некоторые из приемов, которые я использовал здесь для передачи переменных в свою функцию обратного вызова, я смог выяснить только с помощью firebug и изучения моей DOM, чтобы определить, какие переменные я устанавливал. Документация была не очень полной. Я бы хотел, чтобы был какой-то метод, который я мог бы переопределить, чтобы исправить это в API, но это сделало бы меня одним счастливым кодером!   -  person dynamphorous    schedule 05.09.2012


Ответы (1)


У меня была эта проблема, когда я делал что-то подобное, и, согласно тому, что я обнаружил тогда (iirc), возвращаемые результаты зависят от языковых параметров, которые вы передаете в Google, и строки идентификатора браузера.

Обратите внимание, что это могло измениться, и это далеко не так, но это стоит проверить.

РЕДАКТИРОВАТЬ:

Я только что увидел, что вы ищете доказательство ответа, так что вот: http://www.windmeadow.com/node/36 ‹— Google выдает разные результаты поиска в зависимости от браузера. http://productforums.google.com/forum/#!topic/webmasters/7K02-AUCTVM ‹-- Разные результаты поиска на разных языках

РЕДАКТИРОВАТЬ 2:

Это известная ошибка в Google AJAX API: http://code.google.com/p/google-ajax-apis/issues/detail?id=43

person alexandernst    schedule 10.09.2012
comment
Если бы это было проблемой, я бы подумал о добавлении Search[i].setRestriction(google.search.Search.RESTRICT_EXTENDED_ARGS, {lr: lang_en, gl: us, cr: countryUS, filter: 1}); к объекту искателя было бы лучшим первым шагом к ее решению. Но это, кажется, просто возвращает те же результаты. Есть какие-нибудь идеи, как я могу отменить эту предвзятость, которую применяет Google? Что меня больше всего раздражает, так это то, что это ВСЕГДА возвращается второй результат поиска, и он НИКОГДА не будет лучшим результатом для рассматриваемого запроса. - person dynamphorous; 10.09.2012
comment
В соответствии с этим webmasters.stackexchange.com/questions/24783/ можно попытаться удалить файлы cookie. Кроме того, попробуйте выполнить поиск в простом ascii (просто для проверки), чтобы быть полностью уверенным, что Google ничего не делает weird. - person alexandernst; 11.09.2012
comment
Файлы cookie интересны, но вы знаете, для меня это одно: это всегда второй результат (который всегда уступает первому результату поиска, который должен быть возвращен) и всегда одни и те же URL-адреса, из которых он возвращает второй результат. Я бы поверил, если бы это не был такой удивительно хирургический поиск (я имею в виду буквально, что я ищу именно ОДНУ страницу на ОДНОМ веб-сайте, где я знаю базовый URL-адрес указанного сайта и все остальные ключевые слова, которые будут там находиться, чтобы дать мне ОДИН правильный результат поиска). Я дам вам награду, если я не получу лучшего ответа в ближайшие два дня... - person dynamphorous; 11.09.2012
comment
Кстати, первый результат как-то связан с запросом? Это с того же базового URL-адреса (что и на том же веб-сайте)? - person alexandernst; 12.09.2012
comment
Вы пробовали запустить код, который я разместил выше? Я ограничиваю каждый поиск одним URL-адресом, указанным в переменной: SearchVariables, столбец 2. И все, что я делаю, это ищу нашу конкретную страницу продукта на сайте данного дилера. Таким образом, каждый заданный поиск выполняется с одного и того же базового URL-адреса. Вот что запутанного в этом вопросе... - person dynamphorous; 12.09.2012
comment
Я только что нашел это... Согласно code.google .com/p/google-ajax-apis/issues/detail?id=43 это известная ошибка (и, глядя на дату отчета, я действительно не думаю, что она когда-либо будет исправлена) - person alexandernst; 12.09.2012
comment
Спасибо, Алекс, похоже, вы правы .... Очень жаль, что Google так сильно портит свой собственный API, по-видимому, намеренно, чтобы ограничить людей от использования API и загрузки их серверов, я полагаю? Это действительно позор, потому что я действительно люблю сервисы Google в целом. Я отметил ваш ответ как ответ. Я бы отредактировал ваш первоначальный ответ и включил эту последнюю ссылку, чтобы всем, кто наткнется на мой запрос, было ясно, что это просто повсеместная проблема с API Google. - person dynamphorous; 12.09.2012
comment
Спасибо! рад помочь ;) - person alexandernst; 12.09.2012