Парсер кеша google - помогите модернизировать

Тема в разделе "PHP", создана пользователем sherh, 18 апр 2009.

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

    sherh Постоялец

    Регистр.:
    12 июн 2007
    Сообщения:
    131
    Симпатии:
    53
    Понадобилось вытянуть кучу страниц из кеша гугля. Полез в поиск - нашел скрипт на форуме сапы - админ выкладывал.

    Инструкция:

    1. Создаем файл index.php и кладем в какую-нибудь папку на сервере.
    2. Запускаем и ждем, в папке начнут появляться отпарсенные страницы...

    PHP:
    <? 

    error_reporting(0); // не показываем ошибки 
    set_time_limit(1800); // таймаут работы скрипта 

    ini_set('user_agent','Opera/9.52 (Macintosh; Intel Mac OS X; U; en)'); // Маскируемся 
    ini_set('default_socket_timeout','10'); // Исключаем большие таймауты запросов 

    if(@!$_GET['domen']){        // Форма 
    ?> 
    <form name=f method=get action="index.php" onSubmit="if(f.domen.value!=''){if(confirm('Внимание! Удостоверьтесь, что адрес введён верно ('+f.domen.value+')\nВ кеше может оказать очень много страниц!\nВы уверены, что готовы дождаться результата копирования сраниц, это может занять много времени!')){self.location='?domen='+f.t.value}else{return false;}}else{alert('Не введён адрес сайта!');return false;}"> 
    Введите домен для поиска и копирований результатов, сохранённых в кеше<br> 
    http://<input type=text name=domen size=40> &nbsp; <input type=submit value="  GO  "></form> 
    <? 
    exit(); 



    $domen = htmlspecialchars(trim($_GET['domen']));    if(substr($domen, 0, 4)=="www."){$domen=substr($domen,4);} // Домен 

    // Начальная страница 
    $firstpage = "http://www.google.com/search?num=100&hl=en&newwindow=1&safe=off&q=allinurl:".$domen."+site:".$domen."&start=0&sa=N&filter=0"; 
    $dump = file_get_contents($firstpage); 

    // Ищем кол-во результатов 
    $phrase = "</b> of about <b>"; 
    if(strstr($dump, $phrase)){ 
        $pos = strpos($dump, $phrase); 
    }else{ 
        $phrase = "</b> of <b>"; 
        $pos = strpos($dump, $phrase); 

        if(!$pos){exit("Не найдено!");} 

    // Ищем кол-во страниц 
    $num = substr($dump, $pos+strlen($phrase)); 
    $num = substr($num, 0, strpos($num, "</b> ")); 
    $num = str_replace(",", "", $num); 
    $num = ceil($num/100); 

    if($num>100){$num=100;} // обрабатываем сотню страниц, ограничение в сотню страниц = хотя бы 10'000 сохранённых страниц 



    for($i=0;$i<$num;$i++){ // Генерим ссылки  
        $starturls[]="http://www.google.com/search?num=100&hl=en&newwindow=1&safe=off&q=allinurl:".$domen."+site:".$domen."&start=".($i*100)."&sa=N&filter=0"; 

    array_unique($starturls); // Убираем дубликаты, на всякий случай 


    $data=''; $totnum=0; $cached=array(); $totsize=0; 
    $googledata = '</div></div></div><div style="position:relative">'; 

    foreach($starturls as $starturl){          // Обрабатываем по страницам, по 100 ссылок на каждой 

        $data = file_get_contents($starturl); 

        $find="<span class=gl>"; // Строка для поиска 

        $num=substr_count($data, $find); // Кол-во найденных строк 
        $totnum+=$num; 

        echo "<br><br><b>".round(strlen($data)/1024, 3)." кб</b><br><b>$num вхождений</b><br>"; 
        if($num==0){exit("нет вхождений");} 
         
        for($i=0;$i<$num;$i++){ 
            $data = substr($data, strpos($data, $find)+1); // Находим начало строки 
            $url = substr($data, strpos($data, 'href="')+6); // находим в ней ссылку 
            $url = substr($url, 0, strpos($url, '"')); // вырезаем ссылку 
             
            $page = $url; 
            $page = substr($page, strpos($page, "cache:")+6); // находим название страницы 
            $page = substr($page, strpos($page, ":")+1); // вырезаем от начала 
            $page = substr($page, 0, strpos($page, "+")); // и до конца 
            $page = str_replace("/", "-", $page); // заменяем символы для записи 

         
            if(in_array($page, $cached)){ // Если уже сохраняли, пропускаем 
                $res="<font color=blue>Already copied!!!</font>"; 
                $size=0; 
                $totnum--; 
            }else{ 
         
                if($pagedata=file_get_contents($url)){ // Получаем файл 
                 
                    if($gpos=strpos($pagedata, $googledata)){$pagedata = substr($pagedata, $gpos+strlen($googledata)+1);} // Убираем гугловскую шапку 
                 
                    file_put_contents($page, $pagedata); // Сохраняем файл 
                    $res="<font color=green>OK</font>";  
                    $size=round(filesize($page)/1024,3);  
                    $totsize+=$size; 
                }else{                        // Если не удалось скачать 
                    $res="<font color=red>ERROR</font>";  
                    $size=0; 
                } 
         
            } 
         
            echo ($i+1).") ".$page." - ".$res." (".$size." кб)<br>\n"; 
             
            $cached[]=$page; // Сохраняем адреса скачанных страниц, чтоб не повторяться 
        } 
         
    array_unique($cached); // Убираем дубликаты 



    echo "<hr>Всего ".$totnum." страниц, ".$totsize." кб."; 


    ?>
    Скрипт свое дело делает, но гугль банит очень быстро. Думаю, если его немного модернизировать, чтобы он запросы посылал с задержкой, то банить не должен.
    Еще погуглил на эту тему - нашел блог http://sm100.ru/archives/255 где как раз говорится как такое реализовать:
    В настоящее время стало не так то просто парсить (скачивать, анализировать) чужие ресурсы. Умные люди ввели бан за слишком частое обращение к их ресурсам.

    Хорошо бы иметь в арсенале PHP команду, типа wait (подождать). Но, такой команды, на сколько я знаю, нет.

    Выход из ситуации двух вариантный:
    - выстроить очередь из запросов, а запросы выполнять по команде crone
    - написать свою команду задержки времени.

    Я пошел вторым путем и там где нужно вставить задержку добавляю следующую конструкцию:


    PHP:
    require_once ('Snoopy.class.php') ;
    $cmd "http://inventory.overture.com/d/searchinventory/suggestion/?mkt=us&lang=en_US&term=".$n;
    $snoopy1 = new Snoopy;
    $snoopy1->agent "(compatible; MSIE 6.01; MSN 2.5; AOL 4.0; Windows Server 2003)";
    $snoopy1->cookies["SessionID"] = rand(122220000,2147483647);
    $snoopy1->fetch($cmd);
    Код позволяет сделать задержку на 30-60 секунд.

    Как связать первое и второе - не знаю. Помогите пожалуйста. Может есть другие решения?
     
  2. -=Xardas=-

    -=Xardas=-

    Регистр.:
    17 сен 2008
    Сообщения:
    250
    Симпатии:
    58
    а sleep() или usleep() не нравится? ;) После
    PHP:
    $cached[]=$page// Сохраняем адреса скачанных страниц, чтоб не повторяться 
    добавь строку:
    PHP:
    sleep(rand(3060)); // Вставляем случайную задержку от 30ти до 60ти секунд.
    и строку
    PHP:
    set_time_limit(1800);
    замени на:
    PHP:
    set_time_limit(0);
    и будет тебе задержка :)
     
    sherh и dotsenko нравится это.
  3. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    PHP:
    array_unique($starturls); // Убираем дубликаты, на всякий случай 
    array_unique($cached); // Убираем дубликаты 
    не будет так работать. надо так.
    PHP:
    $starturls=array_unique($starturls); // Убираем дубликаты, на всякий случай 
    $cached=array_unique($cached); // Убираем дубликаты 
     
    sherh нравится это.
  4. sherh

    sherh Постоялец

    Регистр.:
    12 июн 2007
    Сообщения:
    131
    Симпатии:
    53
    -=Xardas=-, не работает. Гугл все равно банит, успевает сохранить 40-50 страниц и все. Может можно как-то по-другому?
     
  5. swer

    swer

    Регистр.:
    15 июн 2008
    Сообщения:
    305
    Симпатии:
    38
    А еще лучше через прокси,к прим у меня поиск по н сайтам,и что бы не банили я использую прокси
    HTML:
    $proxy_host = array("127.0.0.1:8080", "127.0.0.1:80", "127.0.0.1:8080", "127.0.0.1:8080", "127.0.0.1:8080", "127.0.0.1:8080", "127.0.0.1:8080", "127.0.0.1:8080", "127.0.0.1:8080", "127.0.0.1:8080", "127.0.0.1:8080","127.0.0.1:8080","127.0.0.1:8080","127.0.0.1:8080","127.0.0.1:8080","127.0.0.1:8080","127.0.0.1:8080");
    $sikl = rand(0, 16);
    $proxy=$proxy_host[$sikl];
    
    а дальше скачиваю через курл(вставляя значение прокси $proxy) и все дела...
    Получается так что он у тебя рандомно берет прокси что не вызывает у гугля подозрения....
     
  6. -=Xardas=-

    -=Xardas=-

    Регистр.:
    17 сен 2008
    Сообщения:
    250
    Симпатии:
    58
    попробуй использовать snoopy и задержку, тогда не должно будет банить.
     
  7. _sergey_

    _sergey_ Писатель

    Регистр.:
    1 окт 2008
    Сообщения:
    1.746
    Симпатии:
    1.159
    Скомпоновал, указанное выше получилось:



    PHP:
    <?  
    error_reporting(0); // не показываем ошибки  
    set_time_limit(0); // таймаут работы скрипта  
    ini_set('user_agent','Opera/9.52 (Macintosh; Intel Mac OS X; U; en)'); // Маскируемся  
    ini_set('default_socket_timeout','10'); // Исключаем большие таймауты запросов  
    if(@!$_GET['domen']){        // Форма  
    ?>  
    <form name=f method=get action="index.php" onSubmit="if(f.domen.value!=''){if(confirm('Внимание! Удостоверьтесь, что адрес введён верно ('+f.domen.value+')\nВ кеше может оказать очень много страниц!\nВы уверены, что готовы дождаться результата копирования сраниц, это может занять много времени!')){self.location='?domen='+f.t.value}else{return false;}}else{alert('Не введён адрес сайта!');return false;}">  
    Введите домен для поиска и копирований результатов, сохранённых в кеше<br>  
    http://<input type=text name=domen size=40> &nbsp; <input type=submit value="  GO  "></form>  
    <?  
    exit();  
    }  
    $domen = htmlspecialchars(trim($_GET['domen']));    if(substr($domen, 0, 4)=="www."){$domen=substr($domen,4);} // Домен  
    // Начальная страница  
    $firstpage = "http://www.google.com/search?num=100&hl=en&newwindow=1&safe=off&q=allinurl:".$domen."+site:".$domen."&start=0&sa=N&filter=0";  
    $dump = file_get_contents($firstpage);  
    // Ищем кол-во результатов  
    $phrase = "</b> of about <b>";  
    if(strstr($dump, $phrase)){  
        $pos = strpos($dump, $phrase);  
    }else{  
        $phrase = "</b> of <b>";  
        $pos = strpos($dump, $phrase);  
    }  
        if(!$pos){exit("Не найдено!");}  
    // Ищем кол-во страниц  
    $num = substr($dump, $pos+strlen($phrase));  
    $num = substr($num, 0, strpos($num, "</b> "));  
    $num = str_replace(",", "", $num);  
    $num = ceil($num/100);  
    if($num>100){$num=100;} // обрабатываем сотню страниц, ограничение в сотню страниц = хотя бы 10'000 сохранённых страниц  
    for($i=0;$i<$num;$i++){ // Генерим ссылки   
        $starturls[]="http://www.google.com/search?num=100&hl=en&newwindow=1&safe=off&q=allinurl:".$domen."+site:".$domen."&start=".($i*100)."&sa=N&filter=0";  
    }  
    $starturls=array_unique($starturls); // Убираем дубликаты, на всякий случай  
    $data=''; $totnum=0; $cached=array(); $totsize=0;  
    $googledata = '</div></div></div><div style="position:relative">';  
    foreach($starturls as $starturl){          // Обрабатываем по страницам, по 100 ссылок на каждой  
        $data = file_get_contents($starturl);  
        $find="<span class=gl>"; // Строка для поиска  
        $num=substr_count($data, $find); // Кол-во найденных строк  
        $totnum+=$num;  
        echo "<br><br><b>".round(strlen($data)/1024, 3)." кб</b><br><b>$num вхождений</b><br>";  
        if($num==0){exit("нет вхождений");}  
        for($i=0;$i<$num;$i++){  
            $data = substr($data, strpos($data, $find)+1); // Находим начало строки  
            $url = substr($data, strpos($data, 'href="')+6); // находим в ней ссылку  
            $url = substr($url, 0, strpos($url, '"')); // вырезаем ссылку  
            $page = $url;  
            $page = substr($page, strpos($page, "cache:")+6); // находим название страницы  
            $page = substr($page, strpos($page, ":")+1); // вырезаем от начала  
            $page = substr($page, 0, strpos($page, "+")); // и до конца  
            $page = str_replace("/", "-", $page); // заменяем символы для записи  
            if(in_array($page, $cached)){ // Если уже сохраняли, пропускаем  
                $res="<font color=blue>Already copied!!!</font>";  
                $size=0;  
                $totnum--;  
            }else{  
                if($pagedata=file_get_contents($url)){ // Получаем файл  
                    if($gpos=strpos($pagedata, $googledata)){$pagedata = substr($pagedata, $gpos+strlen($googledata)+1);} // Убираем гугловскую шапку  
                    file_put_contents($page, $pagedata); // Сохраняем файл  
                    $res="<font color=green>OK</font>";   
                    $size=round(filesize($page)/1024,3);   
                    $totsize+=$size;  
                }else{                        // Если не удалось скачать  
                    $res="<font color=red>ERROR</font>";   
                    $size=0;  
                }  
            }  
            echo ($i+1).") ".$page." - ".$res." (".$size." кб)<br>\n";  
            $cached[]=$page; // Сохраняем адреса скачанных страниц, чтоб не повторяться    
    sleep(rand(30, 60)); // Вставляем случайную задержку от 30ти до 60ти секунд.
        }       
    $cached=array_unique($cached); // Убираем дубликаты    
    }  
    echo "<hr>Всего ".$totnum." страниц, ".$totsize." кб.";  
    ?>  
    Запускаю на Денвере, указываю домен, через несколько секунд независимо от домена, какой ни введёшь - появляется надпись не найдено. В чём может быть дело?
     
Статус темы:
Закрыта.