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

Форум PHP

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

 

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

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

тема: Точный граббер страницы.
 
 автор: slonik   (19.10.2006 в 17:08)   письмо автору
 
 

Привет. Вот искал-искал нормальный граббер, так и не нашёл..везде какие-то недочёты. Кто может помочь или советами, или ссылками, или ещё чем по этому поводу?

Задача такая:
Есть сайт(страница). Нужно вытаскивать инфу с этой страницы. Только досканально точно, вполоть до <tr> и т.д.. Также нужно делать исключения, тоесть если трудно досканально вырезать текст, то запретить скриптом какие-то опеределённые элементы, т.к. в тесте часто встречаются и картинки и флешки и просто лишние таблицы. Также желательно запрограммировать скрипт на определённый период, с которым он будет сканировать страницу. Также нужно чтобы он её сохранял, это для того, чтобы не было нагрузки на сервак, при каждом запрсе скрипта, т.к. сканирование ресурса нужно всего раз-два в неделю..

Заранее всем благодарен, надеюсь на помощь и советы.

   
 
 автор: xexe   (19.10.2006 в 17:15)   письмо автору
 
   для: slonik   (19.10.2006 в 17:08)
 

А у тебя какие идеи? Наброски? Или ты хочешь сразу готовый скрипт? Для каждого сайта нужен свой граббер.

   
 
 автор: slonik   (19.10.2006 в 17:19)   письмо автору
 
   для: xexe   (19.10.2006 в 17:15)
 

Наброски я нашёл в инете:) Собирать велосипед в данном случае глупо.. а вот усовершенствовать велик уже можно:

<?php 
// начало 
$link "http://netadmin.ws"
$file = @fopen($link"r"); 
if (
$file) { $rf fread($file200000); fclose($file); } else { echo "<h3 align=center>Извините, 
запрошенная страница временно не доступна!</h3>"
; } 

// 1 
$rf trim (chop ($rf)); 
$s strpos($rf"mesto dlya nachala perehvata"0); 
$rf substr($rf$s); 

// 2 
$s strpos($rf"mesto dlya konca perehvata"); 
$rf substr($rf0$s); 

// 3 
$rf str_replace ("/forum/","http://netadmin.ws/forum/"$rf); 
$rf str_replace ("/admin/","http://netadmin.ws/admin/"$rf); 
$rf str_replace ("ACTION=/member/quick","ACTION=http://netadmin.ws/member/quick"$rf); 

// 4 
echo $rf
?>


Этот скрипт работает, но он вбирает в себя слишком много лишнего, а как запретить чё-то не могу допереть..
По поводу "для каждого сайта, свой граббер" - это понятно.. вот мне и хочется хорошую основу, а дальше уж постараюсь разобраться.

p.s. О готовом скрипте и не мечтал, т.к. людская скупость неповержима.

   
 
 автор: sav   (19.10.2006 в 17:56)   письмо автору
 
   для: slonik   (19.10.2006 в 17:19)
 

можно использовать функцию explode() например:


<?
$file 
file_get_contents('http://netadmin.ws');
$a explode('mesto dlya nachala perehvata',$file);
$b explode('mesto dlya konca perehvata'$a[1]);
print 
$b[0];
?>

   
 
 автор: kasmanaft   (19.10.2006 в 18:06)   письмо автору
 
   для: slonik   (19.10.2006 в 17:19)
 

Вряд ли этот скрипт работает правильно .. так как в substr вторым параметром передается не "координата" конца, а длина возвращаемой строки

* * *
$rf = substr($rf, $s); 
* * *
$s = strpos($rf, "mesto dlya konca perehvata"); 
$rf = substr($rf, 0, $s); 

пс: вместо этого лучше велосипед изобрести :)

   
 
 автор: slonik   (20.10.2006 в 20:52)   письмо автору
 
   для: kasmanaft   (19.10.2006 в 18:06)
 

Так, сорри, что так долго не писал, всё никак не мог попасть к компу.

Вот взяли этот код:

<? 
$file 
file_get_contents('http://netadmin.ws'); 
$a explode('mesto dlya nachala perehvata',$file); 
$b explode('mesto dlya konca perehvata'$a[1]); 
print 
$b[0]; 
?>


Работает. Но как я и говорил, мне нужно очень точно вырезать и иметь возможность запрещать некоторые элементы страницы. Прямо явно указывая этот элемент. Как это можно сделать?

   
 
 автор: kasmanaft   (20.10.2006 в 21:43)   письмо автору
 
   для: slonik   (20.10.2006 в 20:52)
 

Что значит "запрещать некоторые элементы страницы" ?
Вырезать этот элемент или как?

   
 
 автор: slonik   (20.10.2006 в 21:46)   письмо автору
 
   для: kasmanaft   (20.10.2006 в 21:43)
 

Ну да. Вот есть там картинка, нужно её исключить из кода, чтобы она не отображалась. Только сложность в том, что адреса у картинок разные и их много, есть какой-нибудь способ не обращать внимание на названия файлов(картинок)?

   
 
 автор: kasmanaft   (20.10.2006 в 21:57)   письмо автору
 
   для: slonik   (20.10.2006 в 21:46)
 

Что значит "не обращать внимание на названия файлов(картинок)" ? =)) :))

Эти теги можно будет просто вырезать из текста ...


<?php
$text 
'Ну да. Вот есть там картинка <img src=blablabla>, нужно её '.
              
'исключить из кода, чтобы она не отображалась.';
echo 
preg_replace("#<img[^>]*?>#"""$text);
?>


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

   
 
 автор: slonik   (20.10.2006 в 22:26)   письмо автору
 
   для: kasmanaft   (20.10.2006 в 21:57)
 

Во, пасиб! Получилось.
А каким образом сохранить созданный файл на диске? Или будет вообще идеально, если можно будет записать данные в бд.

p.s. А где можно посмотреть, как создавать такие вещи - "#<img[^>]*?>#" А то там ещё много-чего надо вырезать, а могзгов не хватает допереть, как составить запрос.

   
 
 автор: kasmanaft   (20.10.2006 в 23:04)   письмо автору
 
   для: slonik   (20.10.2006 в 22:26)
 

Можно в файл записать, можно в БД:


<?
// файл
$text 'text';
$file fopen ('filename''w');
fputs ($file$text);
fclose ($file);

// БД
if (!get_magic_quotes_gpc()) 

  
$text mysql_escape_string($text);

mysql_query ("INSERT INTO table VALUES ( * * * , '$text', * * *)");
?>


а про рег. выражения почитать можно здесь:
http://www.php.net/manual/ru/reference.pcre.pattern.syntax.php

   
 
 автор: slonik   (20.10.2006 в 23:17)   письмо автору
 
   для: kasmanaft   (20.10.2006 в 23:04)
 

Спасибо, ща буду разбираться.

   
Rambler's Top100
вверх

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