Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Парсер, 30 секунд и виртуальный хостинг


Автор: Andrey_Skif 21.8.2012, 00:53
Вопрос прозвучит банально - как написать парсер?

Но прежде, чем закидаете меня тапками, поясню, о чём конкретно хочу спросить.

Однажды решил написать скриптик. Как водится, после десятка переписываний всего с нуля успел забыть, чего изначально то хотел. Единственное, что в концепции не изменилось - это есть парсер. Естественно, погуглил, что да как. Радостно вооружился DomDocument и DOMXPath. Распарсил страничку, содержащую два десятка ссылок на нужные мне страницы... Дальше, надеюсь, вы поняли - 30 секунд и привет. Что по этому поводу говорит гугл? Что-то типа set_time_limit(), php.ini или fork(). Однако мой виртуальный хостер на такие извраты выдавал что-то ошибочное, однотипное и про соображения безопасности.

От нехватки знаний и опыта по уму сделать не удалось. В ход пошла фантазия. Сейчас сие чудо велосипедостроения выглядит так. Парсится страничка со ссылками, они вносятся в БД с пометкой "не обработано". А в конце функции file_get_contents() скармливается адресок нашего же скрипта :facepalm
И вот так пока все страницы не распарсим. Сам понимаю, что бредово. Но в 15-ти минутный тур по целевым страницам это безобразие ходит даже без ошибок.

И вот собственно вопрос. Как в принципе пишутся парсеры? Интересуют именно организационные вопросы. Понятно, что всё зависит от конкретной задачи. Но хотелось бы услышать тех, кто сталкивался с реалиями. А то по запросу про парсеры гугл выдает только статьи про регулярки

Автор: krypt3r 21.8.2012, 05:57
А в чем сакральный смысл запуска парсеров из браузера, да еще на каком-то хостинге? Ставьте PHP себе, пишите парсер, запускайте его из консоли:
Код

$ php parser.php

Автор: MoLeX 21.8.2012, 06:26
Цитата(Andrey_Skif @  21.8.2012,  00:53 Найти цитируемый пост)
От нехватки знаний и опыта по уму сделать не удалось. В ход пошла фантазия. Сейчас сие чудо велосипедостроения выглядит так. Парсится страничка со ссылками, они вносятся в БД с пометкой "не обработано". А в конце функции file_get_contents() скармливается адресок нашего же скрипта :facepalm
И вот так пока все страницы не распарсим. Сам понимаю, что бредово. Но в 15-ти минутный тур по целевым страницам это безобразие ходит даже без ошибок.


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

Автор: Andrey_Skif 21.8.2012, 18:50
Цитата(krypt3r @ 21.8.2012,  05:57)
А в чем сакральный смысл запуска парсеров из браузера, да еще на каком-то хостинге? Ставьте PHP себе, пишите парсер, запускайте его из консоли:
Код

$ php parser.php

Изначальный сакральный смысл был вот в чем. Есть такой "замечательный" сайт как trudvsem.ru, на котором нет ни внятных разделов, ни обновления вакансий, ни api. А есть только поисковая строка. Да ещё и ссылки на вакансии динамические и меняются раз в несколько минут. Однажды зайдя на этот сайт захотел чуток облегчить себе жизнь. Мне не нужен полный список их вакансий. Мне всего-лишь нужны обновления по интересющим лично меня вакансиям. Т.е. по заходу на свою страничку я вижу небольшой список обновлений, а не поисковую строку, предлагающую мне всё сделать руками.

Кстати, запуск производится не из браузера, а по расписанию, через cron (вот это ещё не доделано, но идея именно такая)

Автор: Andrey_Skif 21.8.2012, 19:16
Цитата(MoLeX @ 21.8.2012,  06:26)
Вообще на вирт хостинге лучше не экспериментировать с тайм лиимтом, а делать отложенные задания.

Была такая мысль. Если честно, не доразобрался. Крон задачами, вообще, можно через php-скрипты управлять? Время запуска, к примеру изменить?

krypt3r, запуск из консоли логичен, но зачем тогда php? Мне c# чуток ближе, на нем ровно то же самое можно сделать, не парясь над ограничениями. Хотелось бы получать обновления периодически и не обязательно дома (с телефона, например).

И ещё такой подвопрос. Пока читал про распараллеливание процессов (потоков?), наткнулся на применение веб-соккетов в php. Если опустить момент с виртуальным хостом, то имеет ли смысл их использовать при написании парсера, или это совсем другая история?

Автор: Sun_ok 21.8.2012, 20:24
Есть еще такая вещь:
exec('php script.php > /dev/null &');
Скрипт запускается и не ждет ответа, таким образом таймаута не будет.
Но есть вероятность, что  у хоста залочен exec.

Автор: krypt3r 22.8.2012, 06:23
Цитата
krypt3r, запуск из консоли логичен, но зачем тогда php?

Название раздела форума, где вы разместили тему, подскажет ответ ;) Консольный парсер вы можете писать на каком угодно вам языке, хоть на ассемблере.
Цитата
И ещё такой подвопрос. Пока читал про распараллеливание процессов (потоков?), наткнулся на применение веб-соккетов в php. Если опустить момент с виртуальным хостом, то имеет ли смысл их использовать при написании парсера, или это совсем другая история? 

Вопрос странный. Любое сетевое приложение, в том числе парсеры (кроме локальных), работают на сокетах в любом случае. В PHP для получения контента страницы чаще всего используется CURL

Автор: Andrey_Skif 22.8.2012, 23:10
Цитата
Название раздела форума, где вы разместили тему, подскажет ответ ;)

Ага, мой косяк.

Цитата

Вопрос странный. Любое сетевое приложение, в том числе парсеры (кроме локальных), работают на сокетах в любом случае. В PHP для получения контента страницы чаще всего используется CURL

На счет соккетов имел в виду вот это

http://www.ibm.com/developerworks/ru/library/os-php-multitask/

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