За последние 24 часа нас посетили 16155 программистов и 1666 роботов. Сейчас ищет 891 программист ...

Не всегда получает исходный код при парсинге

Тема в разделе "PHP для новичков", создана пользователем jack555, 5 янв 2011.

  1. jack555

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

    С нами с:
    5 янв 2011
    Сообщения:
    17
    Симпатии:
    0
    Всем привет. Задача такова: получить количество внешних и внутренних ссылок с сайта, который вводит пользователь. Данные вводятся в форму <textarea> списком, каждый сайт через ENTER. Скрипт работает когда ввожу 1 сайт, иногда 2. А иногда ничего не подсчитывает. Я нашел в чем дело. Дело в том что parse_url не всегда вытягивает контент с сайта и пишет:

    Вот мой запрос:
    http://www.php.ru/forum/viewforum.php?f=27
    http://www.php.ru/forum/viewforum.php?f=27
    http://www.php.ru/forum/posting.php?mode=newtopic&f=13
    http://habrahabr.ru/
    http://www.php.ru/forum/viewtopic.php?t=28709
    http://market.airsoft.ua/fl/31/
    http://www.google.com.ua/

    Если убрать в конце запроса http://www.google.com.ua/ , то все нормально. А если оставить то ошибка. Причем не с гуглом, а не находит ссылки на http://habrahabr.ru/

    Исходный код файла index.php:

    PHP:
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=cp1251 " />
    5. <title>Поиск внешних и внутренних ссылок</title>
    6. </head>
    7.  
    8. <body>
    9. <H2>Поиск внешних и внутренних ссылок</H2>
    10. <?
    11. if (isset ($_REQUEST["all_url"]))
    12. {
    13.     $res = $_REQUEST["all_url"];
    14.     $res = trim($res);
    15.     $res = explode("\n", $res);
    16.    
    17.     // начало работы с каждым адресом поочереди
    18.     foreach ($res as $key => $url) {
    19.         $home_site = parse_url($url);
    20.         $home_site = $home_site['host']; // URL адреса по которому ищем ссылки
    21.        
    22.         /*
    23.         $ch = curl_init (); // инициализация
    24.         curl_setopt ($ch , CURLOPT_URL , $url); // адрес страницы для скачивания
    25.         curl_setopt ($ch , CURLOPT_USERAGENT , "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7"); // каким браузером будем прикидыватьсяs
    26.         curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 ); // нам нужно вывести загруженную страницу в переменную
    27.         $content = curl_exec($ch); // скачиваем страницу
    28.         curl_close($ch); // закрываем соединение
    29.         */
    30.         $content = file_get_contents($url);
    31.         if ($content) {
    32.             // поиск ссылок в исходном коде
    33.             $result = preg_match_all("/<[Aa][ \r\n\t]{1}[^>]*[Hh][Rr][Ee][Ff][^=]*=[ '\"\n\r\t]*([^ \"'>\r\n\t#]+)[^>]*>/",$content, $m);
    34.             if ($result) {
    35.                 $count_url = count($m[1]);
    36.                 $i = 0;
    37.                 $j = 0;
    38.                 $d = 1;
    39.                 $count = 0;
    40.                 $count2 = 0;
    41.                 while($i<$count_url) {
    42.                     //$str1 = stristr($m[1][$i],"http://");
    43.                     //$str2 = stristr($m[1][$i],"www.");
    44.                     //$str3 = stristr($m[1][$i],$home_site);       
    45.                     echo ++$j.". ".$m[1][$i]."<br>";
    46.                     // поиск внешних ссылок
    47.                     if ((stristr($m[1][$i],"http://") || stristr($m[1][$i],"www.")) && !stristr($m[1][$i],$home_site)) {
    48.                         $count = $d++;
    49.                         //echo "------->".$m[1][$i]."<br>";
    50.                     }
    51.                     $i++;
    52.                 }              
    53.             $count2 = $count_url - $count;
    54.             echo "<br><b>".$url."<br></b> Внешних: ".$count.". ";
    55.             echo "Внутренних: ".$count2.".<br>------------------------------------<br>"; 
    56.             }
    57.             else {echo "Не получены ссылки с сайта <b>".$url."</b><br><br>";}
    58.         }
    59.         else {echo "Не получен исходный код с сайта <b>".$url."</b><br><br>";}
    60.     }
    61.  
    62. }      
    63.    
    64.  
    65. ?>
    66. <form id="checkform" name="checkform" action="index.php" method="post">
    67. <table width="60%">
    68. <tr>
    69. <td width="10%">
    70. </td>
    71. <br>
    72. Введите адреса, каждый через Enter:
    73. <td>
    74. <textarea name="all_url" cols="40" rows="10"><?php echo $_REQUEST["all_url"]; ?></textarea>
    75. </td>
    76. </tr>
    77. <tr>
    78. <td colspan="2" align="center">
    79. <input type="submit" value="Найти">
    80. </td>
    81. </tr>
    82. </table>
    83. </form>
    84. </body>
    85. </html>
     
  2. Devzirom

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

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    Это предупреждение о том, что был получен заголовок HTTP/1.1 404 Not Found. То-есть удаленный сервер не смог найти документ соответствующий данному запросу.
     
  3. jack555

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

    С нами с:
    5 янв 2011
    Сообщения:
    17
    Симпатии:
    0
    Но почему иногда выдает такое предупреждение, а иногда нет. С одной и той же ссылки.
     
  4. Devzirom

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

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    Может быть - это ошибка сервера, к корому вы обращаетесь
     
  5. jack555

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

    С нами с:
    5 янв 2011
    Сообщения:
    17
    Симпатии:
    0
    Я просто не могу понять. Повторю. Если убрать в конце запроса http://www.google.com.ua/ , то все нормально. А если оставить то ошибка. И таких примеров много. Не обязательно гугл.
    Я хочу узнать, проблемы у меня или на стороне?
     
  6. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Поддерживаю по поводу обращения к серверу.
     
  7. jack555

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

    С нами с:
    5 янв 2011
    Сообщения:
    17
    Симпатии:
    0
    но другие подобные скрипты ведь как-то работают?
     
  8. Devzirom

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

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    Перед file_get_contents поставьте @

    PHP:
    1. <?php
    2. ...
    3. $content = @file_get_contents($url);
    4. ...
    5. ?>
    И вы больше никогда не увидите это предупреждение
     
  9. Devzirom

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

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    И ещё как вариант в $url присутствует знак перевода строки("\n") или перевода каретки "\r"

    PHP:
    1. <?php
    2. echo file_get_contents("http://www.devzirom.ru/\r");
    3. ?>
    +Или просто табуляция
     
  10. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Перед
    Код (Text):
    1. $content = file_get_contents($url);
    Попробуйте добавить
    Код (Text):
    1. $url = trim($url);
     
  11. jack555

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

    С нами с:
    5 янв 2011
    Сообщения:
    17
    Симпатии:
    0
    sobachnik
    Действительно помогло! Огромное спасибо.

    Devzirom
    Зачем добавлять @ перед file_get_contents? Что это даст?
     
  12. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    отключит уведомление об ошибке