Возможные проблемы при парсинге

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

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

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Друзья. Хотелось бы услышать от вас объяснение следующей проблемы:
    Написал парсер, принцип работы которого таков:
    В форму вставляется ссылка на страницу, которую хочу спарсить.
    После submit, происходит выдирание нужной информации с помощью preg_match_all. Вся информация вставляется в соответствующие формы. Далее после нажатия submit, вся информация из форм отправляется в базу.
    Писал его для одного моего сайта. Всё работало на отлично.
    Парсил информацию за 2-3 секунды после нажатия.

    Вот решил поставить его на другой свой сайт.. Попробовал спарсить - 0 эмоций.. После вставки ссылки и нажатию submit, проходит секунд 10-15.. и все формы пустые.. Никаких ошибок в коде парсера, связанных с ошибочным адресом источника парсинга - нет..( уверен на 99.9%).

    Ну думаю ладно, придётся искать другой сайт с нужной информацией.. Нашёл другой сайт, написал парсер для второго моего сайта - всё ок.

    Сегодня решил напарсить информации на моём первом сайте.. И что я вижу: точно такая же картина, как когда я ставил этот самый парсер на второй мой сайт. После 10+ секунд ожидания - выдаёт пустые формы..

    Ребят.. Может кто-нибудь знает, в чём может быть проблема? Заранее благодарен..

    Добавлено через 13 минут
    Добавил в парсер функцию set_time_limit(0); ..
    После 20 секундного выполнения скрипта, спарсил 2 поля из 10..
     
  2. fastpars

    fastpars Создатель

    Регистр.:
    7 апр 2010
    Сообщения:
    23
    Симпатии:
    7
    Каким образом у вас построен парсер. Покажите кусок кода. Какая у вас регулярка в preg_match_all.
    Ну и вы уверены что ресурс с которого идёт парсинг был доступен?
     
  3. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    PHP:
    <?php 
    set_time_limit
    (0);
    ?>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
    <form name="form1" method="post" action="pars.php">
    <label>
    Ссылка на страницу:<br />
    <input type="text" name="url" style="width:500px;">
    </label>
    <input type='submit' name="Submit" value='Пуск!'>
    </form><form action="pars.php" method=GET>
    <input type="submit" value="Очистить"></form>
    <?
    if (isset($_POST['url'])) 
    ($url = $_POST['url']);

    if (isset($url)) 
    {
    $input=file_get_contents($url);
    preg_match_all('|<b>Название: </b>(.*)<br>|sUS', $input, $finish);
    и т.п.

    for($i=0;$i<1; $i++)
    {
    $title = "".$finish[1][$i]."";
    и т.п.
    }

    $gogogo = "
    <form action=\"parsprocc.php\" method=post>
    <label>
    Название:<br />
    <input type=\"text\" style=\"width:400px;\" name=\"title\" value=\"".$title."\">
    </label><br />
    и т.п.

    <input type=\"submit\" value=\"Добавить в базу!\"></form>

    </form>

    ";

    echo $gogogo;
    }
    и т.п. = код, подобный вышеуказанному
    Немного борохлит сайт.. При заходе, загружается окончательно не сразу, через секунд 10-15.. Но в скрипте же указана безлимитность времени выполнения..
     
  4. fastpars

    fastpars Создатель

    Регистр.:
    7 апр 2010
    Сообщения:
    23
    Симпатии:
    7
    Почему регулярка заключена в "||sUS" а не в "//sUS" или "~~sUS" ?

    После preg_match_all
    echo "<pre>";
    print_r($finish); //Покажет всё содержимое.

    Относительно кода.
    $title = "".$finish[1][$i]."";
    ==
    $title = $finish[1][$i];

    $gogogo - зачем так над собой издеваться?
    Вот :
    ?>
    <?if (isset(...):(?> ...
    <form action ...
    ...value="<?=$title?>" ...
    ... <?endif?>
     
    yeaahhh нравится это.
  5. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Я буквально пару недель назад php стал изучать) Так что я пока чайник.. Сейчас изменю.. Думаете из-за этого не парсит?(
    Парсил же до этого.. И на другом сайте похожий код парсера - тоже парсит..
     
  6. fastpars

    fastpars Создатель

    Регистр.:
    7 апр 2010
    Сообщения:
    23
    Симпатии:
    7
    Просто поймите суть - после "?>" идёт всё кроме php кода. А ести нужно php.
    вывод переменной внутри html бедет выглядеть так <?=$qwerty?> ====== <?php echo $qwerty;?>
    цыкл так <?for(условие:(?>Любой html+php<?endfor?>
    <?foreach(условие:(?>Любой html+php<?foreach?>
    if <?if(условие:(?>1<?elseif(условие)?>2<?else:?>3<?endif?>
    Вам не придётся задумыватся о экранировании "\" и скобках "' '", '" "' ... =)

    //Дальше вы просто увидите весь массив finish и скорее всего поймёте в чём дело.
    echo "<pre>";
    print_r($finish);
     
    yeaahhh нравится это.
  7. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    Это не единственные возможные ограничители регулярного выражения.

    Перейти по ссылке, при парсинге со сторонних ресурсов возможны 3 ошибки:
    1) запрашиваемая страница не найдена
    2) запрашиваемая страница найдена, но выдает не то что нужно
    3) неверно составлено регулярное выражение

    во избежании этих проблем надо делать логирование, а именно:
    1) если получаешь страницу через curl, в нем есть собственная функция обработки ошибок curl_errno. Если нашел ошибку пишешь в какой-нибудь файл лога;
    2) если страница получено но неверно обработана регулярным выражением, опять же пишешь в лог контент полученной страницы и то что нарезало регулярное выражение.
     
    yeaahhh нравится это.
  8. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Сдаётся мне, что проблема в соединении с желаемой страницей(с чего бы это вдруг?!)..
    Можно ли как-то это проверить через if..else?
     
  9. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    int curl_errno ( resource ch )

    Возвращает код ошибки для последней операции cURL с дескриптором ch, или 0 (ноль), если ошибки не было.



    string curl_error ( resource ch )


    Возвращает сообщение об ошибке для последней операции cURL с дескриптором ch, или '' (пустую строку), если ошибки не было.
     
    yeaahhh нравится это.
  10. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    saen, к сожалению, с curl не знаком.. Не напишите простенькую проверочку с присутствием int curl_errno ( resource ch )?
     
Статус темы:
Закрыта.