Forum Webscript.Ru

Программирование => PHP => Тема начата: kosm от 07 Мая 2003, 19:17:27

Название: Забрать страничку с другого сайта
Отправлено: kosm от 07 Мая 2003, 19:17:27
Народ, подскажите плиз, как забрать страничку по урлу, что-то из нее выкусить и получить свой вариант?

СПАСИБО!
Название: Забрать страничку с другого сайта
Отправлено: Меняздесьдавнонет от 07 Мая 2003, 20:06:16
Вор должен сидеть в тюрьме.
Название: Забрать страничку с другого сайта
Отправлено: Xander от 07 Мая 2003, 20:26:22
а если ты хочешь забирать новости или что-то такое, то вот:
http://spectator.ru/issues/352
Название: Забрать страничку с другого сайта
Отправлено: kosm от 08 Мая 2003, 09:56:25
Сори, если ввел в заблуждение, не написав причину :)
Никто ничего воровать не собирается, просто хочу для себя сделать "каналы" в удобоваримом виде для КПК (без всяких банеров, фреймов и т.п. - только информация). Если это криминал - тогда сорри, больше спрашивать не буду... :)
Название: Забрать страничку с другого сайта
Отправлено: semya от 08 Мая 2003, 10:27:45
http://www.php.net/file
Название: Забрать страничку с другого сайта
Отправлено: kosm от 08 Мая 2003, 11:06:15
semya
Спасибо! Начал разбираться...
А как по твоиму, лучше массивом по строчка лазить или все таки в одну переменную контент заливать а его уже разбирать?
Кстати, чем лучше выкусить потом то что надо?
Название: Забрать страничку с другого сайта
Отправлено: semya от 08 Мая 2003, 14:38:44
да все очень просто, находишь два куска кода, который ограничивает искомый текст, и выкусываешь его так:


preg_match("(ограничитель1)(.*)(ограничитель2)",implode(\'\',file(\'http://www.pupkin.ru\')),$matches);


в $matches[2] будет искомый кусок, только надо аккуратней с (.*) он может захватить больше чем положено, об этом читай в книжках по регэкспам и их максимализме, а если надо будет конкретная помощь по данному случаю, то спрашивай...
Название: Забрать страничку с другого сайта
Отправлено: kosm от 08 Мая 2003, 18:16:18
semya
Ок. Спасибо, попробую.
Название: Забрать страничку с другого сайта
Отправлено: kosm от 14 Мая 2003, 12:18:11
semya
А как через проксю или socks5 пройти? Ни fopen, ни fsockopen вроде не проходят :( Во всяком случае ошибка по таймауту...
Название: Забрать страничку с другого сайта
Отправлено: kosm от 14 Мая 2003, 14:53:10
Все, спасибо, разобрался. Цепляюсь за проксю через fsockproxy, и формирую запрос на нужный урл.
Теперь вопрос вот в чем. В ответ я получаю текст странички вместе с заголовком. Как лучше избавиться от него (заголовка)?
Пробовал так:
$z = preg_replace("/^.*/","",$k);
$k - массив-ответ на запрос

Что я не так в рег.выражении написал?

СПАСИБО!
Название: Забрать страничку с другого сайта
Отправлено: Макс от 14 Мая 2003, 15:05:15
"/^.*/s" или "/^.*/m" (точно не помню, вроде первое)
Название: Забрать страничку с другого сайта
Отправлено: FreeSpace от 14 Мая 2003, 15:53:10
Фу, зачем здесь регекспы?!
list($headers, $content) = explode("\\r\\n\\r\\n", $k)
Только обязательно забирай HTTP/1.0, а не 1.1!
Название: Забрать страничку с другого сайта
Отправлено: kosm от 14 Мая 2003, 16:01:35
FreeSpace
А по тексту странички нигде больше "\\r\\n\\r\\n" встретиться не может?

Макс
Т.е. все как у меня, только еще s или m? А что из них по умолчанию подразумевается вроде?

Вообще конечно регекспами мне все равно надо будет коцать страничку, т.к. хочу всякие банеры повырезать, фреймы и тд.
Название: Забрать страничку с другого сайта
Отправлено: FreeSpace от 14 Мая 2003, 16:07:54
Да, ступил малость...
Просто на моей практике ни разу не попадалось.
Вот так будет правильнее:
$tmp = explode("\\r\\n\\r\\n", $k);
array_shift($tmp);
$content = implode("\\r\\n\\r\\n", $tmp);
Название: Забрать страничку с другого сайта
Отправлено: kosm от 14 Мая 2003, 16:22:27
FreeSpace
Угумс, так действительно проблем не будет.
Спасибо!

Хм, а все-таки, почему мой регексп не прокатил? Просто мне теперь надо коцать сам текст странички, а там как я понимаю, без них не обойтись...
Название: Забрать страничку с другого сайта
Отправлено: AlieN от 14 Мая 2003, 17:20:40
kosm
Цитировать
:
Хм, а все-таки, почему мой регексп не прокатил?

$z = preg_replace("/^(.*)/","",$k);
В данном случае, необходимые данные будут в переменной $z а обрабатываются данные из $k
Название: Забрать страничку с другого сайта
Отправлено: kosm от 14 Мая 2003, 17:46:24
Странно, но у меня все равно с заголовок остается :( (как будто ничего и не происходило).
Название: Забрать страничку с другого сайта
Отправлено: kosm от 15 Мая 2003, 10:58:34
Ребят, ничего не понимаю, почему же у меня не хочет регексп работать, а?
Гляньте плиз (начало ответа на запрос):
Цитировать

HTTP/1.0 200 OK
Date: Thu, 15 May 2003 05:58:31 GMT
Server: Apache/1.3.12 (Unix) mod_ssl/2.6.2 OpenSSL/0.9.4 PHP/4.3.1
Cache-Control: max-age=3600
Expires: Thu, 15 May 2003 06:58:31 GMT
Content-Type: text/html
Age: 3324
X-Cache: HIT from maslan.maspeter.ru
Proxy-Connection: close



Пробую вырезать заголовок (хоть и подсказали как сделать через implode, но регеспы мне все равно надо, так хоть потренируюсь)...


$z = preg_replace("/^(.*)/"," ",$k);

В $k ответ на запрос вместе с заголовком. В $z хочу получить без заголовка. Что не так с регекспом?

Спасибо!

PS: Как вообще эта ф-ция обрабатывает этот массив $k? Построчно? Тогда как писать регесп? Или как единый текст (тогда не понятно почему не работает)? Может какие-то модификаторы надо ставить?
Название: Забрать страничку с другого сайта
Отправлено: semya от 15 Мая 2003, 11:24:02
то что я говорил по поводу максимализма коснтрукции (.*) !!!! я же говорил, чтобы почитал по этому поводу! вопрос: как ты думаешь левая угловая скобка < попадает в эту конструкцию? так когда же ей осановиться? вот она все под себя и забирает, доходит до конца строки и не находит там , т.к. все уже забрала! Эта конструкция работает по максимальному принципу, понимаешь? поэтому если теоретически тегов в заголовках не будет, то использовать тебе нужно не (.*) а ([^<]+) - тогда должно получится, но вообще если тебе надо текст страницы отделить, то можно и проще и быстрее сделать это через explode("",$k)...
Название: Забрать страничку с другого сайта
Отправлено: kosm от 15 Мая 2003, 11:37:58
semya
Sorry, но я чего-то недогоняю :( Я же в конструкции явно указываю полный тег . Почему он должен рассатривать отдельно угловую скобку? А если использовать ([^<]+), и вдруг окажется не в начале строки?
Заголовок отделить через explode - понятно (кстати, спасибо за подсказку на счет разделения по тегу , сразу недопер :)
Но мне ведь еще всю страницу надо покоцать... Т.е. грубо говоря от того что я сейчас получил, в итоге должно остаться 10-15%. И если я уж в таком простом случае не могу уже что-то откоцать, то похоже я дальше вообще усядусь в лужу ;) Слушай, а есть где-нить нармальная статейка по поводу жадности этой конструкции (.*)? Хоть может разберусь, да вопросы дальше ами отпадут...

Еще раз спасибо за помощь!
Название: Забрать страничку с другого сайта
Отправлено: trent от 15 Мая 2003, 11:48:05
$body = substr($k, -(strlen($k) - strpos($k, "\\r\\n\\r\\n", $k)));
зачем всякие извраты?
Название: Забрать страничку с другого сайта
Отправлено: kosm от 15 Мая 2003, 12:22:39
trent
Ну вот, еще один способ вырезать заголовок :) Спасибо.
Т.е. ты предлагаешь коцать страницу не средствами регекспов?
Думаешь это удобно будет?
Название: Забрать страничку с другого сайта
Отправлено: trent от 15 Мая 2003, 13:24:12
>Думаешь это удобно будет?
это будет быстрее
Название: Забрать страничку с другого сайта
Отправлено: semya от 15 Мая 2003, 13:55:09
trent
Цитировать
это будет быстрее

однозначно, никто не спорит!
но не так универсально и функционально!

kosm
про жадность максимальных операторов я вычитал в отличной книге по регэкспам издательства питер... (вот тут http://www.piter.com/book_about.phtml?id=978531800056&web_ok=no ) в инете я такого хорошего материала по регэкспам не встречал, но это уже не по этой теме форума....
насчет того, что тебе потом надо коцать все: ты всегда тащишь одну и ту же страницу или ты хочешь таскать разные порезки? в любом случае я бы выдирал отдельно все что между тайтлами, и между боди... а там уже работал более целенаправленно
Название: Забрать страничку с другого сайта
Отправлено: kosm от 15 Мая 2003, 14:08:37
Да, страничка всегда одна и таже, но инфа меняется. При чем, в ней только заголовки новостей, а надо будет еще ходить по ссылке, брать новость (каждую) и вставлять в главную ниже заголовка (или отдельной страницей, тоже оптимизированой/покоцаной). Примерно так. Как думаешь, сложная задача?

Кстати, попробовал трой регексп
$z = preg_replace("/([^<]+)/i","",$k);
Прокатил, но смысл его не понял :(
Можешь вкрадце объяснить, в чем прикол?
Название: Забрать страничку с другого сайта
Отправлено: semya от 15 Мая 2003, 15:57:12
kosm
Цитировать
Можешь вкрадце объяснить, в чем прикол?


объясню, опираясь на данные из той книги что я советую сейчас всем... дело в том, что точка в регэкспах - это любой символ, ЛЮБОЙ, а значит и < тэги тоже! и поэтому у тебя весь текст полученный через сокет ( или как там ) все попадает туда, и общего совпадения не получается, а следовательно и менять нечего preg_replace()ом... чтобы этого не происходило (это ведь на самом деле правильно, так и работают регэкспы) пишем, что нам нужно любое количество символов, которые не являются открывающим тэгом (за это отвечает плюс и контрукция выбора [^<] = не левый тэг), регэксп ищет любой символ который не является левым тэгом, находит, видит плюс, знает что надо искать еще, еще находит, а птом находит этот тэг, что ему остается? перейти к следующей контрукции... а это он его находит... получается обшее совпадение, вот он его и меняет...

Цитировать
сложная задача?

абсолютно нет, но придется следить за тем, чтобы синтаксис на странице не поменялся...
Название: Забрать страничку с другого сайта
Отправлено: rembo от 16 Мая 2003, 08:32:11
Не в тему конечно, но все же. Разве не бывает для KПК специальных бовзеров? Че нить типа Lynx например?
Название: Забрать страничку с другого сайта
Отправлено: FreeSpace от 16 Мая 2003, 09:23:44
rembo
Под WinCE есть (почти) полноценный IE :)
Или тебе нужен именно текстовый?
Название: Забрать страничку с другого сайта
Отправлено: semya от 16 Мая 2003, 09:48:42
rembo
согласен абсолютно не в тему!!!
Название: Забрать страничку с другого сайта
Отправлено: kosm от 16 Мая 2003, 11:05:09
rembo
Раз вопрос не в тему был вроде как ко мне, то все-таки отвечу (разок) :)
Браузер есть конечно, но есть такое понятие как канал (оффлайн новости, оптимизированные для КПКашного браузера IE или iSilo). Просто загонять сайт в КПК и смотреть через IE или iSilo не интересно потому, что как понимаешь у КПК экран не такой большой и всякие банеры, фреймы и тп просто не дают нормально просматривать контент. Поэтому я хочу парочку сайтов с новостями под себя заточить...

semya
Спасибо за пояснения.Конечно с трудом до меня доходит почему не работает конструкция .* :) Т.е. получается при таком выражении парсер просто берет весь текст (сразу), не пробегая по нему? Получается так? Потому как ты пишешь конструкция [^<]+ заставляет бежать по тексту в поисках < с начала текста, а потом уже берет следующее вхождение . Я прально тебя понял?

Сорри, если туплю, просто разобраться хочу, чтобы дальше двигаться.

PS: Книжку твою уже заказал, на следующей неделе должны подвезти...

PPS: Кстати, случаем не встречал какой-нить утилитки для отладки регекспов?

СПАСИБО!
Название: Забрать страничку с другого сайта
Отправлено: semya от 16 Мая 2003, 12:05:59
Цитировать
Кстати, случаем не встречал какой-нить утилитки для отладки регекспов?

неа, а было бы интересно! найдешь кидай ссылку, или мож кто подскажет. Я думаю, что насчет жадности максимальных операторов регэкспов тебе книжка подскажет намного больше. Кстати после ее прочтения, начал намного активнее юзать регэкспы, т.к. стал их наконец нормально понимать и без них сейчас просто никуда...
Название: Забрать страничку с другого сайта
Отправлено: kosm от 16 Мая 2003, 12:21:24
semya
Ok
Название: Забрать страничку с другого сайта
Отправлено: kosm от 16 Мая 2003, 13:01:46
semya
Разобрался, почему у меня все-таки не кушался .*
Все дело было в модификаторе /s, который разрешает точке соответствовать \\n
/^.*/is  теперь правильно захватывает заголовок.

Нашел утилитку для отладки регекспов. Вернее она у меня была, просто вспомнил про нее. Куда закинуть?

PS: Кстати, средства отладки есть в перловых редакторах Komodo и OptiPerl, но там они как-то глючно работают.
Название: Забрать страничку с другого сайта
Отправлено: kosm от 16 Мая 2003, 15:59:02
Интересно. Теперь дальше застрял. Я вытянул только титульную страницу, т.е. оглавление с ссылками на сами новостные странички. Как мне теперь их обрабатывать? Каждую страничку по ссылке тоже нужно коцать. Какая методика тут?
Название: Забрать страничку с другого сайта
Отправлено: kosm от 16 Мая 2003, 17:33:34
Народ, ну подскажите с какой стороны подступиться, а?
Т.е. ссылки все я из странички выберу, а что с ними дальше делать?
1. Пройтись по каждой и содержимое каждой добавлять ниже (расставляя метки), а ссылку менять на метку? Получится наверно громоздко и долго грузиться... И получится ли вообще.
2. Изенить ссылки таким образом, чтобы они шли не прямо на страничку, а через ф-цию, которая коцает?

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

semya, ты куда пропал? Нужна твоя помощь... Плиззз :)

Спасибо!
Название: Забрать страничку с другого сайта
Отправлено: semya от 16 Мая 2003, 18:47:04
а есть ли тебе смысл выбирать сначала весь список, а потом ходить по новостям, ты посмотри более подробно на ссылку, мож там что-то типа news.php?id=news_id и тебе только достаточно смотреть какую новость ты еще не выбирал и забирать ее не мучаюясь с оглавлением? а иначе конечно придется ходить по каждой новости и забирать ее, и я уверен, что там глобальным поиском по тексту страницы с помощью preg_match_all() можно одним запросом выбрать все новости... кидай в приват или по асе адрес и что надо выбрать, я тебе скрипт накатаю, но тока завтра...

П.С. - ты вроде обещался утилитку для регэкспов... я тебе мыло в персональные сообщения кинул...