Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написание простого паука 
:(
    Опции темы
Burrr
Дата 21.5.2007, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 4.9.2005

Репутация: 1
Всего: 20



Задача: необходимо написать небольшой php-скрипт, который будет лазить по определенному УРЛ-у(ам) и забирать HTML-контент.
Написал я такую штуку:
Код
$contents = array();
//for ($i = 1; $i <= 50; $i++) {
    $handle = fopen("http://xxxxxxxxx.com/index.php?page=".$i, "rb");
    while (!feof($handle)) {
        $contents[] = fread($handle, 8192);
    }
    fclose($handle);
//}

Далее я распарсиваю полученный HTML-код (хотя это не важно).
И всё бы хорошо, даже для одной страницы всё работает, но вот в случае цикла скрипт работает больше какого-то количества секунд и мне выдается что-то типа "Превышен интервал...".

Вопросы:
1) Правильно ли я подхожу для решения этой проблемы или нужен другой код?
2) Как избежать обрубания по таймауту?
3) Как сделать, чтобы этот php-файл (назовем его pauk.php) запускался по таймауту, предположим 2 раза в сутки?

Прошу помочь разобраться в новом для меня вопросе!


--------------------
PM MAIL ICQ   Вверх
mishaSL
Дата 21.5.2007, 19:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



Цитата(Burrr @  21.5.2007,  17:28 Найти цитируемый пост)
1) Правильно ли я подхожу для решения этой проблемы или нужен другой код?

Лучше делать через cUrl:
Код

/* $cUrl - соединение через curl_init(), $url - адрес необходимой страницы*/
function FileGetContents(& $cUrl, $url, $port = 80, $timeout = 10, $errCount = 1)
{
    curl_setopt($cUrl, CURLOPT_URL, $url);
    curl_setopt($cUrl, CURLOPT_PORT, $port);
    curl_setopt($cUrl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($cUrl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)");
    curl_setopt($cUrl, CURLOPT_TIMEOUT, $timeout);
    $content = curl_exec($cUrl);
    if (curl_getinfo($cUrl,CURLINFO_HTTP_CODE) != 200) {
        return (($errCount < 3) ? FileGetContents($url, $port, $timeout, ++$errCount) : false);
    } else {
        return $content;
    }
}
$cUrl = curl_init();
print FileGetContents($cUrl , 'http://www.google.com');
curl_close($cUrl);

или через сокеты:
Код

<?php
function getUrlContents($url)
{
   $url_parsed = parse_url($url);
   $host = $url_parsed["host"];
   if ($url == '' || $host == '') {
       return false;
   }
   $port = ($url_parsed["port"] == 0 ? 80 : $url_parsed["port"]);
   $path = (empty($url_parsed["path"]) ? '/' : $url_parsed["path"]);
   $path.= (!empty($url_parsed["query"]) ? '?'.$url_parsed["query"] : '');
   $out = "GET $path HTTP/1.0\r\nHost: $host\r\nConnection: Close\r\n\r\n";
   $fp = fsockopen($host, $port, $errno, $errstr, 30);
   fwrite($fp, $out);
   $headers = '';
   $content = '';
   $buf = '';
   $isBody = false;
   while (!feof($fp)) {
        $buf = fgets($fp, 1024);
        if ($isBody) {
            $content .= $buf;
        } else {
            $headers .= $buf;
        }
        if ($buf == "\r\n" ) {
            $isBody = true;
        }
   }
   fclose($fp);
   return array('headers'=>$headers,'body'=>$content);
}
$s = getUrlContents('http://ru2.php.net/manual-lookup.php?pattern=fsock');
print $s['body'];
?>


Цитата(Burrr @  21.5.2007,  17:28 Найти цитируемый пост)
2) Как избежать обрубания по таймауту?

Код

set_time_limit(0);

если PHP не в безопасном режиме.
Цитата(Burrr @  21.5.2007,  17:28 Найти цитируемый пост)
3) Как сделать, чтобы этот php-файл (назовем его pauk.php) запускался по таймауту, предположим 2 раза в сутки?

Если сервер на *nix платформе, то через cron - планировщик.



--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
teroni
Дата 21.5.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 15.5.2007
Где: Днепропетровск

Репутация: 8
Всего: 22



Цитата(mishaSL @  21.5.2007,  19:11 Найти цитируемый пост)
Лучше делать через cUrl или через сокеты...

А можно узнать, чем лучше?
Вот например 100 страничек кто быстрее скачает - file, curl_exec или fsockopen (странички, сервер для скриптов одни и те же)?
PM MAIL   Вверх
Burrr
Дата 22.5.2007, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 4.9.2005

Репутация: 1
Всего: 20



mishaSL, пасиб за подробный разжеванный ответ! +1

Было бы интересно услышать ответ на вопрос teroni. Какой из 3-х методов (включая мой) наиболее заточен для решения данной задачи? Какой их них будет удобен для получения и сохранения бинарников (например, картинок) в БД? Какой быстрее?

Это сообщение отредактировал(а) Burrr - 22.5.2007, 05:52


--------------------
PM MAIL ICQ   Вверх
mishaSL
Дата 22.5.2007, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



Цитата(Burrr @  22.5.2007,  05:48 Найти цитируемый пост)
mishaSL, пасиб за подробный разжеванный ответ!

Всегда пожалуйста smile 

Цитата(teroni @  21.5.2007,  23:27 Найти цитируемый пост)
Вот например 100 страничек кто быстрее скачает - file, curl_exec или fsockopen (странички, сервер для скриптов одни и те же)? 

Цитата(Burrr @  22.5.2007,  05:48 Найти цитируемый пост)
Было бы интересно услышать ответ на вопрос teroni. Какой из 3-х методов (включая мой) наиболее заточен для решения данной задачи? Какой их них будет удобен для получения и сохранения бинарников (например, картинок) в БД? Какой быстрее?

Разницы между сокетами и curl-ом в скорости нет почти никакой, просто кому как удобнее и не на всех хостингах curl стоит (хотя на большенсте есть).  А по поводу получения удаленных файлов через функции file, fopen и т.д. можете почитать следующую информацию:
http://vingrad.ru/PHP-PHPNETHTTP-003044
Также скорее всего будет интересна вот эта тема:
http://forum.vingrad.ru/index.php?showtopi...t&p=1047619

А быстрее и правильнее будет все таки через curl или сокеты smile 







--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
-=Ustas=-
Дата 22.5.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Burrr, я тут http://forum.vingrad.ru/index.php?showtopi...t&p=1022357 как то публиковал своего паука, в принципе можешь его под себя заточить.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1028 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.