За последние 24 часа нас посетили 61989 программистов и 1677 роботов. Сейчас ищут 898 программистов ...

Смена яндекс региона через cURL

Тема в разделе "Прочие вопросы по PHP", создана пользователем Саня, 7 май 2009.

  1. Саня

    Саня Активный пользователь

    С нами с:
    7 май 2009
    Сообщения:
    14
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Доброе время. Поднимаю тему, в поисках нового опыта, а также решения наболевшей проблемы яндекс регионов.

    Задача: динамически изменять регион при запросах к яндексу (в целях поиска и парсинга) для различных регионов - Например Москва - region_id=213 и Екатеринбург region_id=54.

    Вопрос: как это можно сделать посредством cURL комбинации запросов

    Описание:
    Нужна помощь профессионалов, либо тех, у кого это получилось сделать, поскольку у меня выдает не верный вариант определения региона при запросе на region_id=213 через серию cURL запросов.

    Примеры:
    Есть быстрый способ переключить регион через url, например
    http://tune.yandex.ru/region/save2....p=4&text=mysql&retpath=/region/&region_id=213 Переключит регион на Москву, и найдёт фразу 'Mysql'
     
  2. Cron

    Cron Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    Что вы понимаете под "динамически изменять"??? Все равно нужно делать несколько запросов. Так вытягивайте из любого хранилища список регионов и последовательно дергайте Яндекс. Курлом можно сделать в несколько потоков, но с Яндексом такое не пройдет.
     
  3. Саня

    Саня Активный пользователь

    С нами с:
    7 май 2009
    Сообщения:
    14
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Поправлюсь тогда - а не динамически, а в процессе цикла запросов через cURL
     
  4. Cron

    Cron Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
  5. Саня

    Саня Активный пользователь

    С нами с:
    7 май 2009
    Сообщения:
    14
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Cron, как считаешь, если я спрашиваю как правильно создать запрос для cURLa то я могу не знать циклы, хватит себе рейтинг набивать бесполезными постами.

    Уточняю вопрос. Нужна правильная конфигурация curl_option чтобы сменить регион в яндексе.
    Я попробовал сделать, но там 3 редиректа на разные службы яндекса. Теряется где то звено в цепочке запросов и не правильный регион выдает
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  7. Саня

    Саня Активный пользователь

    С нами с:
    7 май 2009
    Сообщения:
    14
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Сори, это будет означать поиск по региону, если сайт не в региональном поиске по ничего не получится. А мне надо сменить собственно место дислокации. Есть кагбэ дефолтное местоопределение по IP, а есть ручная настройка, дак вот я хочу управлять ручной настройкой моего месторасположения.
     
  8. Cron

    Cron Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    А ты перечитай внимательно свой вопрос:

    Мой ответ здесь достаточно логичен.

    Быстро делаешь выводы
     
  9. Саня

    Саня Активный пользователь

    С нами с:
    7 май 2009
    Сообщения:
    14
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Вопрос решён, если кого то заинтересует пишите, оформлю пост с кодом.
     
  10. vital

    vital Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    162
    Симпатии:
    0
    Адрес:
    Минск
    ну раз уж решил вопрос так показывай ))
     
  11. Саня

    Саня Активный пользователь

    С нами с:
    7 май 2009
    Сообщения:
    14
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Решил таким образом, в принципе для внутреннего использования хватает, кто захочет апгрейдить до класса с примочками для яндекса - делитесь идеями, я поддержу тему развития
    PHP:
    1. <?php
    2. function getYaQueryByRegion($text,$page,$regionId,$inRegion=false) {
    3.     if (is_string($text)) {$text = '&text='.urlencode($text); $textAlt = '%26text%3D'.urlencode($text);} else return false;
    4.     if (is_numeric($page)) {$page = 'p='.(int)$page; $pageAlt = '%26p%3D'.(int)$page;} else {$page='';$pageAlt='';}
    5.     if ($inRegion===true) {$inRegion = '&rstr=-'.$regionId;$inRegionAlt='%26rstr%3D-'.$regionId;} else {$inRegion='';$inRegionAlt='';}
    6.     if (is_numeric($regionId)) {$regionId = '&region_id='.(int)$regionId;} else {$regionId='';}
    7.     $url = 'http://tune.yandex.ru/region/save2.xml?fretpath=http%3A%2F%2Ftune.yandex.ru%2Fregion%2Ferror.xml&domain=yandex.ru&retpath=http%3A%2F%2Fyandex.ru%2Fyandsearch%3F'.$pageAlt.$textAlt.$inRegionAlt.'&retpath=%2Fregion%2F'.$regionId;
    8.    
    9.     $user_agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; (R1 1.5))";
    10.    
    11.     $user_agents = array("Mozilla/5.0 (Windows; U; Win98; en-US; rv:x.xx) Gecko/20030423 Firebird Browser/0.6",
    12.                          "Mozilla/5.0 (Windows; U; Win98; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1",
    13.                          "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x",
    14.                          "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.xx) Gecko/20030504 Mozilla Firebird/0.6",
    15.                          "Mozilla/5.0 (X11; U; Linux 2.4.2-2 i586; en-US; m18) Gecko/20010131 Netscape6/6.01",
    16.                          "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Epiphany/1.2.1",
    17.                          "Mozilla/4.76 [en] (X11; U; FreeBSD 4.4-STABLE i386)"
    18.                          );
    19.     $referers = array("http://yandex.ru/",
    20.                       "http://www.liveinternet.ru",
    21.                       "http://www.google.ru",
    22.                       "http://www.e1.ru",
    23.                       "http://www.rambler.ru"
    24.                      );
    25.                      
    26.     $ref = $referers[rand(0, 4)];
    27.     $ua = $user_agents[rand(0, 6)];
    28.    
    29.     $ch = curl_init($url);
    30.         curl_setopt($ch, CURLOPT_TIMEOUT , 20);
    31.         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 10);
    32.         curl_setopt($ch, CURLOPT_HEADER, 1);
    33.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    34.         curl_setopt ($ch, CURLOPT_COOKIEFILE, "cookies1.txt");
    35.         curl_setopt ($ch, CURLOPT_COOKIEJAR, "cookies1.txt");
    36.         curl_setopt ($ch, CURLOPT_AUTOREFERER, 1);
    37.         curl_setopt($ch, CURLOPT_USERAGENT, $ua);
    38.         curl_setopt($ch, CURLOPT_REFERER, $ref);
    39.     $res =  curl_exec($ch);
    40.         curl_close($ch);
    41.        
    42.     $cook='';
    43.     if($count = preg_match_all("~Set-Cookie:\s*([^=]+)=([^\s;]+)~si", $res, $matches))
    44.     {  
    45.     for ($i=0; $i<$count; $i++)
    46.         $cook.=$matches[1][$i].'='.$matches[2][$i].'; ';
    47.     }
    48.    
    49.    
    50.     $url = 'http://pass.yandex.ru/syncookie?name=yandex_gid&fretpath=http%3A%2F%2Ftune.yandex.ru%2Fregion%2Ferror.xml&retpath=http%3A%2F%2Fyandex.ru%2Fyandsearch%3F'.$pageAlt.$textAlt.$inRegionAlt.'&yandex_gid='.$regionId;
    51.     $ch = curl_init($url);
    52.         curl_setopt($ch, CURLOPT_TIMEOUT , 20);
    53.         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 10);
    54.         curl_setopt($ch, CURLOPT_HEADER, 1);
    55.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    56.         curl_setopt($ch, CURLOPT_COOKIE, $cook);
    57.         curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies1.txt");
    58.         curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies1.txt");
    59.         curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    60.         curl_setopt($ch, CURLOPT_USERAGENT, $ua);
    61.         curl_setopt($ch, CURLOPT_REFERER, 'http://tune.yandex.ru/region/');
    62.     $res =  curl_exec($ch);
    63.         curl_close($ch);
    64.        
    65.        
    66.        
    67.     $url = 'http://yandex.ru/yandsearch?'.$page.$text.$inRegion.'&yandex_gid='.$regionId;
    68.     $ch = curl_init($url);
    69.         curl_setopt($ch, CURLOPT_TIMEOUT , 20);
    70.         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 10);
    71.         curl_setopt($ch, CURLOPT_HEADER, 0);
    72.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    73.         curl_setopt($ch, CURLOPT_COOKIE, $cook);
    74.         curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    75.         curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies1.txt");
    76.         curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies1.txt");
    77.         curl_setopt($ch, CURLOPT_USERAGENT, $ua);
    78.         curl_setopt($ch, CURLOPT_REFERER,'http://pass.yandex.ru/syncookie/');
    79.     $res =  curl_exec($ch);
    80.         curl_close($ch);
    81. return $res;
    82. }
    83. getYaQueryByRegion('das',1,213,true); // текст, страница, регион, поиск по галке "в регионе"
    84. ?>
    85.  
     
  12. Саня

    Саня Активный пользователь

    С нами с:
    7 май 2009
    Сообщения:
    14
    Симпатии:
    0
    Адрес:
    Екатеринбург
    заметил свои косяки с $url, будьте внимательны, проследите правильное формирование $url