Как стянуть ссылки на страницы?

Тема в разделе "Регулярные выражения", создана пользователем Zloboff, 15 мар 2009.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Zloboff

    Zloboff Прохожие

    Вообщем проблема заключается в следующем, не могу выдернуть ссылки со страниц Яндекса (http://yandex.ru/yandsearch?text=Введённое ключевое слово), нужно собрать доменов столько, сколько указал в форме к примеру 20, он 20 доменов собирает со всех страниц Яндекса... Очень нужна ваша помощь...
     
  2. t0os

    t0os

    Регистр.:
    21 окт 2007
    Сообщения:
    284
    Симпатии:
    36
    Zloboff, перечитал 2 раза и ничего не понял. Можно перефразировать, желательно с примером наглядным.
     
  3. Zloboff

    Zloboff Прохожие

    Нужно разработать веб-приложение которое по введенному в поле ключевой фразе выводит список доменов первых N сайтов из поисковой выдачи Яндекса. Пользователь должен ввести через форму «Ключевую фразу» и желаемое количество доменов в списке (например, 100 ). Приложение просматривает результаты выдачи Яндекса по введенной ключевой фразе и возвращает результат в виде списка доменов. Если ссылка на сайт в выдаче ведет не на главную страницу, то его url необходимо обрезать и оставить только имя домена (к примеру ya.ru, nulled.ws и т.п.)

    Я наковырял только обрезку ссылок до вида ya.ru

    Код:
    <?php
    
    $domains = 'http://php.ru/index.php';
    
    
    // Ищем URL
    preg_match('@^(?:http://)?([^/]+)@i', $domains, $matches);
    $host = $matches[1];
    
    // Берём последние 2 сигмента ссылки
    preg_match('/[^.]+\.[^.]+$/', $host, $matches);
    echo "Домены: {$matches[0]}\n";
    ?>
    
     
  4. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Код:
    // Берём последние 2 сигмента ссылки
    preg_match('/[^.]+\.[a-z]+/', $host, $matches);
    echo "Домены: {$matches[0]}\n";
    
     
  5. pavelp

    pavelp Писатель

    Регистр.:
    13 апр 2009
    Сообщения:
    5
    Симпатии:
    0
    насчет разбора выдачи яндекса то мне помогает такая регулярка:
    |http://favicon.yandex.net/favicon/([^)]*)|


    и она же кстате выбирает только домены даже не заморачиваясь на полном урле
    для того что б показать больше чем 10 элементов выдачи надо просто добавить гет-параметр numdoc либо листать страницы гет параметром "p"
     
  6. [Гилыч]

    [Гилыч] Постоялец

    Регистр.:
    5 авг 2008
    Сообщения:
    57
    Симпатии:
    17
    PHP:
    $num $argv['1'];
    $p $num 10;
    $i=0;
    $query $argv['2'];
    $urls = array();
    while(
    $i!=$p){
        if(
    preg_match("/ /i"$query)) $query preg_replace("/ /i","+",$query);
        
    sleep(10);
        
    $string file_get_contents("http://www.yandex.ru/yandsearch?p=".$i."&text=".$query);
        
    preg_match_all("/<span[^>]*class=\"green_url\"[^>]*>(.+?)<\/span>/si",$string,$matches);
        foreach(
    $matches[1] as $k=>$m){
            
    $m preg_split("/ |\&nbsp/i"$m);
            
    $m preg_replace("/\r|\n|http:\/\/|www\./si","",$m[0]);
            
    $m preg_split("/\//i"$m);
            
    $m $m[0];
            
    array_push($urls$m);    
        }
        
    $i++;
    }
    print_r($urls);
     
  7. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Я наковырял только обрезку ссылок до вида ya.ru

    PHP:
    <?php

    $domains 
    'http://php.ru/index.php';


    // Ищем URL
    preg_match('@^(?:http://)?([^/]+)@i'$domains$matches);
    $host $matches[1];

    // Берём последние 2 сигмента ссылки
    preg_match('/[^.]+\.[^.]+$/'$host$matches);
    echo 
    "Домены: {$matches[0]}\n";
    ?>
    :eek::eek::eek::eek::eek:

    Что же вы творите с интерпретатором !?
    Это метод очень гесурсоемкий да и излишнев !!!

    Вот то что вам нужно:

    PHP:
    <?PHP
    $host
    =parse_url('http://www.nulled.ws/newreply.php?do=newreply&noquote=1&p=990053');
    echo 
    $host['host'];
    ?>
    Добавлено через 9 минут
    Вот примерная логика...

    Принемаем от формы колличество требуемых ссылок.
    Делем это число на 10 а потом прогоняем через функцию cel (получаем колличество страниц которое нужно пройти для сбора ссылок)

    Далее конектимся в яше по урлу предварительно тримируя а так же урлэнкодим запрос.
    Далее дергаем ссылки прег_мач_аллом и в цыкле выдераем только домен и отправляем его в масив.

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

    А вот что с этим масивом делать дальше решайте сами...
     
  8. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    Вот интересный сервис на эту тему ссылки правда не обрезает но напарсить можно много работает только с Яшкиной выдачей ссылки сохраняет в текстовый файл _http://www.seanalyzer.ru/bookmarks/analyze/serp
     
    mff4 и netboy нравится это.
  9. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    ;)

    PHP:
    <form name="" action="" method="post">
    <li><b>Запрос</b></li><input name="query" type="text" value=""><br><br>
    <li><b>Колличество ссылок..</b></li><input name="n" type="text" value="">  <br><hr>
    <input type="submit" value="Отправить">
    </form>
    <br><br><br>
    <?php

        
    function parse_yandex($query$gl)
        {
            for (
    $i_for=0$i_for<=$gl$i_for++){
                if (
    $i_for=="0"){$n_page="0";} else {$n_page=$i_for-1;}

                    
    $request "http://yandex.ru/yandsearch?p=$n_page&text=".urlencode(trim($query));
                    
    $pattern '/<a tabindex=".*" onmousedown=.* href="(.*)" target="_blank">.*<\/a>/isU';

                    
    $result file_get_contents($request);

                    if(
    preg_match_all($pattern$result$matches))
                    {
                                for (
    $i=0$i<count($matches[0]); $i++)
                                {
                                    
    $link parse_url($matches[1][$i]);

                                    
    $serp[] = $link['host'];
                                }
                            }

            }


            return 
    $serp;
        }


    if (
    $_POST)
    {
        
    $qq=parse_yandex($_POST['query'], ceil($_POST['n']/10)-1);

              for(
    $i=0$i<=$_POST['n']; $i++)
              {
               echo 
    "$i) Сайт <b>$qq[$i]</b> был найден на странице по запросу <b>$_POST[query]</b><hr>";
              }
    }


    ?>

    PS. Свеже испеченый ))
     
    AndyFire нравится это.
  10. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    TC отпиши то хоть или не то...
     
Статус темы:
Закрыта.