Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > Получение определенной части html-страницы


Автор: AriX 29.8.2005, 15:57
Проблема такая.

Нужно скриптом перебрать кучу страничек, чтобы выдрать оттуда определенную информацию.
Вообщем-то, скачать страничку, и найти в ней нужное проблем не составляет.
Но! Этих страниц порядка 50 тысяч, и каждая весит ~50 Кб. Т.е. если скачивать ее полностью, уйдет много трафика. Да и по скорости это долго.

Инфа, которая нужна, хранится практически в конце html-кода. Т.е. в принципе, мне нужно скачать только определенное кол-во байт в конце страницы.

Проблема как раз в этом и заключается - как это можно сделать?

Пробовал указывать загаловок Range при запросе страницы, но сервер все равно отдает ее всю, и возвращает код 200 OK, вместо 206 Partial content.

Есть подозрение, что сервер просто по сути, не поддерживает докачку для text/html файлов, коими обычные html'ки являются.
В RFC про HTTP 1.1 ничего не нашел (может плохо искал?).

Заранее спасибо за любые разъяснения!

Автор: IZ@TOP 30.8.2005, 21:06
Сомневаюсь что такое вообще возможно.
Если скрипт находится на срвере хостера то зачем траффик жалеть?

Автор: AriX 31.8.2005, 08:59
IZ@TOP
Цитата
Если скрипт находится на срвере хостера то зачем траффик жалеть?

smile Хитрый ты. Скрипт на сервере хостера не лежит smile Тот хостинг, который мне доступен не разрешает соединения открывать. Конечно, я теперь буду пробовать wget'ом сливать.
Но меня просто заинтересовала эта проблема.
Про трафик: одна страничка весит 31 КБ в среднем... Этих страничек 46600
46600 * 31 КБ / 1024 = 1410 МБ
Многовато smile Если еще учесть, что из этих 30 КБ мне нужно максимум 100 байт smile
Цитата
Сомневаюсь что такое вообще возможно.

Похоже так оно и есть, сервак может решать, обрабатывать ли ему заголовок Range или нет. Получается, что text/html они отдают только полностью :-/

Автор: Mal Hack 31.8.2005, 13:32
Если ты юзаешь fsockopen, то с ним можно попробовать заюзать fseek, но не думаю, что прокатит

Автор: AriX 1.9.2005, 11:00
Mal Hack
На другом форуме примерно разобрались в чем проблема: все зависит от сервера, т.е. захочет ли он отдавать часть запрошенного документа или нет. Вот например по-дефолту Апач 1.3.33 не хочет, а Апач 2.x отдает запрошенную часть :-/
А сервер, с которого мне нужно, стоит на 1.3.33.. Так что облом похоже smile

Автор: matrlx 22.9.2005, 01:16
Код

<?
function httpget($host, $port, $page, $servcookie){
Global $cookie;

while (true){
unset($tryagain);
unset($data);
unset($cookiearray);

if ($page==""){$page="/";}

$fp=@fsockopen($host, $port);
$query="GET $page HTTP/1.1\r\n";
$query.="Accept: */*\r\n";
$query.="Accept-Language: ru\r\n";
$query.="User-Agent: WapWorker/2.0\r\n";
$query.="Host: $host\r\n";
$query.="Connection: Keep-Alive\r\n";
if (isset($cookie)){$query.="Cookie: $servcookie\r\n";}
$query.="\r\n";
fputs($fp,$query);
while(!feof($fp)){$data.=fread($fp,4096);}
fclose($fp);

$headers=explode("\r\n", substr($data,0,strpos($data,"\r\n\r\n")));

foreach ($headers as $header){

if (substr($header,0,12)=="Set-Cookie: "){
 $cookiearray[]=eregi_replace("(Set-Cookie: )([0-9a-z=]+)(; )?(.*)$","\\2",$header);
}

if (substr($header,0,10)=="Location: "){
 $redir=eregi_replace("(Location: )(.+)$","\\2",$header);
 if (substr($redir,0,7)=="http://"){
  $host=eregi_replace("(http://)([^/]+)(/)?(.*)","\\2",$redir);
  $page=eregi_replace("(http://)([^/]+)(.*)","\\3",$redir);
 } else {
  $page=$redir;
 }
 $tryagain=1;
 break;
}

}

$cookie.=@implode("; ",$cookiearray);
$servcookie=$cookie;

if (!$tryagain){break;}
}
return $data;
}
set_time_limit(0);

httpget("www.sitename.ru", 80, "/login.php?login=1234&pass=1234", "");

//object.php - страница с которой выдераем инфу
$data=httpget("www.sitename.ru", 80, "/object.php?id=$id", $cookie);

//Обрезаем заголовок из $data
//Обрабатываем $data как душе угодно!


?>

Автор: AriX 22.9.2005, 09:53
matrlx
Не пойму... Этот код разве поможет вытащить часть страницы?

Автор: matrlx 2.10.2005, 01:25
С помошью этого кодо можно вытащить всю страницу а потом уже используя шаблоны можно извлечь части страницы!
Скажи что тебе конкретно надо получить со страницы?
Какую инфу? На конкретном примере той страницы, которую те надо разкурочить! smile

Автор: AriX 3.10.2005, 08:36
matrlx
Всю страницу мне качать не нужно, это понятно как сделать.
Нужна только определенная часть.
Смотри начало топика.
В принципе мы уже разобрались, в любом случае все зависит от настроек сервера.
В моем случае, это сделать похоже не получиться.

Автор: vpokorp 8.8.2008, 14:16
Цитата(AriX @ 1.9.2005,  11:00)
Mal Hack
На другом форуме примерно разобрались в чем проблема: все зависит от сервера, т.е. захочет ли он отдавать часть запрошенного документа или нет. Вот например по-дефолту Апач 1.3.33 не хочет, а Апач 2.x отдает запрошенную часть :-/
А сервер, с которого мне нужно, стоит на 1.3.33.. Так что облом похоже :(

А к то подскажет - как определить - какой там Апач стоит?


Код

Заголовок 
- размер 35518, ip 123.456.789.012
HTTP/1.0 200 OK 
Date: Fri, 08 Aug 2008 11:05:37 GMT 
Server: 0W/0.8d 
Content-Type: text/html; charset=windows-1251 
Content-Length: 35518 
Last-Modified: Fri, 08 Aug 2008 11:05:37 GMT 
Expires: Thu, 09 Aug 2007 11:05:37 GMT 
pragma: no-cache 
cache-control: no-store, no-cache, must-revalidate 

Автор: AriX 8.8.2008, 15:19
vpokorp, там нет Апача. Стоит вот этот сервер - http://0w.ru/httpd/

Автор: Anarki 8.8.2008, 22:11
Если не поддерживает HTTP RANGE, то никак.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)