За последние 24 часа нас посетил 53901 программист и 1718 роботов. Сейчас ищут 847 программистов ...

парсер

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

  1. paqwerty

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

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    Всем привет!

    У меня возникла потребность в парсере информации с нескольких сайтов. Код парсинга сам работает нормально, но есть проблема:

    Я ставлю в коде парсера паузу
    PHP:
    1. sleep(2);
    и у меня сразу вываливается ошибка "Error 500: Internal Server Error". Я как понимаю это связано с таймаутом, установленным на хостинге для выполнения пхп-скрипта. И я пытался решить эту проблему. А решил я ее так, я сначала записывал контент страницы в тхт файл и потом уже выдирал из этого файла нужную инфу с паузой 0
    PHP:
    1. sleep(0);
    и у меня все работает.

    Собственно вопрос, можно ли так делать, т.к. насколько я знаю что если парсить сам сайт с паузой 0, то меня как-то заблокируют?

    Код скрипта приведен ниже:

    PHP:
    1.  
    2. <?php
    3. $ch = curl_init("адрес страницы для скачивания контента");
    4. $h = fopen("my_file.txt","w");
    5. curl_setopt($ch, CURLOPT_FILE, $h);
    6. curl_setopt($ch, CURLOPT_HEADER, 0);
    7. $content = curl_exec($ch);
    8. if (fwrite($h,$ch))
    9. echo "Запись произведена успешно";
    10. else
    11. echo "Произошла ошибка при записи данных";
    12. fclose($h);
    13. $ch = curl_init ();
    14. curl_setopt ($ch , CURLOPT_URL , "адрес файла с контентом для последующего парсинга");
    15. curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 );
    16. $content = curl_exec($ch);
    17. preg_match_all("/регулярное выражение для шаблона поиска/>/isU", $content, $matches, PREG_PATTERN_ORDER);
    18. for ($i =  0; $i < count($matches[1]); $i++)
    19. {
    20.     echo $matches[1][$i]."<br>";
    21.     flush();
    22.     sleep(0);
    23. }
    24. ?>
    25.  
     
  2. Devzirom

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

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

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

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    А почеу нет? Объясни плиз новичку...
     
  4. Devzirom

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

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    Потому-что вы запрашиваете сначала одну страницу, затем вторую. В сети существует такое понятие как пинг. Поэтому между первым и вторым запросом будет некая задержка, чуть больше текущего пинга + тормознутость серверов

    + Посмотрите как работают браузеры. Сначала вытаскивают с сервера HTML, и тут же тащат все что прилагается к странице: картинки, css, javascript. Почти всё разом, на одном дыхании. Есть конечно ограничения у браузеров, например у FireFox'а максимум одновременных соединений 6 (по умолчанию)
     
  5. paqwerty

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

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    А как тогда мне обойти ошибку "Error 500: Internal Server Error". Т.к. если я ставлю паузу даже в секунды, скрипт уже не выполняется?
     
  6. Devzirom

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

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    Вопрос
    Ответ
    Не нужно никаких пауз
     
  7. paqwerty

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

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    Devzirom, спасибо большое что помогаешь!

    Периодичность парсинга у меня будет не чаще 1 раза в сутки, а то и реже. Т.е. я могу спокойно парсить таким способом?

    И правильно я тебя понимаю, ты мне предлагаешь перед парсингом откидывать все ненужное из контента?...
     
  8. Devzirom

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

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    Не я, так другой бы ответил

    Да

    Я этого не писал =) Вы спросили, про блокировку - я ответил. Что сохранить, а что откинуть, решайте сами
     
  9. paqwerty

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

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    Сори, если вопрос тупой, но все-таки: у меня этот скрипт лежит в отдельной директории сайта, я установил basic аунтефикацию через htaccess и htpasswd. И когда я запускаю этот скрипт, сначала меня проист залогиниться, я логинюсь, потом выполняется скрипт (ошибок нет, файлы создает), но почему-то ничего не выводит на экран, а должно выводиться спарсенная из этих файлов инфа.

    Я как понимаю косяк в доступе к файлам...

    Помогите пожалуйста решить эту проблему
     
  10. paqwerty

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

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    Может плохо объяснил, попробу по другому...

    есть файл 1.php:

    PHP:
    1.  
    2. <?php
    3. $x = array ("мама", "папа", "брат");
    4. ?>
    5.  
    есть файл 2.php:

    PHP:
    1.  
    2. <?php
    3. include ("1.php");
    4. $y = $x;
    5. echo $y[2]."<br>";
    6. ?>
    7.  
    есть файл .htaccess:

    Код (Text):
    1.  
    2. DirectoryIndex 2.php
    3. Options -Indexes
    4.  
    5. AuthType basic
    6. AuthName 'Authorization...'
    7. AuthUserFile '/folder1/folder2/folder3/folder4/sitename.ru/xxx/.htpasswd'
    8. Require valid-user
    есть файл .htpasswd:

    Код (Text):
    1.  
    2. username:userpassword
    Так вот, если вызвать 2.php без наличия файла .htaccess, то мне на экране высветит результат "брат". Но если вызвать 2.php при наличии файла .htaccess, то будет пустой экран.

    Еще я заметил, что если в файле 2.php вместо
    PHP:
    1. echo $y[2]."<br>";
    написать
    PHP:
    1. echo $y."<br>";
    , то на экран высветит "array".

    И я не могу решить эту проблему...

    Люди добрые - отзовитесь.