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

Статус
В этой теме нельзя размещать новые ответы.

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..
 
Каким образом у вас построен парсер. Покажите кусок кода. Какая у вас регулярка в preg_match_all.
Ну и вы уверены что ресурс с которого идёт парсинг был доступен?
 
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.. Но в скрипте же указана безлимитность времени выполнения..
 
Почему регулярка заключена в "||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?>
 
Я буквально пару недель назад php стал изучать) Так что я пока чайник.. Сейчас изменю.. Думаете из-за этого не парсит?(
Парсил же до этого.. И на другом сайте похожий код парсера - тоже парсит..
 
Просто поймите суть - после "?>" идёт всё кроме 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);
 
Почему регулярка заключена в "||sUS" а не в "//sUS" или "~~sUS" ?
Это не единственные возможные ограничители регулярного выражения.

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

во избежании этих проблем надо делать логирование, а именно:
1) если получаешь страницу через curl, в нем есть собственная функция обработки ошибок curl_errno. Если нашел ошибку пишешь в какой-нибудь файл лога;
2) если страница получено но неверно обработана регулярным выражением, опять же пишешь в лог контент полученной страницы и то что нарезало регулярное выражение.
 
Сдаётся мне, что проблема в соединении с желаемой страницей(с чего бы это вдруг?!)..
Можно ли как-то это проверить через if..else?
 
int curl_errno ( resource ch )

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



string curl_error ( resource ch )


Возвращает сообщение об ошибке для последней операции cURL с дескриптором ch, или '' (пустую строку), если ошибки не было.
 
saen, к сожалению, с curl не знаком.. Не напишите простенькую проверочку с присутствием int curl_errno ( resource ch )?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху