Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Извлечение картинок
 
 автор: DBFS   (09.11.2007 в 20:45)   письмо автору
 
 

Народ, кто силен в скриптах, помогите разобраться вот с такой задачей:
Есть url:
http://www.url.com/folder/number/
Загружается страница по этому адресу. Дальше необходимо в цикле задать загрузку страниц, например так:

<script type="text/javascript">
for (var i=0; i<300000; i++) {
 var str1="http://www.url.com/folder/number/"; 
 var str2 = i;
 var str = str1+str2;
 window.location.href=str;
}
</script>

Или что то в этом роде, дальше на этапе загрузки страницы, мы например знаем параметры объекта, который представляет из себя ссылку-картинку, например, у нее на каждой странице из цикла-перебора, заданы стабильно одни и теже параметры картинки-ссылки - height="50" width="30". Вот, но проблема в том, что этих страниц очень много, и необходимо сохранять ориентируясь по этим параметрам, сохранять эту картинку где-то на локальном компьютере, и при этом назвать файл именем, которое соответствовало бы альтернативному названию, ну у каждой этой ссылки картинки есть свой alt="бла-бла1", на следующей странице, такая же ссылка картинка с такой же шириной и высотой, но с параметром alt="бла-бла2" и т.д. Так вот, проблема состоит в организации скрипта, который бы выбирал бы на каждой странице из этого цикла эту картинку и сохранял бы ее на локальном компьютере с названием файла, название соответствовало бы alt-у соответственной картинки. Скажите такое возможно организовать???

   
 
 автор: DBFS   (09.11.2007 в 20:56)   письмо автору
 
   для: DBFS   (09.11.2007 в 20:45)
 

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

   
 
 автор: sim5   (09.11.2007 в 21:29)   письмо автору
 
   для: DBFS   (09.11.2007 в 20:56)
 

В "чистом виде" JS ничего вам не сохранит на локальном компе!

   
 
 автор: DBFS   (09.11.2007 в 23:00)   письмо автору
 
   для: sim5   (09.11.2007 в 21:29)
 

Нет, ну принципиальным это не является посредством чего решить задачу - JavaScript, РНР или чем еще... Вообще эта задача решима???

   
 
 автор: DBFS   (09.11.2007 в 23:57)   письмо автору
 
   для: DBFS   (09.11.2007 в 23:00)
 

Что так никто и не предложет???

   
 
 автор: sim5   (10.11.2007 в 06:35)   письмо автору
 
   для: DBFS   (09.11.2007 в 23:57)
 

VB, WSH, ActiveX или заглянуть в кеш браузера. "Сохранить: С:\TEMP..." - такого JS не делает, а РНР и подавно, можете предложить скачать и только.

   
 
 автор: Shiva   (10.11.2007 в 13:51)   письмо автору
 
   для: sim5   (10.11.2007 в 06:35)
 

Почему? Если человек говорит, что безразлично, средствами JS или PHP это делать, можно предположить, что PHP на целевом компьютере установлен. А кеш браузера поможет только если сначала пройти по всем этим картинкам вручную. Тогда уж можно "сохранить рисунок как..." )

   
 
 автор: sim5   (10.11.2007 в 15:09)   письмо автору
 
   для: Shiva   (10.11.2007 в 13:51)
 

Хоть на каком, хоть свой, хоть чужой - JS этого не сделает. А если предположить что автор на своем хочет сохранять, то от куда идея с JS? В РНР "взять и сохранить у себя" есть уже готовое, какие могут быть проблемы.

   
 
 автор: DBFS   (10.11.2007 в 16:11)   письмо автору
 
   для: sim5   (10.11.2007 в 15:09)
 

Нет, в использовании РНР проблем нет, прямо хоть сейчас поставлю денвер и локальный сервер готов. Покажите мне на коде как мне сохранить картинку, когда по циклу скрипт будет заставлять броузер заходить на эти адреса и "выковыривать" из каждой картинки-ссылки значение alt для того чтобы назначить сохраняемому фалу *.jpg название этого alt-a. Потому что на рассуждениях у всех получается так легко, а код почему то мне никто привести не может.

   
 
 автор: Shiva   (14.11.2007 в 15:14)   письмо автору
 
   для: sim5   (10.11.2007 в 15:09)
 

sim5,
Я о JS ничего и не говорил.
Человеку нужен обычный граббер на регулярках, что вы усложняете?

<?php
$text 
"<TR> 
<TD STYLE='padding-right:15px' VALIGN='top' WIDTH='120' HEIGHT='190'> 
<A HREF='http://www.kinopoisk.ru/level/13/people/15703/'><IMG ALT='Джуд Лоу (Jude Law)' SRC='http://www.kinopoisk.ru/images/actor/15703.jpg' WIDTH='120' HEIGHT='190' STYLE='border-left:10px solid #f60' BORDER='0'></A></TD> 
                            <TD WIDTH='500' VALIGN='top'> 
                                <TABLE CELLSPACING='0' CELLPADDING='0' ......... "
;
preg_match("/(A HREF='http:\/\/www\.kinopoisk\.ru[^>]+><IMG +ALT=')([^']*)(' +SRC=')(http:\/\/www\.kinopoisk\.ru\/images\/actor\/[^']+)/i"$text$arr);
$alt $arr[2];
$url $arr[4];
?>

Регулярное выражение постарался максимально конкретизировать т.к. не знаю, какие еще img есть на этой странице.

   
 
 автор: Бамси   (10.11.2007 в 00:41)   письмо автору
 
   для: DBFS   (09.11.2007 в 20:45)
 

Конечно, в цыкле грузим пагу, из паги регуляркой выдергиваем ссылку на картинку и альт, далее качаем картинку, сохраняем ее под альтом и все.

   
 
 автор: DBFS   (10.11.2007 в 04:27)   письмо автору
 
   для: Бамси   (10.11.2007 в 00:41)
 

*из паги регуляркой выдергиваем ссылку на картинку и альт*
А вы могли бы пожалуйста набросать код, очень нужно. Плиз!

   
 
 автор: Shiva   (10.11.2007 в 04:49)   письмо автору
 
   для: DBFS   (10.11.2007 в 04:27)
 

Выложите HTML-код страницы. И отметьте комментариями нужную картинку.

   
 
 автор: DBFS   (10.11.2007 в 04:49)   письмо автору
 
   для: Бамси   (10.11.2007 в 00:41)
 

Особенно с моментом про "выдергивание альта" можете наваять код???

   
 
 автор: Shiva   (10.11.2007 в 05:03)   письмо автору
 
   для: DBFS   (10.11.2007 в 04:49)
 

Через 15 минут уйду спать. Если до тех пор не выложите код, как я просил, ничего вам не наваяю).

   
 
 автор: DBFS   (10.11.2007 в 16:19)   письмо автору
 
   для: Shiva   (10.11.2007 в 05:03)
 


<TR>
<TD STYLE='padding-right:15px' VALIGN='top' WIDTH='120' HEIGHT='190'>
<A HREF='http://www.kinopoisk.ru/level/13/people/15703/'><IMG ALT='Джуд Лоу (Jude Law)' SRC='http://www.kinopoisk.ru/images/actor/15703.jpg' WIDTH='120' HEIGHT='190' STYLE='border-left:10px solid #f60' BORDER='0'></A></TD>
                            <TD WIDTH='500' VALIGN='top'>
                                <TABLE CELLSPACING='0' CELLPADDING='0' .........
                                                                                                                                                      .........

Вот таким вот макаром, к примеру, мне нужно вытащить все портреты киноактеров с ресурса, и сохраняя каждый, присваивать картинке *.jpg название файла, которое идет в alt. Как я уже говорил, вся проблема заключается в том, что их там очень много... :-( Поэтому приходится организовывать такой странный цикл...

   
 
 автор: DBFS   (12.11.2007 в 14:14)   письмо автору
 
   для: DBFS   (10.11.2007 в 16:19)
 

Алё! Что никто не поможет?!

   
 
 автор: DBFS   (12.11.2007 в 20:29)   письмо автору
 
   для: Shiva   (10.11.2007 в 05:03)
 

Па-ма-ги-те!!!

   
 
 автор: DmitryBerkut   (13.11.2007 в 01:54)   письмо автору
 
   для: Бамси   (10.11.2007 в 00:41)
 

Что?.. Так никто и не покажет как "выдернуть" alt???

   
 
 автор: cheops   (13.11.2007 в 11:50)   письмо автору
 
   для: DmitryBerkut   (13.11.2007 в 01:54)
 

Всё это осуществить средвствами JavaScrip необходимо или PHP тоже подойдёт?

   
 
 автор: DBFS   (13.11.2007 в 16:32)   письмо автору
 
   для: cheops   (13.11.2007 в 11:50)
 

Подойдет и средствами JavaScript и php!

   
 
 автор: DmitryBerkut   (13.11.2007 в 16:33)   письмо автору
 
   для: cheops   (13.11.2007 в 11:50)
 

Подойдет и РНР и JavaScript тоже подойдет, а вобще там и то и другое нужно!

   
 
 автор: sim5   (13.11.2007 в 17:41)   письмо автору
 
   для: DmitryBerkut   (13.11.2007 в 16:33)
 


<head>
<script language="JavaScript"> 
function getAlt() {
alert(document.images[0].alt)

</script>    
</head>

<body onload="getAlt()">
<img name="as" alt="Title image" src="image.ext">
</body>

Все изображения на странице, это массив images, обращаясь к которому можно получить свойства этих изображений. Получить их (в вашем случае), можно только после загрузки страницы, т.е. когда изображения загружены. К изображениям можно обращаться не по индексу массива, а по их именам или ID. Например, для примера можно записать так:

alert(document.images["as"].alt)

   
 
 автор: DmitryBerkut   (13.11.2007 в 19:12)   письмо автору
 
   для: sim5   (13.11.2007 в 17:41)
 

Спасибо большое, я считаю, что в основном Вы мне помогли, дальше я уже скомбинирую с РНР-скриптом и завершу полностью, т.е. сохранение файлов на лок машину с присвоением файлу имени-alt.

   
 
 автор: DmitryBerkut   (13.11.2007 в 19:56)   письмо автору
 
   для: sim5   (13.11.2007 в 17:41)
 

Хорошо, а если ресурс чужой, и мне необходимо загрузить от туда большое количество картинок по этому же принципу, то что мне делать в этом случае? Использовать iframe? И как?

   
 
 автор: sim5   (14.11.2007 в 11:20)   письмо автору
 
   для: DmitryBerkut   (13.11.2007 в 19:56)
 

Я может чего-то не понимаю из того чего вы хотите, но в JS нет способов записать что-то на диск. Это возможно сделать только, если использовать WSH, ActiveX или VB. Если вы сами себе хотите записать, это еще можно, но вот стороннему клиенту вы этого сделать не сможете, у него все эти "прелести" могут быть отключены.
Если для себя, то лучше тогда через локальный сервер и РНР. Но собственно это можно сделать чисто браузером.

   
 
 автор: DmitryBerkut   (14.11.2007 в 15:08)   письмо автору
 
   для: sim5   (14.11.2007 в 11:20)
 

Ну дык все правильно! используя php-скрипт и все его "прелести", на которые он способен, на локальном компьютере, который взят как apach-сервер, с установленным на нем Денвером. Но только вот не "стороннему клиенту", а себе, т.е. - мне. Я хочу посредством совмещения всех возможностей php и JavaScript у себя на локальном компьютере собрать всю библиотеку картинок, которая находится на дугом ресурсе и принадлежит "другому дяде/мальчику", но он, в свою очередь, не против того, я думаю)), чтобы у него скопировали все портреты киноактёров, которые он собрал в своей коллекции. Понимаете?

   
 
 автор: sim5   (14.11.2007 в 15:18)   письмо автору
 
   для: DmitryBerkut   (14.11.2007 в 15:08)
 

Понимаю, но "чистым" JS вы этого не сделаете, так что ищите и изучайте WSH, например, вот вкупе с JS он это сможет сделать. Либо в РНР регуляркой вытаскивать alt и РНР же записывать файлы.
Но вообще есть программы, которые могут сканируют в сети то, что вас интересует, и сохранять это на компьютере, зачем все городить.

   
 
 автор: DmitryBerkut   (14.11.2007 в 15:16)   письмо автору
 
   для: sim5   (14.11.2007 в 11:20)
 

В принципе, есть такая "шняга", как файл *.HТА, и с помощью iframe можно получить доступ к содержимому документа с досье на каждого актера, но вот вопрос в том, как совместить этоти "прелести" php-скрипта с самим *.НТА файлом, для копирования на локалку этих картинок. В кэш броузера можно попробовать, на мне кажется что это не реально: "выцепить" из кэша именно ту картинку, которая нам необходима.

   
 
 автор: sim5   (14.11.2007 в 15:23)   письмо автору
 
   для: DmitryBerkut   (14.11.2007 в 15:16)
 

Никак. НТА это для локального клиента, грубо говоря, можете переименовать любой html в hta, хоть сейчас, будут некоторые сложности, но собственно вы сможете увидеть различия - это уже будет практически самостоятельное приложение, достаточно взгялянуть на окно открытого файла.

   
 
 автор: Shiva   (14.11.2007 в 15:29)   письмо автору
 
   для: sim5   (14.11.2007 в 15:23)
 

Граждане, вы о чем? Человеку нужно просто скопировать с сайта базу фоток с названиями. На свой комп, куда он готов поставить PHP. При чем тут hta, прости господи.

Рабочий код выложил выше., т.к. не на то сообщение ответил, сорри...

ps. DmitryBerkut , вы и есть DBFS? )

   
 
 автор: DmitryBerkut   (14.11.2007 в 16:04)   письмо автору
 
   для: Shiva   (14.11.2007 в 15:29)
 

Да, DmitryBerkut это я, я же и DBFs. Сорри за двуличность, просто DmitryBerkut это мой постоянный ник, а в тот момент, когда срочно нужен был совет, я забыл пароль Дмитрия Беркута)). Бывает...
Так вернемся к проблеме, Shiva, прежде чем я воспользуюсь вашим кодом на локальной машине-сервере, скажите пожалуйста, можно ли в php-скрипте сделать так:

<?php 
$text
=?><iframe src="http://www.kinopoisk.ru/level/4/people/10079/"></frame>
<?php ;
?>

???

   
 
 автор: Faraon   (14.11.2007 в 16:11)   письмо автору
 
   для: DmitryBerkut   (14.11.2007 в 16:04)
 

А почему бы не так:

<?php
$text
="<iframe src=\"http://www.kinopoisk.ru/level/4/people/10079/\"></frame>";
print 
$text;
?>

   
 
 автор: Shiva   (14.11.2007 в 16:19)   письмо автору
 
   для: DmitryBerkut   (14.11.2007 в 16:04)
 

Зачем? Вам Javascript и фреймы здесь вообще не понадобятся.
Просто получите код страницы функцией file_get_contents() и подставьте его в мой код на место переменной $text.

   
 
 автор: DmitryBerkut   (14.11.2007 в 21:42)   письмо автору
 
   для: Shiva   (14.11.2007 в 16:19)
 

Сделал вот так:


<?php
for($i=100$i<125$i++) {
    
    
$text=file_get_contents('http://www.kinopoisk.ru/level/4/people/'.$i.'/index.php');
    
preg_match("/(A HREF='http:\/\/www\.kinopoisk\.ru[^>]+><IMG +ALT=')([^']*)(' +SRC=')(http:\/\/www\.kinopoisk\.ru\/images\/actor\/[^']+)/i"$text$arr);
    
$alt $arr[2];
    
$src $arr[4];
    echo 
"alt = ".$alt."; src = ".$src."\n";
}
?>

Выдает ошибку:

Notice: Undefined offset: 2 in z:\home\localhost\www\kinopoisk.php on line 9
[ убрать подсказку | никогда больше не показывать ]

Это предупреждение, вероятнее всего, возникает вследствие высокого уровня контроля ошибок в PHP, по умолчанию установленного в Денвере (E_ALL). Такой режим вывода ошибок является рекомендуемым и сильно помогает при отладке скриптов. Однако множество готовых скриптов требуют более низкого уровня ошибок.

Вы можете установить более слабый контроль ошибок одним из следующих способов:

    * Впишите в скрипты строчку:

      Error_Reporting(E_ALL & ~E_NOTICE);

      Этот способ особенно удобен, если в скрипте есть один файл (конфигурационный), который подключается всеми остальными.
    * Рекомендуемый способ. Создайте в директории со скриптом файл .htaccess следующего содержания:

      php_value error_reporting 7

    * Исправьте в /usr/local/php/php.ini значение error_reporting на E_ALL & ~E_NOTICE. Этот способ не является рекомендуемым и может привести к серьезным неудобствам при отладке!

[Денвер: показать возможную причину ошибки]
Notice: Undefined offset: 4 in z:\home\localhost\www\kinopoisk.php on line 10
alt = ; src =
Notice: Undefined offset: 2 in z:\home\localhost\www\kinopoisk.php on line 9

Notice: Undefined offset: 4 in z:\home\localhost\www\kinopoisk.php on line 10
alt = ; src =
Notice: Undefined offset: 2 in z:\home\localhost\www\kinopoisk.php on line 9

Notice: Undefined offset: 4 in z:\home\localhost\www\kinopoisk.php on line 10
alt = ; src =
Notice: Undefined offset: 2 in z:\home\localhost\www\kinopoisk.php on line 9


Что не так?

   
 
 автор: DmitryBerkut   (15.11.2007 в 13:48)   письмо автору
 
   для: DmitryBerkut   (14.11.2007 в 21:42)
 

Народ, я уже даже закомментил основную часть, и сделал просто вывод file_get_contents файла страницы, остается чистый экран, нифига не выполняется, что это может значить?


<?php
$url_1
="http://www.kinopoisk.ru/level/4/people/";
$url_2="/index.php";
/*
for($i=100; $i<125; $i++) {
    $url=$url_1+$i+$url_2;
    $text=file_get_contents('http://www.kinopoisk.ru/level/4/people/'.$i.'/index.php');
    preg_match("/(A HREF='http:\/\/www\.kinopoisk\.ru[^>]+><IMG +ALT=')([^']*)(' +SRC=')(http:\/\/www\.kinopoisk\.ru\/images\/actor\/[^']+)/i", $text, $arr);
    $alt = $arr[2];
    $src = $arr[4];
    echo "alt = ".$alt."; src = ".$src."\n";
} */
$text=file_get_contents('http://www.kinopoisk.ru/level/4/people/4561/index.php');
echo
$text;
?>

   
 
 автор: Shiva   (15.11.2007 в 17:12)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 13:48)
 

Проблемы вот какие:
1. Вы мне скинули неправильный HTML.
2. На каждой второй странице изображение отсутствует - это тоже нужно учесть в регулярке.
3. На сервере стоит защита, проверяющая заголовки, поэтому file_get_contents() не подойдет.

Набросал вот что:

<?php
for($i=100$i<125$i++) { 
     
    
$text=getContent('level/4/people/'.$i.'/index.php'); 
    
preg_match("/(<img +alt=')([^']*)(' +src=')(\/images\/actor\/[^']+)/i"$text$arr); 
    if(!
$arr[4])
    {
        
preg_match("/(<img +alt=')([^']*)(' +src=')(\/images\/image_none.gif)/i"$text$arr); 
    }
    
$alt $arr[2]; 
    
$src $arr[4]; 
    echo 
"alt = ".$alt."; src = ".$src."\n";


function 
getContent($queryStr)
{
    
$socket fsockopen("www.kinopoisk.ru"80); 
    
$headers "GET /$queryStr HTTP/1.0\r\n" 
        
."Host: www.kinopoisk.ru\r\n" 
        
."Referer: http://www.kinopoisk.ru/index.php\r\n" 
        
."User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.51\r\n" 
        
."Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n" 
        
."Accept-Language: ru,en;q=0.9\r\n" 
        
."Connection: Keep-Alive\r\n" 
        
."Accept-Charset: windows-1251, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n\r\n"
    
fwrite($socket$headers); 
    
$buff ""
    while(!
feof($socket)) 
    {
        
$buff .= fread($socket1024); 
    }
    
fclose($socket); 
    list(
$headers$body) = explode("\r\n\r\n"$buff2); 
    return 
$body;
}
?>


Но не радуйтесь. Это сработало на нескольких страницах, после чего мой ip автоматически попал в черный список, о чем мне сообщили и предложили для решения проблемы авторизоваться.

При такой защите функцию придется писать через curl с получением и отправкой cookie, а у меня сейчас на это времени нет. Если до тех пор вам не помогут, может, напишу на выходных.

ps. Вполне вероятно, что сервер анализирует просто "нечеловеческую" частоту обращений. Тогда решением может быть вызов, скажем, sleep(5) после каждой итерации цикла. Попробуйте.

   
 
 автор: DmitryBerkut   (15.11.2007 в 18:34)   письмо автору
 
   для: Shiva   (15.11.2007 в 17:12)
 

ок, с вставкой sleep(5) в каждую итерацию попробую

   
 
 автор: DmitryBerkut   (15.11.2007 в 19:25)   письмо автору
 
   для: Shiva   (15.11.2007 в 17:12)
 

Клас. Ваш совет с применением sleep(5) прошел на ура, только вот броузер выдает:

Fatal error: Maximum execution time of 30 seconds exceeded in z:\home\localhost\www\kinopoisk.php on line 16

Можно это как-нибудь убрать? Или я сейчас попробую запись в файл. А лучше подскажите, что бы это такого хитренького придумать, чтобы после каждой итерации выводился результат, а не происходило ожидание выполнения всего скрипта с учетом sleep(5) в конце цикла for. Может переменную $i передавать методом пост, предварительно увеличивая ее на единицу. Сейчас я попробую и сообщу результат.

   
 
 автор: DmitryBerkut   (15.11.2007 в 19:44)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 19:25)
 

Чё-то нифига. Ну хорошо! А почему оно не выводит каждый раз в каждой итерации значения alt и src? А дожидается полного завершения выполнения сценария, а не отдельной итерации цикла for?

<?php
Error_Reporting
(E_ALL & ~E_NOTICE);
for(
$i=6141$i<6161$i++) {

    
$text=getContent('level/4/people/'.$i.'/index.php');
    
preg_match("/(<img +alt=')([^']*)(' +src=')(\/images\/actor\/[^']+)/i"$text$arr);
    if(!
$arr[4])
    {
        
preg_match("/(<img +alt=')([^']*)(' +src=')(\/images\/image_none.gif)/i"$text$arr);
    }
    
$alt $arr[2];
    
$src $arr[4];
    echo 
"alt = ".$alt."; src = ".$src."\n";
    echo 
$i."\n\n";
    
sleep(5);                                     // иначе ведь повторится ситуация с вашим ip
}

function 
getContent($queryStr)
{
    
$socket fsockopen("www.kinopoisk.ru"80);
    
$headers "GET /$queryStr HTTP/1.0\r\n"
        
."Host: www.kinopoisk.ru\r\n"
        
."Referer: http://www.kinopoisk.ru/index.php\r\n"
        
."User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.51\r\n"
        
."Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n"
        
."Accept-Language: ru,en;q=0.9\r\n"
        
."Connection: Keep-Alive\r\n"
        
."Accept-Charset: windows-1251, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n\r\n";
    
fwrite($socket$headers);
    
$buff "";
    while(!
feof($socket))
    {
        
$buff .= fread($socket1024);
    }
    
fclose($socket);
    list(
$headers$body) = explode("\r\n\r\n"$buff2);
    return 
$body;
}
?>

   
 
 автор: DmitryBerkut   (15.11.2007 в 20:05)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 19:44)
 

Результат выполнения в FireFox и в IE.6 один и тот же:

alt = Джим Керри (Jim Carrey); src = /images/actor/6141.jpg 6141 alt = Рене Зельвегер (Ren&#233;e Zellweger); src = /images/actor/6142.jpg 6142 alt = Соо Браунли (Mongo Brownlee); src = /images/actor/6143.jpg 6143
Fatal error: Maximum execution time of 30 seconds exceeded in z:\home\localhost\www\kinopoisk.php on line 34

   
 
 автор: Shiva   (15.11.2007 в 20:54)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 20:05)
 

поставьте в начале

set_time_limit(0);

ps. Было бы странно, если б сообщение о серверной ошибке было разным в разных браузерах )

   
 
 автор: Shiva   (15.11.2007 в 20:58)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 20:05)
 

А чтобы выводить результат после каждого запроса, попробуйте перед вызовом sleep
написать

flush();

Это должно в принудительном порядке сбросить буфер. Скорее всего, сработает, но зависит от настроек. (Последнее, кстати, и к set_time_limit() относится).

   
 
 автор: DmitryBerkut   (15.11.2007 в 20:16)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 19:44)
 

И почему символ следующей "\n" строки не работает?

   
 
 автор: Shiva   (15.11.2007 в 21:04)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 20:16)
 

Что значит, не работает? Если откроете исходный код, то там перенос, веротно, есть (хотя если под windows, то нужно \r\n). Но на HTML странице, в общем случае, перенос строки отобразится только на месте тега <br /> (<br>)

   
 
 автор: DmitryBerkut   (19.11.2007 в 16:08)   письмо автору
 
   для: Shiva   (15.11.2007 в 17:12)
 

Shiva, Вы говорили что необходимо писать через curl с получением и отправкой cookie. Если Вы очень заняты или Вам лень делать, то направте меня в нужное, ткскзть, русло, я попробую сам разобраться, может чё и напишу...

   
 
 автор: DmitryBerkut   (15.11.2007 в 14:20)   письмо автору
 
   для: sim5   (13.11.2007 в 17:41)
 

А есть в JS контроль загруженности страницы. Ну т.е. страница загружена на 100%, например, объект возвращает true???

   
 
 автор: DmitryBerkut   (15.11.2007 в 22:01)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 14:20)
 

Вобщем итог всей этой дискуссии и помощи Shiva, за что ему отдельная благодарность, это скрипт, который грабит картинки с ресурса и называет файлы картинок именами, соответствующими alt-у картинки без всяких JS и WSH:

<?php                   
Error_Reporting
(E_ALL & ~E_NOTICE);
set_time_limit(0);
for(
$i=1$i<1505487$i++) {

    
$text=getContent('level/4/people/'.$i.'/index.php');
    
preg_match("/(<img +alt=')([^']*)(' +src=')(\/images\/actor\/[^']+)/i"$text$arr);
    if(!
$arr[4])
    {
        
preg_match("/(<img +alt=')([^']*)(' +src=')(\/images\/image_none.gif)/i"$text$arr);
    }
    
$alt $arr[2];
    
$src $arr[4];
    
//echo "alt = ".$alt."; src = ".$src;
    //echo"\n";
    
$fp=fopen("actors/alt_src.txt","a");
    
fwrite($fp$i.". ".$alt." * ".$src."\n");
    
fclose($fp);
    if(
$src != '/images/image_none.gif') {
      
copy("http://www.kinopoisk.ru".$src"Z:/home/localhost/www/actors/".$alt.".jpg");
      echo 
$i.". Скопировано $alt <br>";
    }
    
sleep(5);
}

function 
getContent($queryStr)
{
    
$socket fsockopen("www.kinopoisk.ru"80);
    
$headers "GET /$queryStr HTTP/1.0\r\n"
        
."Host: www.kinopoisk.ru\r\n"
        
."Referer: http://www.kinopoisk.ru/index.php\r\n"
        
."User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.51\r\n"
        
."Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n"
        
."Accept-Language: ru,en;q=0.9\r\n"
        
."Connection: Keep-Alive\r\n"
        
."Accept-Charset: windows-1251, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n\r\n";
    
fwrite($socket$headers);
    
$buff "";
    while(!
feof($socket))
    {
        
$buff .= fread($socket1024);
    }
    
fclose($socket);
    list(
$headers$body) = explode("\r\n\r\n"$buff2);
    return 
$body;
}
?>

Скрипт реально работает, сам проверил, и поставил на ночь на работе на закачьку всех картинок этого ресурса.
Только перед запуском скрипта необходимо создать подкаталог "actors" в той же директории, где расположен исполняемый файл-скрипт.

   
 
 автор: DmitryBerkut   (16.11.2007 в 17:12)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 22:01)
 

Чё-то после десятка таких пробных копирований картинок, скрипт перестал работать. Что могло произойти??? Хотя я поставил на-ночь, на работе, на выполнение, то штук 300 скопировало, но все же - при выполнении скрипта, сразу, не происходит нормального обращения к ресурсу, с чем это может быть связано???

   
 
 автор: DmitryBerkut   (16.11.2007 в 18:17)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 22:01)
 

чё-то даже вот эта байда не помогает:

<?php
    
// функция разделения URL
function _parse_url ($path) {
preg_match ("~(.+)?:\/\/([&#710;\/]+)([&#710;\?]*)[\?]?([&#710;\/]*)~"$path$arr);
if(
$arr[0]==''){ return array (path =>$path); }
return array (
scheme => $arr[1], host => $arr[2], path => $arr[3], query => $arr[4]);
}
    
// функция вывода
function output_r ($path){
    
$arr _parse_url($path);
    
$host $arr[host];
    
$page $arr[path];
    
$query $arr[query];
    if(
$query!=''){$page.='?'.$query;}
    if(
$page==''){$page='/';}
    
$fp = @fsockopen($host80, &$errno, &$errstr30);
    if(!
$fp){ return implode('',@file($path)); }
    
$request "GET $page HTTP/1.0\r\n";
    
$request .= "Host: $host\r\n";
    
$request .= "Accept: text/html, application/xml;q=0.9, */*;q=0.1\r\n";
    
$request .= "Accept-Charset: windows-1251, utf-8;q=0.6, *;q=0.1\r\n";
    
$request .= "Accept-Encoding: deflate, gzip, identity, *;q=0\r\n";
    
$request .= "Accept-Language: ru\r\n";
    
$request .= "Connection: close\r\n";
    
$request .= "Keep-Alive: 300\r\n";
    
$request .= "Expires: Thu, 01 Jan 1970 00:00:01 GMT\r\n";
    
$request .= "Cache-Control: no-store, no-cache, must-revalidate\r\n";
    
$request .= "Pragma: no-cache\r\n";
    
$request .= "Cookie: income=1\r\n";
$request .= "Referer: http://$host/\r\n";
    
$request .= "User-Agent: Mozilla/5.0 (compatible; MSIE 6.0; Windows 98)\r\n";
    
$request .= "\r\n";
    
fwrite ($fp,$request);
         while (
$line fgets($fp1024)){
             if (
preg_match("~&#710;\r{0,1}\n$~i",$line)){$fest='yes';}
             elseif(
$fest=='yes'){$out .= $line;}
            } 
    return 
$out;
}

           
// Начинаем считывание
for($i=6141$i<6145$i++) {

    
$text=output_r('http://www.kinopoisk.ru/level/4/people/'.$i.'/index.php');
    
preg_match("/(<img +alt=')([^']*)(' +src=')(\/images\/actor\/[^']+)/i"$text$arr);
    if(!
$arr[4])
    {
        
preg_match("/(<img +alt=')([^']*)(' +src=')(\/images\/image_none.gif)/i"$text$arr);
    }
    
$alt $arr[2];
    
$src $arr[4];
    
//echo "alt = ".$alt."; src = ".$src;
    //echo"\n";
    
$fp=fopen("actors/alt_src.txt","a");
    
fwrite($fp$i.". ".$alt." * ".$src."\n");
    
fclose($fp);
    if(
$src != '/images/image_none.gif') {
      
copy("http://www.kinopoisk.ru".$src"Z:/home/localhost/www/actors/".$alt.".jpg");
      echo 
$i.". Скопировано <b> $alt <\/b><br>";
    }
    
sleep(5);
}
?>

   
 
 автор: sim5   (16.11.2007 в 18:34)   письмо автору
 
   для: DmitryBerkut   (16.11.2007 в 18:17)
 

PicaLoader
PicDownloader
Right Picture Download Manager
webimage miner
Picture Pump
Internet Image Browser
Free Picture Finder
.....
И еще целая куча софта для этого. Мне кажется можно найти то, что удовлетворит ваши запросы.

   
 
 автор: DmitryBerkut   (16.11.2007 в 18:37)   письмо автору
 
   для: sim5   (16.11.2007 в 18:34)
 

укажите мне то, что действительно удовлетворит мои запросы, а список софта я тоже могу накидать. Вы читали суть задачи, каким образом мне нужна закачка изображений?

   
 
 автор: sim5   (16.11.2007 в 18:53)   письмо автору
 
   для: DmitryBerkut   (16.11.2007 в 18:37)
 

Читал конечно, весь софт просмотреть не могу, но то что его полно и под всякие задачи, я не сомневаюсь. Я не искал изображения и не собирал картинки как вы это делаете, я предпочитаю покупать диски с изображеними очень высокого разрешения, а в сети ищу только то, чего нет у меня, и сохраняю под тем именем, какое мне нужно. Не верится мне, что нет того, что вам нужно, хотя бы исходя из того, что такая блестящая идея, как сохранение изображения под именами их alt, не вам первому в голову пришла.
Кстати alt ведь не обязательно может быть коротким, и не тем чего я бы хотел ожидать.

   
 
 автор: DmitryBerkut   (16.11.2007 в 19:03)   письмо автору
 
   для: sim5   (16.11.2007 в 18:53)
 

Нет, Уважаемый, Вы не правы. На счет высокого изображения картинок - тут вобще, по-моему, высказывания не в тему. Поэтому проигнорирую. Что касается alt-та, как Вы выражаетсесь - "не обязательно короткого" - ну, не знаю, на сколько имя и фамилия кинозвезды может это позволить. Я определил границу итераций своего цикла, иными словами - количество киноактеров на ресурсе - 1505487 человек. Из этого полутора миллиона, я ниодного еще имени не видел, которое, как Вы говорите было бы, ну аж, слишком большим. Далее, на счет того что мне не первому пришла такая идея в голову, естественно, я здравомыслящий человек, и прекрасно понимаю что - не первому. И что дальше? Неужели вы считаете что я не обращался к поиску. Вы знаете, я очень ленивый человек, ленивый в том плане, что я лучше сделаю один раз так, как следует, и тщательно, чем буду много раз страдать всякого рода фигней, кпримеру, поиском!

   
 
 автор: sim5   (16.11.2007 в 19:25)   письмо автору
 
   для: DmitryBerkut   (16.11.2007 в 19:03)
 

Ну если вы нацелены только на актеров, может так и лучше. Я ведь не говорю что вы фигней занимаетесь, просто я всегда находил тот или иной софт мне необходимый, потому и предполагаю, что и ваш есть.

   
 
 автор: DmitryBerkut   (19.11.2007 в 16:04)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 22:01)
 

Shiva, спасайте ситуацию, блин, оно не хочет копировать. IP - забанили. Т.е. вручную зайдя, к примеру, скажем на вот этого актера: http://www.kinopoisk.ru/level/403/ оно пишет что доступ запрещен. В чем может быть проблема? Хотя со sleep(5) - скрипт реально работал, я пол вечера копировал. А потом вдруг бац!!!...

   
 
 автор: Unkind   (19.11.2007 в 16:30)   письмо автору
 
   для: DmitryBerkut   (19.11.2007 в 16:04)
 

> Т.е. вручную зайдя, к примеру, скажем на вот этого актера: http://www.kinopoisk.ru/level/403/ оно пишет что доступ запрещен

Посмотрите на адрес внимательно. Какой это актер? У всех будет "доступ запрещен".

   
 
 автор: DmitryBerkut   (19.11.2007 в 16:55)   письмо автору
 
   для: Unkind   (19.11.2007 в 16:30)
 

Блин, ну ребята!!! Ну что такое. Ну зачем флудить? Ну по сути высказывайтесь. Он уже придрался к адресу, ну например вот этот вот:http://www.kinopoisk.ru/level/4/people/6794/

   
 
 автор: DmitryBerkut   (19.11.2007 в 20:20)   письмо автору
 
   для: DmitryBerkut   (15.11.2007 в 22:01)
 

Вобщем народ! Скрипт пашет, но проблема: забанили ip-адрес. Как поступить? Надо по-зарез скачать эту базу "портретов")!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования